One-liner决定谁在Rock,Paper,Scissors中获胜

asm*_*rer 24 c

所以我正在用C编写一个简单的Rock,Paper,Scissors游戏(顺便说一下,这是一个任务,虽然主要是学习插座.而且,我怀疑它会在我得到一个好答案之前到期).我把它设置为Rock = 0,Paper = 1,Scissors = 2.是否有一个简单的单线来确定谁获胜?我试着在纸上玩它,但我无法弄清楚任何模式.

int*_*jay 80

winner = (3 + player1 - player2) % 3;
Run Code Online (Sandbox Code Playgroud)

如果玩家1获胜,则为1,如果玩家2获胜,则为2,为领带为0.

说明:在序列中Rock=0, Paper=1, Scissors=2,每个项目都会使前一个项目失败.即使我们将序列视为包装(即最后一项在第一项之前),也是如此.

对于任何项目X,用更多数学术语来表示:

  • X被击败了(X+1) % 3.
  • X失败了(X+2) % 3.

由此可以看出,(3+X-Y) % 3如果X击败Y则为1,如果Y击败X则为2.

需要添加3来强制结果为非负数:负数的模数在C99中为负或零,在C89中依赖于实现.

  • 这很棒,但是这样的单线程需要至少3行文档. (13认同)
  • @afk,我们可以使用其他来源的代码段,只要我们提供它们.是的,这远远不是作业中最难的部分!另外,我刚才意识到rand()%3本来是等价的(也就是说,如果计算机选择摇滚,纸张或剪刀,或者它只是随机选择胜利,失败或平局:)无关紧要. (3认同)
  • +1让我进入一个有两只猴子和三种类型作家的房间永恒,我们永远不会想到这一点! (2认同)