【C语言】猜拳游戏

        这篇中我们要编写一个供两位玩家对战的“猜拳游戏”。当然,这里所说的“两位玩家”是指计算机和人,即游戏采用人机对战的模式。

一、基本设计

先来大致设计一下“猜拳游戏”,程序的流程如下所示:

  1. 确定计算机要出的手势。
  2. 显示“石头剪刀布”,然后玩家输入自己要出的手势。
  3. 进行输赢判断,显示结果。
  4. 询问是否继续,如果玩家希望继续,就回到1。

        下面我们来详细地设计一下各个步骤:
        1用随机数确定计算机所出的手势(具体数值在2中设计)。之所以要先确定计算机出的手势再读取玩家的手势,是为了避免计算机作弊。

        2如果用"石头"、"剪刀"、"布”的字符串来进行手势输入,可能会产生输入错误。例如不小心打错字,变成“势头”、“见到”等。因此,我们把“石头”、“剪刀”、“布”这三个手势分别对应数字0,1,2(类型设为int型)。

        如果玩家的手势和计算机的手势能用相同的数值表示出来,就保持了一致性,会很方便这样一来,也确定了在1的设计中未解决的手势的数值

二、switch语句

#include<time.h>
#include<stdio.h>
#include<stdlib.h> 
int main(void)
{
	int human;
	int comp;
	int judge;
	int retry;
	srand(time(NULL));
	printf("猜拳游戏开始!!\n");
	do
	{
		comp = rand() % 3;
		printf("\n\a石头剪刀布...(0)石头(1)剪刀(2)布:");
		scanf("%d", &human);
		printf("我出");
		switch (comp)
		{
		case 0:printf("石头"); break;
		case 1:printf("剪刀"); break;
		case 2:printf("布"); break;
		}
		printf("。\n");
		judge = (human - comp + 3) % 3;
		switch (judge)
		{
		case 0:puts("平局。"); break;
		case 1:puts("你输了。"); break;
		case 2:puts("你赢了。"); break;
		}
		printf("再来一次吗···(0)否(1)是:");
		scanf("gd", &retry);
	} while (retry == 1);
	return 0;
}

        首先运行程序程序会要求玩家输人手势,输人0,1,2这些数值后,会显示输赢结果。然后程序会询问玩家是否再来一次,输入1的话就能再玩一局。

        switch语句负责显示计算机的手势和判断结果。在switch语句中,首先会对控制表达式进行求值,然后程序会跳转到case后面的值和求值结果一致的标签(label)。、

        但是,如果 case后面所有的值都跟表达式的求值结果不一致,程序就会跳转到 default标签,如果没有 default标签,就会跳出switch 语句。

        程序跳转到该标签以后,会按顺序执行其后的语句。执行过程中如果遇到 break 语句,就停止执行 switch语句。        

三、表示“手势”的字符串 

        在前面的程序中,玩家输人手势后,屏幕上就会立即显示出计算机的手势,例如“我出石头。”。下面来改写一下程序,让玩家的手势也能显示出来,例如“我出石头,你出布”。

#include<time.h>
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
	int human;
	int comp;
	int judge;
	int retry;
	srand(time(NULL));
	printf("猜拳游戏开始!!\n");
	do {
		comp = rand() % 3;
		do {
			printf("\n\a石头剪刀布···(0)石头 (1)剪刀 (2)布:");
			scanf("%d", &human);
		} while (human < 0 || human>2);
		printf("我出");
		switch (comp)
		{
		case 0:printf("石头"); break;
		case 1:printf("剪刀"); break;
		case 2:printf("布"); break;
		}
		printf(",你出");
		switch (human)
		{
		case 0:printf("石头"); break;
		case 1:printf("剪刀"); break;
		case 2:printf("布"); break;
		}
		printf("。\n");
		judge = (human - comp + 3) % 3;
		switch (judge)
		{
		case 0:puts("平局。"); break;
		case 1:puts("你输了。"); break;
		case 2:puts("你赢了。"); break;
		}
		printf("再来一次吗···(0)否 (1)是:");
		scanf("%d", &retry);
	} while (retry == 1);
	return 0;
}

        上面两个switch语句基本一致。这就相当于重复了两段极为相似的代码,程序略显冗长。
        而且,"石头"、"剪刀"、"布"作为独立的字符串常量各自出现了两次,作为字符串常量的部分各自出现了一次,总共各自出现了三次。

        如果要把手势的表述方式从“石头剪刀布”换成“包剪子锤”,或者变更成0,1,2以外的值需要修正和更改的地方就很多了。

        修改的问题交给大家,感兴趣的家人们积极响应一下。临近期末大家冲刺C语言的私我哦~有全套资料给与大家~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Mr_star_galaxy

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

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

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

打赏作者

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

抵扣说明:

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

余额充值