想要用C代码完成一个简单游戏,需要分为三个部分,第一先要对整个游戏的逻辑进行分析,将其分为几个不同的功能模块;然后再根据每个模块的不同需求进行代码实现,最后将不同功能代码模块进行有序组合。
一、逻辑分析
作为一个游戏首先要有一个菜单供玩家选择,而每个选项都代表不同的功能,这种多分支的票结构可以用switch语句很好实现,并能用其中的defalut语句进行玩家的错误操作提示。
每个游戏功能,都可以用一个函数进行封装,由于这个游戏非常简单,用一个函数足矣。
游戏的大体逻辑如下:
二、代码实现
1、main函数的代码实现如下:
int main()
{
int input = 0;
srand((unsigned int)time(NULL));//为了保证随机生成数起点不再变化,从而让rand函数生成的随机数均匀,故将其放在main函数内只调用一次。
do
{
menu();
printf("请选择:\n");
scanf("%d",&input);
switch(input)
{
case 1:
game();
break;
case 0:
printf("游戏结束\n");
break;
default :
printf("输入有误,请重新输入\n");
break;
}
}while (input);
return 0;
}
main函数是对整个游戏的逻辑进行实现,先给出一个大的框架,接着通过函数调用实现内部功能。
2、打印一个简单的菜单:
void menu()
{
printf("***********************************\n");
printf("*********** 1.play ***********\n");
printf("*********** 0.exit ***********\n");
printf("***********************************\n");
}
3、游戏功能的实现
3.1 rand函数的了解
猜数字游戏,在猜之前需要生成一个随机的数字。
通过调用rand函数可以生成一个随机数。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int n = 0;
int i = 0;
scanf("%d",&n);
printf("生成的%d个随机数分别为:\n",n);
for (i=0; i<n; i++)
{
printf("%d ",rand());
}
return 0;
}
但在测试中发现,通过调用此函数,程序每次执行生成的“随机数”都是相同的。这是因为如果没有设置随机数种子,rand()函数在调用时,自动设计随机数种子为1。那么随机种子相同,每次产生的随机数也会相同。
通过对rand函数的了解发现,再调用它之前,需要先调用srand函数生成一个随机数的起点。
3.2time函数的了解
生成随机数的起点可以通过time函数的调用来实现。time函数的返回值是当前时间点与计算机初始时间1970.01.01 00:00:00的差值。
可见,time函数的返回类型是一个长整形或者int类型,time函数的参数部分是一个名为timer的time_t *类型指针,在调用时可用NULL指针代替。
3.3 srand函数的了解
再来看看srand函数的参数类型:
srand需要传递的参数必须为unsiged int类型,所以需要对调用time函数返回的long/int进行强制类型转换。
3.4游戏功能的实现代码如下:
void game ()
{
int i = 0;
int ret = 0;
ret = rand()%100+1;//保证生成的随机数在1~100之间
printf("%d\n",ret);
while (1)
{
printf("请输入你认为的数字:");
scanf("%d",&i);
if (i>ret)
{
printf("猜大了\n");
}
else if (i<ret)
{
printf("猜小了\n");
}
else
{
printf("恭喜你!猜对了\n");
break;
}
}
}
三、完整代码
void menu()
{
printf("***********************************\n");
printf("*********** 1.play ***********\n");
printf("*********** 0.exit ***********\n");
printf("***********************************\n");
}
void game ()
{
int i = 0;
int ret = 0;
ret = rand()%100+1;
while (1)
{
printf("请输入你认为的数字:");
scanf("%d",&i);
if (i>ret)
{
printf("猜大了\n");
}
else if (i<ret)
{
printf("猜小了\n");
}
else
{
printf("恭喜你!猜对了\n");
break;
}
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:\n");
scanf("%d",&input);
switch(input)
{
case 1:
game();
break;
case 0:
printf("游戏结束\n");
break;
default :
printf("输入有误,请重新输入\n");
break;
}
}while (input);
return 0;
}