目录
1.关于猜数字游戏,我想很多人在小时候都玩过,这是一种起源于20世纪中期的游戏。而他的基本规则就是一个人随机给出一个数,然后让另一个人去猜测这个数字的具体大小,如果大了则回答“猜大了”,反之则回答“猜小了”,直到正确才停止。而就是这么一个简单的游戏,却隐含不少编程有关的知识,那今天就让我们尝试利用c语言去编写这样的一个小游戏吧。
2.由上述关于猜数字游戏的描述我们转换为程序语言可大致分为以下几个方面
①:程序的交互性实现(如何与玩家实现互动,如游戏开始与结束控制,即菜单)
②:随机数的实现(利用rand和srand函数)
③:随机数与玩家所猜数的判断(简单的if判断)
3.由以上三点分析,我们开始逐步实现这个程序
首先我们在设计程序时要考虑的应该是一个程序主体框架,以及如何将一个问题拆分为几个小问题分开实现,而非一些细枝末节的东西。这个思维在以后的程序设计中都将占主导地位,这是新人所需要注意的。那我们现把程序框架实现如下:
int main()
{
srand((unsigned int)time(NULL));//控制随机值(后面会讲到)
int input = 0;
do
{
menu();//菜单
printf("请选择");
scanf("%d", &input);
switch (input)
{
case 1:
game();//后面会实现的游戏主体函数
break;
case 0:
printf("退出游戏\n");
break;
default://输入其他数字时提示错误
printf("选择错误\n");
break;
}
} while (input);//这里选择input为0(即为假)退出游戏
return 0;
}
可以看到当程序框架完成后,我们就将实现游戏的菜单和具体内容,那我们现实现一个简单的菜单
void menu()//注意返回类型为void
{
printf("********************************\n");
printf("******* 1. play *******\n");
printf("******* 0. exit *******\n");
printf("********************************\n");
}
接下来是整个程序的核心内容
void game()
{
int ret = rand() % 100 + 1;//控制随机值范围
int num = 0;
//2.猜数字
while (1)
{
printf("请猜数字");
scanf("%d", &num);
if (num == ret)
{
printf("恭喜你,猜对了\n");
break;
}
else if (num > ret)
{
printf("猜大了\n");
}
else
{
printf("猜小了\n");
}
}
}
对于随机数的生成我们用到了一个rand函数,而如果只单独使用rand函数的话会出现以下情况。
可以看到连续生成10个随机数但是结果却是一样的,这便失去了我们猜数字的意义。因此为解决这种问题我们就要为rand函数播下“种子”。于是这里便引出了srand函数 ,如srand(1)来初始化种子,但如果每次的种子都是一样的便达不到随机数的效果了,因此我们需要引入一个时刻在变化的变量,这里我们通常使用的是系统时间,使用time函数获取当前系统时间,得到的值就是时间戳。
因此我们得到srand的通常用法如下:srand((unsigned int)time(NULL))。先利用time获取当前时间戳,再(unsigned int)将获取的值转换为无符号整型,然后将值传给srand函数就可以得到一个时刻在变化的值。
这里需要注意的是rand函数生成的随机数范围通常是0~32767,而这个范围对于我们来说通常太大了,因此我们经常会使用如下方法去控制rand的范围
int ret=rand() % 100 + 1;//范围0~100
基于上述的详细分析,我们可以得到完整的代码如下
#include <stdlib.h>
#include <time.h>//由于使用了time函数需要引头文件
#include<stdio.h>
void menu()
{
printf("********************************\n");
printf("******* 1. play *******\n");
printf("******* 0. exit *******\n");
printf("********************************\n");
}
void game()
{
int ret = rand() % 100 + 1;//控制随机值范围
int num = 0;
//猜数字
while (1)
{
printf("请猜数字");
scanf("%d", &num);
if (num == ret)
{
printf("恭喜你,猜对了\n");
break;//猜对了退出循环,回到主函数菜单界面
}
else if (num > ret)
{
printf("猜大了\n");
}
else
{
printf("猜小了\n");
}
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));//控制随机值
do
{
menu();
printf("请选择");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误\n");
break;
}
} while (input);
return 0;
}