我说的拍手游戏是指这个小时候的游戏:AB用手势表示装弹、防卫和开枪,每拍两次手给出手势,胜出的条件是开枪时对方在装弹或者先装满五颗子弹。用(+)(=)(―)表示装弹、防卫、开枪,有(―)<(=)<(+)<(―),类似于剪刀石头布。我用程序试验在很简单的条件下游戏的胜负情况。
网上介绍的规则要复杂得多,还有人在上大学前用 C# 实现过局域网对战版本。程序似乎难以模拟这类猜拳游戏的同步场景。这个游戏也可以实现为其他场景。比如,房间里有钱币,AB每一次或者不进入房间,或者进入房间偷走一个钱币,或者进入房间放回一个钱币。先偷走M个钱币的胜出,或者进入房间放回钱币而(看见)对方偷走钱币时胜出。假设:
- 双方设定在当前双方装弹数目为ab时,自己出某个手势的概率,保存在TABLE_A/B。
- TABLE_B中(+)(=)(-)的概率都设为p、r、q。例外:b=0时,不允许(-),q≡0,r≡1-p;a=0时,没有必要(=),r≡0,q≡1-p。
- TABLE_A通过置换TABLE_B对应单元中(+)(=)(-)的概率得到。我希望A胜的概率PA总大于1/2。
在b=0或a=0时,合理的置换只有一个,如下图所示。但a+b=0时,双方P(+)≡1。
按照(―)<(=)<(+)<(―),a>0,b>0时的置换如下图所示。