-1

假设我有一个包含纸牌游戏数据的 GameServer 对象。4 个客户端将使用 Java RMI 访问该对象的功能/数据,并且每个客户端都将轮流修改游戏状态。在每个玩家移动之后,其他玩家应该能够检查 Game 对象的新状态。作为纸牌游戏,他们也必须遵循一定的顺序,即在特定时间谁应该玩。

我的第一个猜测是使用 ReentrantLock + Condition 来实现,但我不知道如何手动分配哪个玩家应该在前一个释放它之后获取锁。

有人可以帮我吗?

4

2 回答 2

-1

在服务器上,您有某种游戏状态,每个玩家只能在轮到她时修改。我们称之为状态变量gs;它是什么类型并不重要。

处理有序行为的最实用的方法是让gs类有一个字段来表示轮到谁了 ( int nextPlayer)。您的服务器 RMI 方法接受来自玩家的轮到我的命令将检查该nextPlayer字段并确保轮到发送玩家,如果不是(可能IllegalStateException)返回错误。RMI take-my-turn 方法和读取方法应该是synchronized(gs),因为您需要确保游戏状态自动更新(包括下一个轮到谁),并且您不会与四个玩家有太多争用。

于 2013-09-02T17:18:53.060 回答
-2

信号量列表,每个线程一个?

每个线程/播放器在列表中等待自己的信号量。当它得到一个单元时,它“播放”,然后发出下一个线程/播放器的信号量并循环以再次等待它自己的信号量。如果玩家弃牌或其他任何情况,它的线程可以安全地将自己从列表中删除,然后再将单位扔回信号灯中。

在启动时,将一个单位扔给第一个要交易的玩家/无论如何。

这在一个设计中解决了互斥和播放顺序。

它会起作用的。

这不是乱七八糟的。

于 2013-09-02T19:20:38.187 回答