65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.03/5 (27投票s)

2005年1月10日

4分钟阅读

viewsIcon

73117

downloadIcon

1464

一篇关于网络游戏编程的文章。

Sample Image - EaterGameII.jpg

引言

对许多人来说,在家或在工作场所连接多台计算机的主要原因之一是为了玩游戏。无论是与朋友和家人一起玩,还是对抗他们,都有许多游戏都已支持网络功能,它们比单人离线计算机游戏提供了更多样的游戏体验。为了增加这些游戏的竞争性,还有一些游戏支持跨平台网络连接,允许 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”类。完成后,双方玩家开始在网络上玩游戏。吃掉最多石子的玩家获胜。

Sample Image - Eater2_UML.gif

这个项目最重要的部分是为通信建模类,并将它们的实例集成到游戏中。当按下某个键时调用的方法的详细代码如下。在此方法中,按下的特定键的值通过“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# 编写的 简单的贪吃蛇游戏

© . All rights reserved.