2

这是一个学校项目,请不要提供任何代码,我只是在寻找指导我正确方向的提示。

编写并测试客户端订阅的游戏服务器。订阅后,客户端会收到当前正在玩的游戏列表(相同的游戏,只是它的不同“实例”)。客户然后可以选择加入游戏或开始新游戏。一场比赛在实际开始之前必须至少有两名玩家。系统必须支持多个客户端都玩一个游戏,或者多个客户端玩多个游戏。

该项目的目标是获得 Java、TCP 和线程方面的经验。

我当前的设计和实现有 2 个文件:server.java 和 client.java

  1. 服务器文件有 3 个类:Server、Lobby 和 Game
  2. 客户端文件有 1 个类:Client。

“游戏”的实现是微不足道的,我对此很好。

目前,服务器类与客户端类建立 TCP 连接。每次实例化客户端时,服务器类都会接受套接字,然后程序继续运行。

继续,服务器类创建大厅类。

大厅课是我遇到麻烦的地方。默认情况下,我正在创建 1 个“游戏”对象,并传入 clientSocket:

game g = new game(clientSocket, playerID);                 
g.start();

游戏类扩展了线程,我认为这是正确的做法。每个“游戏”都会是一个单独的线程,可以这么说,所以玩家 A 和 B 可以共享一个线程,玩家 C 和 D 可以使用另一个线程开始新游戏。

我是线程新手,但这是我能想到的最好的实现。我排除了大厅的多个线程,因为这没有任何意义,而且客户端的多个线程也毫无意义,所以我认为多线程游戏类是理想的。

现在,当我创建 2 个客户端实例时,它们都加入了同一个“线程”(它们都在同一个游戏中并且可以相互交谈)。

我应该怎么做,一个新玩家可以在大厅里输入“new”或其他任何东西,然后创建一个新的“游戏”,它是一个新线程。

我确定我误解了有关线程或诸如此类的某些部分,但我感谢任何帮助。

4

2 回答 2

1

我不会将游戏映射到线程。相反,将客户端映射到线程。每个客户端都有自己的线程,该线程通过接收来自该客户端的命令启动工作。当您需要创建新游戏时,只需在共享的游戏集合中创建一个新对象即可。在客户端实例中跟踪与哪个游戏(如果有)相关联。

如果你发现你确实需要一个线程来管理游戏,那么你可以创建一个。当客户端向特定游戏发送命令时,只需将该命令放在由管理该游戏的线程读取的命令队列中。游戏线程只需要知道它正在管理哪个游戏。当游戏结束时,它可以自行终止。

于 2013-02-09T01:53:13.547 回答
0

首先,我建议您阅读 Java 中的多人游戏开发和网络(UDP/TCP)。我不是游戏开发者,只是碰巧在大学学习了 Java 网络课程,并且有一个类似的项目(网络游戏)。

其次,处理多线程与复杂度成正比。您希望最小化复杂性。我建议放弃“我必须找到使用线程的地方”的心态。(不要在圆孔中强行使用方钉;))

继续,按照要求:

编写并测试客户端订阅的游戏服务器。

IIRC,这相当简单(你可能已经过了这部分)。

订阅后,客户端会收到当前正在玩的游戏列表(相同的游戏,只是它的不同“实例”)

这也应该相当简单,因为服务器和客户端之间的 TCP 连接已经建立。

但是,此时有几件事需要理解。也许最重要的是,将有一个中央服务器来保存所有连接的客户端和现有游戏的信息。因此,这意味着它必须是处理系统状态(例如跟踪当前存在的游戏室)、客户端请求(创建/加入游戏室)以及使用系统状态的相关信息更新客户端(例如创建/关闭游戏室)。

此时的另一个考虑因素是系统中客户端功能的范围。典型的实现可能是胖服务器、瘦客户端架构。基本上,这意味着客户端不会真正处理数据(来自用户输入),而是依赖于服务器。大多数时候,客户端只等待用户的输入或服务器的响应。另一方面,服务器处理来自客户端的数据,更新系统状态(包括单个游戏状态),并通知相关客户端系统/游戏状态的相关变化。

然后,客户可以选择加入游戏或开始新游戏

这里实际发生的是客户端向服务器发送数据“我选择加入游戏”或“我选择创建游戏”。服务器对此采取行动并通知相关客户端(我说的是关注而不是全部,因为某些客户端可能正在玩并且不需要知道是否已经产生了新游戏)。

一场比赛在实际开始之前必须至少有两名玩家。

-

系统必须支持多个客户端都玩一个游戏,或者多个客户端玩多个游戏。

再次取决于客户端-服务器架构,服务器将执行所有处理(fat-server、thin-client)或客户端(thin-server、fat-client)执行处理,而服务器主要用作中继指向其他客户。然而,我对此没有明确的(甚至是自信的)建议,因为我只是对可能的实现数量及其后果感到不知所措。因此,我真的不能鼓励阅读更多关于网络和游戏开发的内容。单独来看,这两个主题非常庞大,结合起来会更多。

最后,关于线程的使用。IIRC,为打开的套接字分派单独的线程对于防止应用程序被阻塞等待输入很有用。我不太同意您在线程中“主持”游戏的想法,但由于您在学校,我只能欣赏您的尝试。

这可能会进一步帮助您:课程:所有关于套接字。您可能还对UDP感兴趣。

于 2013-02-09T05:24:05.850 回答