- 代码实现
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>
void menu()
{
printf("\t\t\t\t\t***********************************\n");
printf("\t\t\t\t\t************1.开始游戏*************\n");
printf("\t\t\t\t\t************2.结束游戏*************\n");
printf("\t\t\t\t\t***********************************\n");
Sleep(500);
printf("\t\t\t\t\t请输入你的选择:");
}
void game()
{
system("cls");
int b, c, t;
printf("\t\t\t\t\t********Let's go!**********\n");
printf("\t\t\t\t\t********Let's go!**********\n");
printf("\t\t\t\t\t********Let's go!**********\n");
printf("\t\t\t\t\t********Let's go!**********\n");
printf("\t\t\t\t\t********Let's go!**********\n");
printf("\t\t\t\t\t********Let's go!**********\n");
printf("\t\t\t\t\t********Let's go!**********\n");
Sleep(1000);
printf("\t\t\t\t\t数字在1~100之间,来,试试看!\n");
Sleep(2000);
system("cls");
b = rand() % 100 + 1;
while (1)
{
printf("请输入:");
scanf_s("%d", &t);
if (t > b)
{
printf("猜大了\n");
}
else if (t < b)
{
printf("猜小了\n");
}
else
{
printf("哇,你猜对了!\n");
printf("数字是%d\n", b);
break;
}
}
Sleep(3000);
system("cls");
printf("是否再来一局?(1 or 2):");
scanf_s("%d", &c);
if (c == 1)
{
system("cls");
printf("加载中");
printf("...");
Sleep(800);
system("cls");
game();
}
if (c == 2)
{
printf("下次再见啦\n");
system("pause");
}
}
int main()
{
unsigned char a;
srand((int unsigned)time(NULL));
menu();
scanf_s("%c", &a,1);
system("cls");
while (a !='1' && a != '2')
{
printf("您输入的选择无效,请重新输入:");
scanf_s("%c", &a,1);
}
switch (a)
{
case '1':
game();
break;
case '2':
printf("下次再见啦");
break;
}
return 0;
}
- 方法详解
随机数生成部分
猜数字游戏的核心在于运用rand和srand函数生成的随机数达到目的,其他的主菜单等不过是对于程序进行的修饰,提升观感。我们先来看看随机数的生成。
随机数的生成需要用到rand,srand,time函数,运用MSDN可以知道使用rand和srand需要设置头文件stdlib.h
![](https://i-blog.csdnimg.cn/blog_migrate/c1ad90d4d4a79b6adb9b814e576431d0.png)
设置完毕后我们发现,似乎rand本身就可以生成随机数,也就是说,当我们打印如下代码:
#include "stdio.h"
#include "stdlib.h"
int main()
{
int ret = rand();
while (scanf("%d",&b))
{ printf ("%d",ret);}
return 0;
}
输出结果可以得知rand会产生0——rand_max(即32767)之间的随机数,但是,当我们下一次该代码时我们会发现,第二次运行和第一次运行产生的随机数相同,那游戏就变成了一次性游戏,没得玩了,所以我们要用到srand,在调用rand之前为伪随机数生成器种子
![](https://i-blog.csdnimg.cn/blog_migrate/835a291a1f34b2404447a4bebde07997.png)
那我们就调用他试试
#include "stdio.h"
#include "stdlib.h"
int main()
{
srand(1);
int ret = rand();
while (scanf("%d",&b))
{ printf ("%d",ret);}
return 0;
}
运行后发现,输出的数成为了一个数循环,如果srand里的数值发生改变,rand输出的值也会改变,也就是说,如果srand调用值是随机的,那么rand的值就是随机的,可是我们又要用srand让rand随机,生成随机数需要随机数,这里似乎陷入了一个死循环,没关系,试想一下,srand需要一个变化的值,那么什么是变化的呢?没错,时间是变化的!我们只需要在srand里调用时间,就可以达到生成随机数的目的,也就是说,调用时间戳到srand函数使他让rand函数产生随机数!因此,我们可以用到time函数:
![](https://i-blog.csdnimg.cn/blog_migrate/29362f2df7c66e9ebb69f69af83c4d46.png)
显然,time函数需要使用time.h的头文件,他可以返回一个时间戳,time函数的运用需要指针,但是我们在这里并不需要,因此,我们可以写time(NULL),同时我们发现,srand的使用是需要一个unsigned int的值,可是time不是啊?没关系,我们强制转换一下,写成:srand((unsigned int)time(NULL)),到此为止,我们设置了一个随机数的生成器,接下来,让我们生成随机数:
#include "stdio.h"
#include "stdlib.h"
#include"time.h"
int main()
{
srand((unsigned int)time(NULL));
int ret = rand();
while (scanf("%d",&b))
{ printf ("%d",ret);}
return 0;
}
运行后发现,我们已经可以正常生成随机数了,这里有个小知识点:随机数生成器(即srand)只需要设置一次,如果设置多次,比如套进循环,会出现错误:如果我们的输入频率过快,也就是说设置生成器的频率过快,会出现每次输出的随机数大小相近甚至相等的情况,因此,我们只需要也只能设置一次随机数生成器!
随机数已经可以生成了,那怎么设定他的范围呢?我们可以通过对rand函数取余数来达到效果。比如:我想让他生成1——100的随机数,我们可以让rand模100,即int ret = rand()%100;我们可以得到0——99的余数,我们再加个1,就得到了1——100的随机数:
#include "stdio.h"
#include "stdlib.h"
#include"time.h"
int main()
{
srand((unsigned int)time(NULL));
int ret = rand()%100+1;
while (scanf("%d",&b))
{ printf ("%d",ret);}
return 0;
}
到此,随机数部分我们写完了,接下来是猜数字的部分。
猜数字部分
while (1)
{
printf("请输入:");
scanf_s("%d", &t);
if (t > b)
{
printf("猜大了\n");
}
else if (t < b)
{
printf("猜小了\n");
}
else
{
printf("哇,你猜对了!\n");
printf("数字是%d\n", b);
break;
}
}
代码在这自己看
猜数字部分其实很简单,说白了就是一个循环套个判断,我们输入数字,用if语句对我们输入的数字进行判断,如果输入的数字比随机生成数大,那么打印“猜大了”,如果小了便打印“猜小了”,如果猜对了,便输出数字顺便鼓励。
当然了,不可能只输入一次吧?所以我们可以用while循环,讲条件设定为无限循环,如果猜对了就break结束,没猜对就继续猜。
修饰部分
修饰部分主要指的是对于主菜单,提示话语,是否再来一次等这些小细节的处理和编译。
这个部分会用到Sleep函数和system("cls");清屏指令,这里对system()和清屏函数不做过多介绍,只需要知道system("cls");可以清除当前会话框中的全部内容即可。Sleep函数在这里主要用于界面美观,他可以做到延时输出
system("cls");
printf("加载中");
printf("...");
Sleep(800);
system("cls");
game();
在这一段中,我们先清空屏幕,然后打印加载中,我们给Sleep函数设置了800毫秒的延时,使上面的“。。。”可以以每800毫秒的速度打印,达到了美观性,之后再次清屏,调用game函数以进行下一轮游戏的输出。而关于主菜单和游戏之间,主要运用自定义函数的调用。
- 总结
猜数字游戏程序的主要难点其实在于如何生成随机数,其实利用rand可以做到生成随机验证码,但博主仍是代码苦手所以。。剩下的修饰部分只需要运用好sleep和cls就可以,不过值得注意的是当我们在使用选择语句进行函数调用,需要清楚自己的变量和调用的函数是否需要用到这边的变量,对于不同函数之间的数据处理应该小心。
最后
祝您生活愉快,再见!