1.划拳游戏,其实是我们常说的石头剪刀布,是我们和电脑一块玩,我们出拳,电脑随机出拳,用0,1,2来表示石头剪刀布。
2.下来进行写代码,程序是连着写的,则会用到函数调用,指针数组。
2.1
首先,我们得先来定义,
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
//玩家手势
int human;
//电脑手势
int comp;
//胜利次数
int win_no;
//失败次数
int lose_no;
//平局次数
int draw_no;
char *hd[]={"石头","剪刀","布"};
这个定义则是全局变量,方便之后使用。我使用了指针数组,是因为后面的文字有多个字符,指针数组中每个元素都是一个指针,只要是指针都是能存储多个字符的。
有两个头文件:<time.h>和<sdlib.h>,为了下面调用srand()函数和rand()函数。
2.2
进行次数的初始化处理
//初始化处理
void initialize()
{
win_no=0;
lose_no=0;
draw_no=0;
//随机数种子
srand(time(NULL));
printf("猜拳游戏!\n");
}
这里我是用了srand(time(NULL)):这是两个函数,一个是srand函数,srand函数是设置随机数种子函数,这是在调用rand()函数之前使用,之后会用到,rand()会产生随机数的函数,通常这两个函数是一起使用的,来完成产生随机数的功能。
另外一个函数time(NULL):是作为srand函数的参数的,意思是以现在的系统时间作为随机数的种子来产生随机数。time(NULL)函数是得到一个从1990年1月1日到现在得时间秒数,这样每一次运行程序得时间得不同就可以保证得到不同的随机数了。
2.3
读取电脑生成的手势,用0,1,2来表示石头剪刀布。
读取玩家手势,也是用0,1,2来表示石头剪刀布。
//读取生成手势
void jyanken(){
int i;
//rand生成一个随机数
comp=rand()%3 ;//随机数范围
do{
printf("石头剪刀布...");
for(i=0;i<3;i++)
{
printf("(%d) %s",i,hd[i]);
}
printf(":");
scanf("%d",&human);//读取玩家手势
}while(human<0||human>2);
}
2.4
用连个函数调用来更新失败,胜利,平局得次数,用到switch循环结构。来获得0,1,2得内容
//更新失败/胜利、平局次数
void count_no(int result)
{
switch (result){
case 0:
draw_no++;
break;
case 1:
lose_no++;break;
case 2:
win_no++;break;
}
}
void disp_result(int result )
{
switch (result){
case 0:
puts("平局");break;
case 1:
puts("你失败了!");break;
case 2:
puts("你胜利了!");break;
}
}
2.5
写游戏玩一次是否继续,是否再来一次,输入0是否,输入1是继续,返回值进行判断。
//是否继续游戏
int confirm_retry(){
int x;
printf("再来一次吗?。。。否(0)是(1)");
scanf("%d",&x);
return x;
}
2.6
写主函数得内容,主要是调用前面得函数,自己仔细看几遍应该能看懂。
int main()
{
//判断输赢
int judge=0;
//是否再来一次
int retry=0;
initialize();
do{
jyanken();
printf("程序出%s,玩家出%s\n",hd[comp],hd[human]);
judge=(human-comp+3)%3;
count_no(judge);
disp_result(judge);
retry=confirm_retry();
if(retry==0){
printf("再见!\n");
break;
}
}while(win_no<3&&lose_no<3);
printf(win_no==3?"\n你胜利了!\n":"\n我胜利了!\n");
printf("%d胜%d负%d平。\n",win_no,lose_no,draw_no);
return 0;
}
我就简单得解释一下
judge=(human-comp+3)%3;这个语句
%是求余符号,human玩家出手势,可以是0,1,2。comp电脑出手势0,1,2;两个一减,则会出现-2,-1,0,1,2。由于你是用0,1,2来表示输赢的,所以要加上3,除以3,求余,自己想一想应该能懂。
这就会有一点算法。0表示石头,1表示剪刀,2表示布
值为 -2:human出0,comp出2,玩家输,电脑赢,judge为1,对应前面函数,则表示你输了。
依次类推,就会得到前面函数:count_no()和disp_result()的内容,自己可以算过之后和前面函数内容对对。自己一定要动手敲一敲。