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

时间:2012-07-07 17:21:08

标签: math logic puzzle

所以当我写这个函数时,我正在写一个石头剪刀游戏:

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++;
    }
}

我的问题是:这个函数可以编写的最优雅方式是什么?

编辑:我正在寻找单行。

5 个答案:

答案 0 :(得分:12)

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++;

答案 1 :(得分:7)

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

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

(编辑:忘了ab已经是零起源。)

答案 2 :(得分:2)

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

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

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

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

答案 3 :(得分:2)

您可以使用简单的数学公式来获得结果,然后与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;
};

答案 4 :(得分:1)

你是如何在java中做到的?

result =(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");
 }