当前位置:网站首页>猜数字小游戏(随机生成’三剑客‘)
猜数字小游戏(随机生成’三剑客‘)
2022-07-30 05:39:00 【小牛要翻身】

大家好,我是一只励志要翻身的小牛,废话少说,下面就给大家介绍第一个C语言小游戏——猜数字小游戏!

文章目录
一、游戏规则
至于猜数字嘛,见名知意,规则无非就是:玩家反复输入猜的数字直到猜对为止,下面,我们就通过C语言实现一个1-100之间的猜数字游戏,老铁们准备好了吗,发车了!
二、效果展示

三、游戏设计思路
1.游戏交互界面
(1)创建游戏菜单
(2)创建游戏逻辑主体
2.猜数字游戏
(1)电脑生成随机数字
(2)玩家输入数字
(3)判断是否猜对
四、游戏交互界面
1.创建游戏菜单
玩游戏怎么能没有菜单呢,下面我们创建一个简易的菜单供玩家选择:
void menu()
{
printf("**************************************************\n");
printf("******* 1->play 0->exit ********\n");
printf("**************************************************\n");
}2.创建游戏逻辑主体
游戏的逻辑的是否完美实现是整个游戏成败的关键,对于这样一个简单的小游戏我们可以这样实现游戏主体逻辑:
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);//这里用do while 循环是因为这个游戏需要至少进去一次
//特点:先执行,后判断
return 0;
}
1、因为游戏是面向用户的,所以这里需要定义并调用菜单函数——menu()
2、因为游戏至少可以进入一次,所以用do-while()循环——代码至少执行一次
注意:while(input)——循环条件input的巧妙之处,C语言中0为假,非0为真,所以这里用户输入1或输入 其他非0数字导致错误,都会再次调出菜单让用户选择,无需增加其他条件。
当然了这里的猜数字游戏函数-game()还未定义,我们接下来我们就需要对 game()函数进行实现:
五、游戏实现
1、随机数生成”三剑客“
我们回到游戏的设计思路,其实猜数字游戏中最重要的一步就是生成随机数,那我们应该如何生成随机数呢?这里C语言为我们提供了随机数生成三剑客:rand--srand--time
(1)随机数生成器:rand函数
rand()函数的属性:int rand (void)——生成随机整数(0-32767)
分析:rand()函数接受参数为空,返回一个int类型的随机整数。头文件-stdlib.h
但是rand()函数真的随机吗?我们下面一探究竟:
#include <stdio.h> #include<stdlib.h> int main() { int i = 5; while (i) { int ret = rand(); printf("%d\n", ret); i--; } return 0; }执行3次结果:
可以发现,循环5次后,每组的随机数据都一致,因此答案就很明显了,rand()函数是假随机。
(2)随机数发生器的初始化函数:srand函数
那么我们还有没有办法让它真随机呢?办法当然是有的啦,C语言同时为我们提供了一个随机数发生器的初始化函数:srand函数--配合rand函数使用,设置随机数生成起点
srand()函数属性:void srand (unsigned int seed)
分析:srand函数接受一个unsigned int类型,返回空(不需要返回值->设置随机数生成起点),头文件-stdlib.h
执行结果:
可以发现,rand函数生成的随机值随srand函数接受参数变化而变化,要想让rand函数生成一个随机数,srand函数就需要接收一个随机值
(3)获取时间戳:time函数:
那么这个随机值去哪找呢?因为时间是不断变化的,因此我们可以让srand函数接收一个时间戳。 这里引出获取时间戳:time函数:
time函数属性:time_t time (time_t* timer)
分析:time函数接收一个指针类型,返回time_t类型,头文件-time.h
(4)三剑客的”有机结合“ -真随机的实现
1.rand函数的属性:int rand (void)
2.srand函数属性:void srand (unsigned int seed)
3.time函数属性:time_t time (time_t* timer)
了解了“三剑客”各自的属性,就可以开始配置随机数生成器,实现“真随机 ”
//生成随机数的大致逻辑结构
#include<stdlib.h>
#include<time.h>
int main()
{
srand((unsigned int)time(NULL));
int ret = rand();
return 0;
}注意:
1、time函数接收指针类型参数,所以传入NULL-空指针
2、srand函数接收unsigned int类型参数 ,所以将time返回类型time_t转换为unsigned int类型
2、玩家输入与判断
玩家输入与判断模块通过简单的while循环语句与if判断语句即可实现,这里就不再分开赘述,代码如下:
void game()
{
int a = 0;
//rand()函数生成一个随机数
int ret = rand() % 100 + 1;//1-100之间的随机数
while (1)//1为真,让他一直循环,直到猜对
{
printf("请猜数字:");
scanf("%d", &a);
if (a > ret)
{
printf("猜大了\n");
}
else if (a < ret)
{
printf("猜小了\n");
}
else
{
printf("恭喜你,猜对了!\n");
break;
}
}
}注意:
1、这里的srand函数放到了主函数中,因为调用一次函数就会设置一个随机数的生成器,不需要重复调用。
2、 rand()%100+1的含义:因为rand生成随机整数范围是(0-32767),所以rand()%100限定了范围(0-99),加1满足(1-100)范围需求。
六、完整代码
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
printf("**************************************************\n");
printf("******* 1->play 0->exit ********\n");
printf("**************************************************\n");
}
void game()
{
int a = 0;
//rand()函数生成一个随机数
int ret = rand() % 100 + 1;//1-100之间的随机数
while (1)//1为真,让他一直循环,直到猜对
{
printf("请猜数字:");
scanf("%d", &a);
if (a > ret)
{
printf("猜大了\n");
}
else if (a < ret)
{
printf("猜小了\n");
}
else
{
printf("恭喜你,猜对了!\n");
break;
}
}
}
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);//这里用do while 循环是因为这个游戏需要至少进去一次
//特点:先执行,后判断
return 0;
}
七、结语
铁汁们,猜数字游戏这点事大家都明白了吗?如果本文对你有所帮助的话,请给博主一个一键三连哦🥰

边栏推荐
- 839. Simulated heap
- Ranking of grades (Huazhong University of Science and Technology postgraduate examination questions) (DAY 87)
- Different usage scenarios of subqueries as retrieval tables and the question of whether to add aliases
- C语言人机大战之三字棋博弈
- MySQL笔记(pymysql)
- MySQL 用户授权
- 每日练习------输出一个整数的二进制数、八进制数、十六进制数。
- CISP-PTE Zhenti Demonstration
- optimizer.zero_grad()
- [详解C语言]一文带你玩转数组
猜你喜欢
随机推荐
650.只有两个键的键盘(动态规划)
5.6EPOLLONESHOT事件
Socket通信编程
Qt实现一个重复文件检测小工具(原理:通过md5校验)
微积分 / 自动求导
三子棋游戏——C语言
[GO Language Basics] 1. Why do I want to learn Golang and the popularization of GO language entry
navicat无法连接mysql超详细处理方法
cmd (command line) to operate or connect to the mysql database, and to create databases and tables
Anaconda安装教程
flask-socketio实现的网页聊天室(二)
2022年SQL经典面试题总结(带解析)
Navicat new database
flask使用token认证
多线程并发服务器
【线性神经网络】线性回归 / 基础优化方法
np.argsort()函数详细解析
navicat连接MySQL报错:1045 - Access denied for user ‘root‘@‘localhost‘ (using password YES)
cross_val_score的用法
[Koltin Flow (1)] Five ways to create flow












