【每日一题C】#151. 双手石头剪刀布

题目描述

小明和李华自创了一个双手石头、剪刀、布的游戏。他们背对背分别用左手和右手各出一个石头、剪刀或布的手势(双手可以出一样的),然后根据下面的规则判断输赢。

​ 剪刀、石头、布的规则:

  1. 如果一方出石头,一方出剪刀,则石头方获胜;
  2. 如果一方出石头,一方出布,则出布方获胜;
  3. 如果一方出剪刀,一方出布,则出剪刀方获胜;
  4. 如果两方出的一样,则平局。

双手剪刀、石头、布的规则:

​ 一、如果小明的左手赢了李华的左手:

  1. 如果小明的左手赢了李华的右手或平局,则小明获胜;
  2. 如果小明的左手输给了李华的右手:
    1. 如果小明的右手赢了李华的右手,则小明获胜;
    2. 如果小明的右手输给了李华的右手或平局,则李华获胜。

二、如果小明的左手与李华的左手平局:

  1. 如果小明的右手赢了李华的右手,则小明获胜;
  2. 如果小明的右手输给了李华的右手,则李华获胜;
  3. 如果小明的右手与李华的右手平局,则平局。

​ 三、如果小明的左手输给了李华的左手:

  1. 如果小明的右手输给了李华的左手或平局,则李华获胜;
  2. 如果小明的右手赢了李华的左手;
    1. 如果小明的右手赢了李华的右手或平局,则小明获胜;
    2. 如果小明的右手输给了李华的右手,则李华获胜。

输入

​ 第一行输入小明左手和右手的手势。

​ 第二行输入李华左手和右手的手势。

​ (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

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林月明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值