题目:
实现一个剪刀、石头、布的猜拳游戏。
解题思路:
1、猜拳游戏的三个关键点在于:给定计算机的出拳结果,对自己出拳结果的记录,自己出拳结果和计算机出拳结果的比较。
2、计算机的出拳结果可以利用随机函数给定,通过随机出不同的值可以代表计算机不同的出拳结果。这里如果只简单利用rand进行随机,那么实现的结果是一种伪随机,它在多次运行时的结果都是一样的,就要使用到srand根据时间来进行随机。
3、对于自己出拳结果的记录时,自己的输入为中文的剪刀、石头、布比较合理,那么就需要定义一个字符型的数组来接收这个输入的结果。
4、人机出拳结果的比较是这个代码比较关键的一部分,因为输入的中文也是字符串型的数据,那么可以借助字符串的比较函数(strcmp)来进行比较,这里简单介绍一下,当被比较的两个字符串完全相同时,该函数的返回值是0。
5、为了贴近实际的游戏玩法利用了goto语句实现重玩的操作,在这一部分比较重要的语句是 while (getchar() != '\n');,因为当我输入y决定重玩时,在缓冲区可能存在垃圾字符影响程序的进行。事实上也是这样的,当这个语句去掉时,程序将直接进行判断,玩家无法输入重玩后的猜拳结果。
程序代码:
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
p:
printf("********欢迎来到猜拳游戏*********\n");
printf("请输入你的出拳结果(石头、剪刀、布):\n");
char a[20];
gets(a);//将输入结果存储到字符数组中
int self;
srand(time(NULL));//随机函数
int i = rand()%3;//以下根据随机出的数给计算机的出拳结果赋值
if(i == 0){
printf("计算机出石头\n");
}
else if(i == 1){
printf("计算机出剪刀\n");
}
else{
printf("计算机出布\n");
}
if(strcmp(a,"石头") == 0){//将计算机的出拳结果和玩家的出拳结果进行比较
self = 0;
}
else if(strcmp(a,"剪刀") == 0){
self = 1;
}
else{
self = 2;
}
if((self == 0 && i == 1) || (self == 1 && i == 2) || (self == 2 && i == 0)){
printf("结果是你赢了\n");
}
else if (self == i){
printf("结果是平局\n");
}
else{//先写平局和赢的条件,输的时候条件可以不用写了
printf("结果是你输了\n");
}
printf("在来一次?[y/n]");
char j;
scanf("%c",&j);
if(j == 'y'){
while (getchar() != '\n'); //清空缓冲区的字符,避免对下一次为数组赋值造成干扰
goto p;//利用goto语句跳转到程序的开始
}
else{//当决定不玩时程序可以提前结束
return 0;
}
return 0;
}
运行结果:
********欢迎来到猜拳游戏*********
请输入你的出拳结果(石头、剪刀、布):
布
计算机出布
结果是平局
在来一次?[y/n]y
********欢迎来到猜拳游戏*********
请输入你的出拳结果(石头、剪刀、布):
剪刀
计算机出石头
结果是你输了
在来一次?[y/n]y
********欢迎来到猜拳游戏*********
请输入你的出拳结果(石头、剪刀、布):
石头
计算机出石头
结果是平局
在来一次?[y/n]n