这篇中我们要编写一个供两位玩家对战的“猜拳游戏”。当然,这里所说的“两位玩家”是指计算机和人,即游戏采用人机对战的模式。
一、基本设计
先来大致设计一下“猜拳游戏”,程序的流程如下所示:
- 确定计算机要出的手势。
- 显示“石头剪刀布”,然后玩家输入自己要出的手势。
- 进行输赢判断,显示结果。
- 询问是否继续,如果玩家希望继续,就回到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语言的私我哦~有全套资料给与大家~