前言
相信许多同学和我一样,刚接触c语言一段时间后,觉得c语言特别特别有趣,迫不及待的想要自己写出一些有意思的代码来,尤其羡慕那些能够制作小游戏的大佬。今天,小书就给大家展示一下自己最近学到的一个小游戏代码,和大家分享分享我的编写思路~~
游戏描述
猜数字游戏的描述:
1、程序会生成一个1~100之间的随机数
2、猜数字
1)猜小了,程序提示猜小了,继续猜
2)猜大了,程序提示猜大了,继续猜
3)猜对了,程序提示猜对了,结束
3、游戏可以反复玩
思路
第一步,生成菜单
我们需要一个游戏菜单界面,来提示我们开始游戏或者退出游戏,考虑到可能会多次调用,就把菜单代码放在一个叫menu的函数里。
void menu()
{
printf("***************************\n");
printf("******* 1 . play ********\n");
printf("******* 0 . exit ********\n");
printf("***************************\n");
printf("您是否想要开始(或继续)游戏?请输入1开始或者0退出:\n");
}
第二步,编写外部循环——反复玩
游戏要求我们可以反复玩,因此必须需要循环了。思考一下,游戏至少会进行一次,即用do…while…语句就非常适合(do while语句至少先执行一次,再进行判断)
do
{
menu();//打印菜单
} while ();
由菜单要求的输入1开始游戏或0退出游戏,我们不难想到,用switch语句刚好合适,当case : 1则开始我们的游戏,当case : 0则退出循环
do
{
menu();//打印菜单
scanf("%d", &input);
switch (input)
{
case 1:
game();//game是游戏的整个逻辑
break;
case 0:
printf("游戏结束\n");
break;
default:
printf("输入错误,请重新输入!\n");
break;
}
} while (input);
如上代码,游戏的整个逻辑我们同样可以放在一个叫做game的函数里。
当然,变量input要在do while循环外声明,如果在循环内部声明,input就变成一个局部变量,它的作用域是在循环里,就不能填在while()内作为参数了。
关于为什么用1表示开始,0表示退出,因为输入0时刚好可以退出循环,这个思路很巧妙!
第三步,编写游戏代码
游戏逻辑的具体编写
首先我们分析一下,游戏的代码可以分为如下两部分:
1、生成一个随机数
2、猜数字
1、生成一个随机数
在c语言中,rand函数的作用是生成一个随机的数,需引头文件<stdlib.h>。
但是单纯使用rand函数是无法满足我们的要求的。
如图:
分析:看似是生成了随机数,但是,当我下一次运行这个程序,生成的11个随机数还是这11个,也就是说,我每次运行猜数字游戏,程序给我的随机数是固定不变的,也就是说每次玩的时候要猜的数是固定的,这当然不是我们的目的,我们要求的是每次玩都是要猜不一样的数。这原理就是rand每次生成随机数的起点是固定不变的,我们就需要设置它,让程序每次运行都有不一样的起点。
于是我们需要另一个函数srand。
srand函数可以设置产生一系列伪随机数发生器的起始点,也就是设置rand函数产生随机数的第一个数。使用srand,就能让rand函数生成随机数的起点不同,就能获得满足游戏要求的随机数了。而使用srand函数,需要一个参数,该参数就是rand函数的起点。我们需要的是每次运行都有不同的起点,也就是要有一个随时变化的参数值传进来,这貌似进入了死循环,单time函数可以满足我们。
time函数是时间戳,时间戳即是随时间而变的。time函数需要引头文件<time.h>。
于是,生成随机数的问题就解决了。
void game()
{
//1、生成随机数
int num = rand() % 100 + 1;
//2、猜数字
}
int main()
{
srand(time(NULL));
int input = 0;
do
{
menu();//打印菜单
scanf("%d", &input);
switch (input)
{
case 1:
game();//game是游戏的整个逻辑
break;
case 0:
printf("游戏结束\n");
break;
default:
printf("输入错误,请重新输入!\n");
break;
}
} while (input);
return 0;
}
srand设置起始点,代码运行一次只需要设置一次就够了,于是把这句代码放在了main函数里。
time函数需要接收的参数是指针类型,我们给空指针就可以了。
而rand生成随机数,是每次游戏都要进行一次的,于是需要放在game函数内部。
2、猜数字
一次游戏需要猜很多次,直到猜对为止,于是需要一个循环。
只有当猜到了正确答案,循环才会停止,游戏才结束。
//2、猜数字
int x = 0;
while (1)
{
printf("请猜数字:\n");
scanf("%d", &x);
if (x > num)
{
printf("猜大了!\n");
}
else if (x < num)
{
printf("猜小了!\n");
}
else
{
printf("恭喜你猜对了!\n");
break;
}
}
综上,整个游戏的代码如下:
//猜数字游戏
//描述:
// 1)程序会生成一个1~100之间的随机数
// 2)猜数字
// 1 > 猜小了,程序提示猜小了,继续猜
// 2 > 猜大了,程序提示猜大了,继续踩
// 3 > 猜对了,程序提示猜对了,结束
// 3)游戏可以反复玩
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
printf("***************************\n");
printf("******* 1 . play ********\n");
printf("******* 0 . exit ********\n");
printf("***************************\n");
printf("您是否想要开始(或继续)游戏?请输入1开始或者0退出:\n");
}
void game()
{
//1、生成随机数
int num = rand()%100+1;
//2、猜数字
int x = 0;
while (1)
{
printf("请猜数字:\n");
scanf("%d", &x);
if (x > num)
{
printf("猜大了!\n");
}
else if (x < num)
{
printf("猜小了!\n");
}
else
{
printf("恭喜你猜对了!\n");
break;
}
}
}
int main()
{
srand(time(NULL));
int input = 0;
do
{
menu();//打印菜单
scanf("%d", &input);
switch (input)
{
case 1:
game();//game是游戏的整个逻辑
break;
case 0:
printf("游戏结束\n");
break;
default :
printf("输入错误,请重新输入!\n");
break;
}
} while (input);
return 0;
}
游戏虽然简单,但是也还是挺有趣的,无聊的时候可以和小伙伴玩上几把~~
目前还只能写出黑框框里的东西,以后学得更多了,我会把这个代码转化成一个真正的游戏,虽简单,但也是第一步,很好玩捏~