假设我有一个包含纸牌游戏数据的 GameServer 对象。4 个客户端将使用 Java RMI 访问该对象的功能/数据,并且每个客户端都将轮流修改游戏状态。在每个玩家移动之后,其他玩家应该能够检查 Game 对象的新状态。作为纸牌游戏,他们也必须遵循一定的顺序,即在特定时间谁应该玩。
我的第一个猜测是使用 ReentrantLock + Condition 来实现,但我不知道如何手动分配哪个玩家应该在前一个释放它之后获取锁。
有人可以帮我吗?
假设我有一个包含纸牌游戏数据的 GameServer 对象。4 个客户端将使用 Java RMI 访问该对象的功能/数据,并且每个客户端都将轮流修改游戏状态。在每个玩家移动之后,其他玩家应该能够检查 Game 对象的新状态。作为纸牌游戏,他们也必须遵循一定的顺序,即在特定时间谁应该玩。
我的第一个猜测是使用 ReentrantLock + Condition 来实现,但我不知道如何手动分配哪个玩家应该在前一个释放它之后获取锁。
有人可以帮我吗?
在服务器上,您有某种游戏状态,每个玩家只能在轮到她时修改。我们称之为状态变量gs
;它是什么类型并不重要。
处理有序行为的最实用的方法是让gs
类有一个字段来表示轮到谁了 ( int nextPlayer
)。您的服务器 RMI 方法接受来自玩家的轮到我的命令将检查该nextPlayer
字段并确保轮到发送玩家,如果不是(可能IllegalStateException
)返回错误。RMI take-my-turn 方法和读取方法应该是synchronized(gs)
,因为您需要确保游戏状态自动更新(包括下一个轮到谁),并且您不会与四个玩家有太多争用。
信号量列表,每个线程一个?
每个线程/播放器在列表中等待自己的信号量。当它得到一个单元时,它“播放”,然后发出下一个线程/播放器的信号量并循环以再次等待它自己的信号量。如果玩家弃牌或其他任何情况,它的线程可以安全地将自己从列表中删除,然后再将单位扔回信号灯中。
在启动时,将一个单位扔给第一个要交易的玩家/无论如何。
这在一个设计中解决了互斥和播放顺序。
它会起作用的。
这不是乱七八糟的。