题目描述
小明和李华自创了一个双手石头、剪刀、布的游戏。他们背对背分别用左手和右手各出一个石头、剪刀或布的手势(双手可以出一样的),然后根据下面的规则判断输赢。
剪刀、石头、布的规则:
- 如果一方出石头,一方出剪刀,则石头方获胜;
- 如果一方出石头,一方出布,则出布方获胜;
- 如果一方出剪刀,一方出布,则出剪刀方获胜;
- 如果两方出的一样,则平局。
双手剪刀、石头、布的规则:
一、如果小明的左手赢了李华的左手:
- 如果小明的左手赢了李华的右手或平局,则小明获胜;
- 如果小明的左手输给了李华的右手:
- 如果小明的右手赢了李华的右手,则小明获胜;
- 如果小明的右手输给了李华的右手或平局,则李华获胜。
二、如果小明的左手与李华的左手平局:
- 如果小明的右手赢了李华的右手,则小明获胜;
- 如果小明的右手输给了李华的右手,则李华获胜;
- 如果小明的右手与李华的右手平局,则平局。
三、如果小明的左手输给了李华的左手:
- 如果小明的右手输给了李华的左手或平局,则李华获胜;
- 如果小明的右手赢了李华的左手;
- 如果小明的右手赢了李华的右手或平局,则小明获胜;
- 如果小明的右手输给了李华的右手,则李华获胜。
输入
第一行输入小明左手和右手的手势。
第二行输入李华左手和右手的手势。
(Y表示剪刀 O表示石头 H表示布)
输出
输出为一行,如果小明赢了,输出 MING,如果李华赢了,输出 LIHUA,如果平局输出 TIE。
思路分析
1、不想通过大量的if、else进行判断,所以考虑压缩到少量if中,但是这样if中的逻辑语句就变长了,个人暂时想不到其他更优解,所以先记录下本次思路做法。
2、Y表示剪刀 ,O表示石头, H表示布,Y、O、H的ASCII码十进制值分别为89、79、72;
3、O赢Y,Y赢H,H赢O,可以记作‘O'-'Y'=-10、'Y'-'H'=17、'H'-'O'=-7,即-10、17、-7为前者赢于后者的标志数;
4、观察三组输赢规则,在每组规则中找出最好判断输赢的情况作为最佳判断条件;
5、利用字符串数组来存输出字符,利用判断语句的k值作为字符串数组的下标。
代码展示
#include<stdio.h>
int main(){
char M[2],H[2];
char s[3][6]={"TIE","MING","LIHUA"};
int k=0;//k=0平局,1小明获胜,2李华获胜
scanf("%c %c\n",&M[0],&M[1]);
scanf("%c %c",&H[0],&H[1]);
if((M[0]-H[0])==-10||(M[0]-H[0])==17||(M[0]-H[0])==-7){//小明左手赢李华左手
if(((M[0]-H[1])==10||(M[0]-H[1])==-17||(M[0]-H[1])==7)&& (((M[1]-H[1])==10||(M[1]-H[1])==-17||(M[1]-H[1])==7))||((M[1]-H[1])==0||(M[1]-H[1])==0||(M[1]-H[1])==0)) k=2;
else k=1;
}
else if((M[0]-H[0])==0||(M[0]-H[0])==0||(M[0]-H[0])==0){//小明左手平局李华左手
if((M[1]-H[1])==-10||(M[1]-H[1])==17||(M[1]-H[1])==-7) k=1;
else if((M[1]-H[1])==10||(M[1]-H[1])==-17||(M[1]-H[1])==7) k=2;
else ;
}
else {//李华左手赢小明左手
if(((M[1]-H[0])==-10||(M[1]-H[0])==17||(M[1]-H[0])==-7)&& (((M[1]-H[1])==-10||(M[1]-H[1])==17||(M[1]-H[1])==-7))|| ((M[1]-H[1])==0||(M[1]-H[1])==0||(M[1]-H[1])==0)) k=1;
else k=2;
}
printf("%s",s[k]);
return 0;
}
运行结果
Y O
H H
MING