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