剪刀石头布。使用数学确定赢/输/平?

Posted

技术标签:

【中文标题】剪刀石头布。使用数学确定赢/输/平?【英文标题】:Rock, Paper, Scissors. Determine win/loss/tie using math? 【发布时间】:2012-07-07 19:01:45 【问题描述】:

所以我在写这个函数的时候正在写一个石头剪刀布游戏:

a 是玩家一手,b 是玩家二手。我只需要弄清楚一号选手是赢、输还是平局。

//rock=0, paper=1, scissors=2
processMove(a, b) 
    if(a == b) ties++;
    else 
             if(a==0 && b==2) wins++;
        else if(a==0 && b==1) losses++;
        else if(a==1 && b==2) losses++;
        else if(a==1 && b==0) wins++;
        else if(a==2 && b==1) wins++;
        else if(a==2 && b==0) losses++;
    

我的问题是:这个函数最优雅的写法是什么?

编辑:我正在寻找单线。

【问题讨论】:

寻找可读的正确代码比寻找单行代码要好得多。 看看我对类似问题的回答:***.com/a/9553712/1207152 【参考方案1】:
if (a == b) ties++;
else if ((a - b) % 3 == 1) wins++;
else losses++;

我需要确切知道您使用的是哪种语言才能将其变成严格的单行...

对于 javascript(或其他具有奇怪模数的语言)使用:

if (a == b) ties++;
else if ((a - b + 3) % 3 == 1) wins++;
else losses++;

【讨论】:

石头 vs 剪刀不行:(0 - 2 % 3) = -2。使用javascript 看起来它缺少一对括号:((a-b) % 3 == 1)。在 C 运算符中,取模的运算顺序高于减法。【参考方案2】:

我想 3x3 矩阵会“更优雅”。

char result = "TWLLTWWLT".charAt(a * 3 + b);

(已编辑:忘记了 ab 已经是零原点了。)

【讨论】:

【参考方案3】:

我想你可以像这样使用三元运算符 -

if (b==0) a==1? wins++ : loss++;

if (b==1) a==1? loss++ : wins++;

if (b==2) a==1? loss++ : wins++;

【讨论】:

【参考方案4】:

你可以用一个简单的数学公式来得到结果,然后像这样与if进行比较:

var moves = 
  'rock': 0, 
  'paper': 1,
  'scissors': 2
;
var result = 
  'wins': 0,
  'losses': 0,
  'ties': 0
;
var processMove = function (a, b) 
  var processResult = (3 + b - a) % 3;
  if (!processResult) 
    ++result['ties'];
   else if(1 == processResult) 
    ++result['losses'];
   else 
    ++result['wins'];
  
  return result;
;

jsFiddle Demo


一行processMove函数不返回:

var processMove = function (a, b) 
  ((3 + b - a) % 3) ? 1 == ((3 + b - a) % 3) ? ++result.losses : ++result.wins : ++result.ties;
;

【讨论】:

【参考方案5】:

你是如何在java中做到这一点的?

结果 = (comp - x ) % 3 ;

System.out.println (result);
 if (result == 0 )// if the game is tie
 
     System.out.println ("A Tie!") ;
 

 else if (result == 1 || result == 2 )
 
    //System.out.println (user + " " +   "beats" + " " + computer_choice + " you win" );
     System.out.println ("comp win");
 

 else
 
     System.out.println ("you win");
    //System.out.println (computer_choice  + " " +  "beats" + " " + user + "you lose");
 

【讨论】:

以上是关于剪刀石头布。使用数学确定赢/输/平?的主要内容,如果未能解决你的问题,请参考以下文章

石头剪子布秘诀_剪刀石头布必胜技巧

bzoj2597: [Wc2007]剪刀石头布

《石头、剪刀、布》幼儿园教案

P4249 [WC2007]剪刀石头布

《动物世界》的剪刀石头布 HDU --- 6418

猜拳游戏and用户登录