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

在学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");
		else
			printf("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!;
	else
		man win;
}	
else
{
	if (d_value为奇数)
		man win;
	else
		man 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");
			else
				printf("You lose!\n");
		} else {
			if (d_value % 2 == 0)
				printf("You lose!\n");
			else
				printf("You win!\n");
		}
	}
	return 0;
}



 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
剪刀石头蜥蜴Spock(也被称为Scissors, Paper, Lizard, Spock)是Python中一种扩展的传统剪刀石头游戏,Spock是由科幻剧《星际迷航》中的虚构生物Mr. Spock创造的,规则是用Spock代表"石头"和"水"之间的关系,Spock赢过石头Rock),但输于蜥蜴Lizard)。游戏规则如下: 1. 剪刀Scissors)胜过Paper); 2. Paper)胜过石头Rock); 3. 石头Rock)胜过蜥蜴Lizard); 4. 蜥蜴Lizard)胜过剪刀Scissors); 5. Spock(通常是代表蜥蜴石头)对任何都无胜无负,包括它自己。 在Python中实现这个游戏,你可以创建一个函数来判断两个玩家的选择并返回结果。这里是一个简单的示例代码: ```python def game_choice(player1, player2): if player1 == "Spock": if player2 in ["Scissors", "Lizard"]: return "Player 2 wins" else: return "Player 1 wins (ties)" elif player1 == "Scissors": if player2 == "Paper": return "Player 2 wins" else: return "Player 1 wins" elif player1 == "Paper": if player2 == "Rock": return "Player 2 wins" else: return "Player 1 wins" elif player1 == "Rock": if player2 == "Lizard": return "Player 2 wins" else: return "Player 1 wins" elif player1 == "Lizard": if player2 == "Scissors": return "Player 2 wins" else: return "Player 1 wins" else: return "Invalid choice" # 示例玩家输入 player1 = input("Player 1, choose (Scissors, Paper, Rock, Lizard, Spock): ") player2 = input("Player 2, choose the same: ") print(game_choice(player1, player2)) ``` 你可以运行这个代码,并让用户输入选择,然后看看游戏结果。当然,为了增加趣味性,你可以封装成一个循环,让游戏进行多次或添加一个用户界面。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值