基于网络的网络多人吞噬游戏






4.03/5 (27投票s)
2005年1月10日
4分钟阅读

73117

1464
一篇关于网络游戏编程的文章。
引言
对许多人来说,在家或在工作场所连接多台计算机的主要原因之一是为了玩游戏。无论是与朋友和家人一起玩,还是对抗他们,都有许多游戏都已支持网络功能,它们比单人离线计算机游戏提供了更多样的游戏体验。为了增加这些游戏的竞争性,还有一些游戏支持跨平台网络连接,允许 Mac 和 PC 用户尝试一决高下。
网络游戏(本地和基于网络的)是家用计算机网络的流行应用。网络游戏(在局域网 LAN 上)和互联网游戏(通过互联网)包括棋盘游戏、纸牌游戏、角色扮演游戏以及其他多人游戏或人机对战游戏环境。在这个项目中,我们从一个名为“贪吃蛇游戏”的单人单机游戏开发了一个多人网络游戏。使用的开发框架是 Microsoft .NET,编程语言是 C#。使用的通信模型是客户端/服务器模型。
背景
在宏观上来看,计算机游戏是一项相对较新的创新。它们以不同的形式存在了很久,从计算机诞生之初到现在,在很多方面,它们都促使计算机成为我们日常生活的一部分。
广义上,游戏可以分为五大类:棋盘游戏、纸牌游戏、体育游戏、儿童游戏和电脑游戏。电脑游戏可以在五种类型的计算机上玩:用于街机的高价专用机器、廉价专用机器(“掌机”)、多程序家用游戏机,如 ATARI 2600 和 ATARI 5200 的机器、个人计算机和大型主机。在大多数这些游戏中,计算机充当对手和裁判;在其中许多游戏中,它还提供动画图形。最常见的计算机游戏形式是强调手眼协调能力的技能和动作(“S&A”)游戏。这些 S&A 游戏通常带有暴力色彩。计算机游戏还有许多其他领域:冒险游戏、奇幻角色扮演游戏和战争游戏。在我们粗略的概述中,这些其他计算机游戏因技能和动作游戏的巨大数量而被黯然失色。计算机游戏主要由五个基本元素组成。它们是图形、声音、界面、游戏玩法和故事。
贪吃蛇游戏
贪吃蛇游戏是一款用 C# 编写的简单游戏。在这个游戏中,用户在一个窗体上移动一个类似吃豆人的角色,吃掉红点。目标是以最快的时间吃掉所有点。游戏结束时,吃掉最多石子(点)的玩家获胜。
实现涉及将原始的贪吃蛇游戏修改为两人网络游戏。修改后的贪吃蛇游戏的 UML 图如下所示。添加了三个新类:“GAMESETUP”、“HOST”和“REPLY”。“FORM”类被修改为根据玩家的选择充当客户端和服务器。多线程被用于使扫描键盘的方法独立运行,而不干扰游戏的任何其他进程。“HOST”和“REPLY”类是基于 TCP/IP 通信模型设计的,即作为面向连接的模型。“GAMESETUP”类在游戏启动时被调用。如果玩家选择以主机身份开始游戏,则“FORM”以服务器模式启动,并一直等待其他玩家启动。第二个玩家启动游戏,并从“GAMESETUP”窗体中选择加入为客户端。这将以客户端模式启动“FORM”类。完成后,双方玩家开始在网络上玩游戏。吃掉最多石子的玩家获胜。
这个项目最重要的部分是为通信建模类,并将它们的实例集成到游戏中。当按下某个键时调用的方法的详细代码如下。在此方法中,按下的特定键的值通过“host.sendObject(1,result)
”传递给远程玩家。这用于更新远程玩家屏幕上的吃豆人位置。
private void Form_Server_KeyDown(object sender,
System.Windows.Forms.KeyEventArgs e)
{
string result = e.KeyData.ToString();
Invalidate(TheEater.GetFrame());
switch (result)
{
case "Left":
host.sendObject(1,result);
TheEater.MoveLeft(ClientRectangle);
Invalidate(TheEater.GetFrame());
break;
case "Right":
host.sendObject(1,result);
TheEater.MoveRight(ClientRectangle);
Invalidate(TheEater.GetFrame());
break;
case "Up":
host.sendObject(1,result);
TheEater.MoveUp(ClientRectangle);
Invalidate(TheEater.GetFrame());
break;
case "Down":
host.sendObject(1,result);
TheEater.MoveDown(ClientRectangle);
Invalidate(TheEater.GetFrame());
break;
default:
break;
}
int hit = CheckIntersection();
if (hit != -1)
{
TheScore1.Increment();
Invalidate(TheScore1.GetFrame());
Invalidate(((Stone)Stones[hit]).GetFrame());
Stones.RemoveAt(hit);
if (Stones.Count == 0)
{
MessageBox.Show("PLAYER 1 WINS!");
Application.Exit();
}
}
}
“listenToCLient
”方法会一直监听远程玩家的移动,如下所示。此方法获取远程端玩家移动的结果,并将其传递给一个用于更新本地玩家屏幕的方法。
public void listenToClient()
{
MessageBox.Show("ready to accept connections from the clients");
while (true)
{
if (host == null)
{
return;
}
if (host != null)
{
string move = (string) host.c.getObject(1);
if (move != null)
{
doClientMove(move);
}
}
}
这个游戏是完全可用且功能齐全的。然而,还有很多改进的空间。该游戏现在只支持两个玩家,可以修改以支持更多玩家。石子数量可以由用户定义,并且它们的位置可以是随机的。对于任何未来的开发者来说,这已经足够多的工作了。
致谢
这个项目是我完成 ICS 571(客户端-服务器编程)课程的成果,也是对我课程教授 Dr. Nasir Darwish 的致敬。
这个游戏改编自 Mike Gold 于 2001 年 7 月用 C# 编写的 简单的贪吃蛇游戏。