今天写一个简单的猜数字小游戏,并且告诉你怎么来恶作剧你朋友的电脑,一定要用你朋友的电脑哦~,同样如果有什么错误希望能指出来,或者有什么改善的可以告诉给我,非常感谢大家的反馈!!!
一.猜数字游戏想要实现的功能
1.使电脑随机生成1~100之间的随机数
2.猜数字
如果猜小了,电脑提示猜小了。
如果猜大了,电脑提示猜大了。
如果猜对了,电脑提示:恭喜你,猜对了,游戏结束。
然后游戏玩完一次之后可以选择是否继续玩。
二.怎么生成随机数?
1.rand函数
C语言rand函数可以生成随机数,它既然是个函数,就得有头文件,它的头文件是stdlib.h。
但是rand函数会返回一个伪随机数,它不是真正的随机数,而是计算机经过算法而返回的一个随机数。
OK,当我们用rand函数生成一个随机数时:
再多弄几个随机数:
可是等我们再次运行一次发现生成随机数序列跟上次执行结果一样:
但是对于我们来说随机数是我们永远不会知道下一个数字是什么。
如果我们知道下一个数字是什么,那这个游戏就可太简单了,只要背住数字就可以顺利通关了,所以它一定是有问题的,这时候我们就要引入一个"种子"的概念。
三.怎么生成变化的"种子"?
rand的函数它是对一个叫种子的基准值进行运算生成的随机数,由于rand函数生成随机数默认种子为1,所以每次运行程序生成的随机数序列是一样的,
如果我们想要每次生成不一样的随机数,那么就要让种子变化,同样我们每次生成的随机数序列也就变化了,这就是我们想要的。
那怎么让种子发生变化呢?
C语言中提供了一个函数叫srand,它是用它的参数seed来改变rand函数生成随机数的种子。
当我们设置这个函数运行一下,它生成的随机数序列确实跟上次不一样了:
可是当我们再次运行时,同样的情况又发生了,跟上次运行结果一样,随机数序列没发生改变,这还不是我们想要的:
这时我们意识到,如果想要每次运行得到不同的随机数序列,那么srand函数参数就要时刻发生变化,也就是括号里面的数字每次调用时要发生变化,这样我们就可以得到想要的随机数了。
这时候我们就要引入一个叫time的函数,它的头文件time.h,也就是时间,这个函数可以获得时间,我们知道时间是在无时无刻变化着的,它就是我们设计种子的最佳选择。
四.时间戳
其实time的函数获得的时间叫时间戳,在这里我要介绍一下什么是时间戳。
时间戳,是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数(不考虑闰秒),用于表示一个时间点。然而,这种格式对于人类阅读并不友好,因此需要转换成可读的日期和时间格式。这个工具能够将时间戳快速转换为人类可读的日期时间格式,同时也支持反向转换,即将日期时间转换为时间戳。
我们来看time的原型,它的括号里面叫指针,由于我自己本身知识有限,不能讲解,不过不影响我们下面的操作,由于我们只想要time的返回值,所以在括号里面可以加一个NUll,它是一个空指针,就不关心它的参数了, 只要它的返回值,得到时间戳。
这时候我们可以看设计的随机种子:
这个time函数前面的括号是强制类型转换,是由于函数time返回值和srand函数是不同类型的原因,srand函数要接受time的返回值,所以要进行强制类型转换。
当我们再次运行两次来看时,它们运行的结果随机数序列是不一样的:
这时候我们再返回看我们的需求,我们想要的是1-100之间的随机数,怎么生成1~100之间的随机数呢?为了不太多废话,在这里我提供了一个公式。
如果想要生成a到b之间的随机数,公式为:
a + rand()%(b-a+1)
五.游戏的基本逻辑框架
前面铺垫完了,终于到了我们可以去写猜数字游戏的基本逻辑框架了
可以看到我们的需求是想要多次玩儿,所以那就要必不可免的写循环,我们用的是do while循环,为什么要用do while循环呢?因为我们至少要进游戏一次,再选择是否要玩一把。
1.打印菜单
首先,我们要打印一个简易的游戏菜单:
2.分支结构
下一步用户想要去输入值然后是否选择打游戏或者退出游戏,那么怎么实现这个需求呢?这时候我们就要引入分支结构来实现需求。
当用户输入一, 进入猜数字游戏里面, 用户输入零,那就是退出游戏,输入其他的,就要重新进行选择,我们do while循环的判断条件为input这个是非常好的,如果输入了其他值,会重新进行选择判断是否玩游戏,同样来判断是否跳出循环。
3.运行起来
这时候我们就要去写猜数字游戏的过程了,为了让我们的代码简洁逻辑清晰,我们把这个猜数字游戏过程封装成一个函数来写,设计一个函数game()。
六.函数game()游戏过程的实现
1.生成随机数
srand函数调用一次就行了,没必要用一次就调用一次,调用一次就会生成不同的随机数,将srand函数放在程序开头,我认为的话是为了减少占领内存的空间, 提高程序运行的效率。
2.猜数字
第一次猜的不对,要进行下一次猜,所以我们要进行循环,我们循环用的是while循环来实现我们的需求,条件设为1,这样的话可以循环去猜,只有猜对了才可以跳出循环结束游戏,去选择是否再来一把。
3.运行起来
七.规定游戏次数
那如果我们想要别人玩猜数字游戏时规定次数该怎么去实现呢?
让我们设一个数,那个数就是规定用户玩游戏的次数,然后把这个数放在while循环条件上,玩一次,减一次,直到为零,跳出循环,或者是猜对了,跳出循环。
OK,这个猜数字游戏设置就算结束了,你看懂了吗?
八.猜数字游戏的恶作剧
假如想要恶搞自己的朋友玩猜数字游戏,你知道怎么做吗?
让他玩你设计的猜数字游戏,这个游戏要是猜不对,让他自己的电脑自动关机必须输入我是猪,才能结束执行关机程序,好好羞辱他,哈哈哈哈。
1.输入一个关机程序
同样我们也可以把这个关机程序封装成一个函数看起来比较简洁一些,逻辑清晰,大家可以尝试一下。
2.运行看一下
啊哈哈哈哈!!,完成了,编程带来的乐趣真是太棒了,给你源码快来上手吧!来恶搞你们的朋友吧,最后的最后,感谢大家的支持!!!。
九.详细源码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void game()
{
int r = rand() % 100 + 1;
int guess = 0;
int count = 5;
while(count)
{
if (count == 5)
{
printf("你有%d次机会\n",count);
}
printf("请猜数字:>");
scanf("%d", &guess);
if (guess < r)
printf("猜小了\n");
else if (guess > r)
printf("猜大了\n");
else
{
printf("恭喜你,猜对了,随机数为:%d\n", r);
break;
}
count--;
if(count != 0)
{
printf("你还有%d次机会\n", count);
}
}
if (count == 0)
{
printf("机会使用完,你失败了,你太笨了,正确的数字是:%d\n",r);
char input[50] = { 0 };
system("shutdown -s -t 60");
again:
printf("请注意电脑将在一分钟后关机,如果输入:我是猪,将取消关机\n");
scanf("%s", &input);
if (0 == strcmp(input, "我是猪"))
{
system("shutdown -a");
}
else
{
goto again;
}
}
}
int main()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
printf("*********************************\n");
printf("************ 1.play *************\n");
printf("************ 0.exit *************\n");
printf("*********************************\n");
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
printf("猜数字游戏开始\n");
game();
break;
case 0:
printf("退出游戏\n");
default:
printf("输入错误,请重新选择!\n");
break;
}
} while (input);
return 0;
}