(Rock, Paper, Scissors, Lizard and Spock)sheldon谢耳朵独创的剪刀,布,石头,蜥蜴,史波克 用代码实现

来源:互联网 发布:adobe输出软件 编辑:程序博客网 时间:2024/04/29 11:59

在学linux_C的第8.5节的用代码实现石头、剪刀、布,并且是人机对战时,突然想到蛋疼的sheldon不是独创了Rock, Paper, Scissors, Lizard and Spock了咩,于是开始写代码奋斗欲实现。先说说书上的代码逻辑吧:

#include<stdio.h>#include<stdlib.h>#include<time.h>int main(void){char gesture[3][10]={"scissor","stone","cloth"};int man,computer,result,ret;srand(time(NULL));while(1){computer=rand()%3;printf("\nInuput your gesture (0-scissor 1-stone 2-cloth:\n");ret =scanf("%d",&man);if(ret!=1||man<0||man>2){printf("Invalid input! Please input 0,1 or 2.\n");continue;}printf("Your gesture:%s\tComputer's gesture:%s\n",gesture[man],gesture[computer]);result=(man-computer+4)%3-1;if(result>0)printf("You win!\n");else if(result==0)printf("Draw!\n");elseprintf("You lose!\n");}return 0;}

0、1、2三个整数分别是剪刀石头布在程序中的内部表示,用户也要求输入0、1或2,然后和计算机随机生成的0、1或2比胜负;书上该节末尾也提出了一个问题:(man - computer + 4) % 3 - 1这个神奇的表达式是如何比较出0、1、2这三个数字在“剪刀石头布”意义上的大小的?

man 和computer的取值只能是0 1 2,那么
man - computer 的结果可以是1,-2  0  -1,2
(man赢的取值是1,-2  平的取值是0,输的取值是-1,2)
加上4之后可以是  5,2(赢)   4(平)  3,6(输)
对3进行取余后只有 2(赢)   1(平)     0(输)
再减1  最后只有      1(赢)   0(平)   -1 (输)
其实并不一定非要用这个表达式,只要成功实现这个逻辑即可。

 

对于Rock, Paper, Scissors, Lizard and Spock的输赢关系是怎样的呢?可以先见链接:http://www.hjenglish.com/new/p114866/

同样,我们用0,1,2,3,4分别来定义Rock, Paper, Scissors, Lizard and Spock,并且用矩阵来分析人机对战的结果:

那么man-computer的值与人的输赢关系如下图:

那么逻辑关系就很明了了:

将man-computer赋值给一个变量d_value意为差值,分为三种情况分别讨论,伪代码如下:

if(d_value==0)平局else if (d_value > 0){if (d_value为奇数)man lose!;elseman win;}else{if (d_value为奇数)man win;elseman lose;}

全部代码如下:

#include<stdio.h>#include<stdlib.h>#include<time.h>int main(void){char gesture[5][10] =    { "scissor", "paper", "rock", "lizard", "spock" };int man, computer, d_value, ret;srand(time(NULL));while (1) {printf("\*\*\*\*\*\*\*\*\*\*\*\*\*\*\n");computer = rand() % 5;printf    ("\nInuput your gesture (0-scissor 1-paper 2-rock 3-lizard 4-spock:\n");ret = scanf("%d", &man);printf("ret=%d\n", ret);if (ret != 1 || man < 0 || man > 4) {printf    ("Invalid input! Please input 0,1,2,3 or 4.\n");continue;}printf("Your gesture:%s\tComputer's gesture:%s\n",       gesture[man], gesture[computer]);d_value = man - computer;if (d_value == 0)printf("Draw!\n");else if (d_value > 0) {if (d_value % 2 == 0)printf("You win!\n");elseprintf("You lose!\n");} else {if (d_value % 2 == 0)printf("You lose!\n");elseprintf("You win!\n");}}return 0;}