练习一:猜拳游戏
主要功能描述:
需求:用户和电脑玩"石头剪刀布"游戏
游戏规则:共三局,胜一局积1分,三局两胜。
每轮先由用户出拳,屏幕提示:
请出拳[1-石头,2-剪刀,3-布]
用户通过键盘选择1,2,3表示他的出拳;
电脑则生成1,2,3三个随机数,含义:[1-石头,2-剪刀,3-布]
三局之后显示结果格式如下:
human vs computer
3 : 0
恭喜,你赢了电脑!
sorry,你败给了电脑!
1.首先,我们先对整个程序进行分析,我们需要分别获取用户和电脑的出拳。可以分别编写两个函数进行获取,并且保证用户输入值得合法性。
//获取用户的出拳,并返回选择对应的数值
int userchoice()
{
int userChoice;
do
{
printf("\n请出拳[1-石头,2-剪刀,3-布]:\n");
scanf("%d",&userChoice);
//判断用户输入的选择是否合法
if(userChoice>0 && userChoice<4)
{
break;
}else{
printf("输入的值不合法,请重新输入:\n");
}
}
while(1);
return userChoice;
}
下面我们获取电脑的出拳,我们最主要的难点在于如何让电脑产生一个1-3的随机数,这里C语言提供了一个随机数发生器。
用法:现在的C编译器都提供了一个基于ANSI标准的伪随机数发生器函数,用来生成随机数。它们就是 rand() 和 srand() 函数。这两个函数的工作过程如下:
1)首先给 srand() 提供一个种子,它是一个unsigned int类型,其取值范围从0~65535;
2)然后调用 rand(),它会根据提供给 srand() 的种子值返回一个随机数(在0到32767之间)
3)根据需要多次调用 rand(),从而不间断地得到新的随机数;
4)无论什么时候,都可以给 srand() 提供一个新的种子,从而进一步“随机化” rand() 的输出结果。
// 获取电脑的出拳
int computerchoice()
{
int computerChoice;
/*设置随机种子,因为种子设置后不宜被直接使用,这部分可以
放入主函数中*/
//srand(time(0));
computerChoice = rand()%3+1; //产生一个1-3的随机数
return computerChoice;
}
2.为了让玩家有更好的游戏体验,我们需要提供一个方法来分别展示玩家和电脑本回合的出拳;
//展示你和电脑的出拳
char * showchoice(int choice)
{
char * pChar=NULL;
switch(choice){
case 1:
pChar="石头";
break;
case 2:
pChar="剪刀";
break;
default:
pChar="布";
}
return pChar;
}
3.接下来就是猜拳游戏最主要的胜负规则判断了,我们一般规定三局两胜,平局不算,完成三局后产生游戏结果;
//返回用户和电脑的输赢
int returnResult()
{
int userwin=0;
int computerwin=0;
int userChoice,computerChoice;
while((userwin+computerwin)<3 )
{
//分别调用上面的两个方法获取用户和电脑的出拳
userChoice = userchoice();
computerChoice = computerchoice();
printf("你的出拳:%s,电脑的出拳:%s\n",showchoice(userChoice),showchoice(computerChoice));
if(userChoice == computerChoice)
{
printf("这把平局,继续来。。\n");
}
else if(userChoice == 1 && computerChoice == 2 || userChoice == 2 && computerChoice == 3 || userChoice == 3 && computerChoice == 1)
{
userwin++;
printf("这把你赢了!厉害!\n");
}
else
{
computerwin++;
printf("这把电脑赢了!\n");
}
printf("\n");
}
printf("\n\thuman\tvs\tcomputer\n");
printf("\t%d\t:\t%d",userwin,computerwin);
if(userwin>computerwin)
{
return 1;
}else{
return 0;
}
}
4.最后主函数部分,按照游戏的先后逻辑调用函数完成整体的功能
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int result;
//设置随机种子
srand(time(0));
printf("=========猜拳游戏开始==========\n");
result = returnResult();
printf("\n");
if(result == 1)
{
printf("\n\t恭喜,你赢了电脑!\n");
}else{
printf("\n\tSorry,你败给了电脑!\n");
}
printf("\n=============游戏结束=============");
return 0;
}
5.测试一下
=========猜拳游戏开始==========
请出拳[1-石头,2-剪刀,3-布]:
3
你的出拳:布,电脑的出拳:剪刀
这把电脑赢了!
请出拳[1-石头,2-剪刀,3-布]:
1
你的出拳:石头,电脑的出拳:剪刀
这把你赢了!厉害!
请出拳[1-石头,2-剪刀,3-布]:
5
输入的值不合法,请重新输入:
请出拳[1-石头,2-剪刀,3-布]:
2
你的出拳:剪刀,电脑的出拳:石头
这把电脑赢了!
human vs computer
1 : 2
Sorry,你败给了电脑!
=============游戏结束=============
总结:这样我们就完成了这个小游戏,程序中使用了最基础的循环和条件判断语句,逻辑简单适合C语言初学者练手。
此外程序还有许多可以改进的地方,例如
a.使用 system(“cls”) 在玩家与电脑的对战回合结束时清屏;
b.在每一轮结束后可以征求用户“是否继续游戏”;
程序实现方式很多,这只是其中最为普通的一种,文章中有啰嗦和不合适的地方,希望大家看到后能够交流指正,一起成长。