当前位置:网站首页>猜数字小游戏(随机生成’三剑客‘)
猜数字小游戏(随机生成’三剑客‘)
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;
}
七、结语
铁汁们,猜数字游戏这点事大家都明白了吗?如果本文对你有所帮助的话,请给博主一个一键三连哦🥰

边栏推荐
- MySQL (2)
- 微积分 / 自动求导
- cmd (command line) to operate or connect to the mysql database, and to create databases and tables
- ClickHouse data insert, update and delete operations SQL
- MySQL Soul 16 Questions, how many questions can you last?
- Learn FPGA from the underlying structure (6) ---- Distributed RAM (DRAM, Distributed RAM)
- Socket通信编程
- 50道SQL练习题(刷完直接进大厂)
- Teach you to completely uninstall MySQL
- union中有struct的情况-从内存分析
猜你喜欢

934.最短的桥(广度优先搜索)

MySQL stored procedure

524.通过删除字母匹配到字典里最长单词

What is SOA (Service Oriented Architecture)?

50道SQL练习题(刷完直接进大厂)

留念 · 大学时代最后的系统设计图

Solve phpstudy unable to start MySQL service

MySQL的存储过程

flask-socketio实现的网页聊天室(二)

Different lower_case_table_names settings for server ('1') and data dictionary ('0') solution
随机推荐
mysql time field is set to current time by default
51.N皇后(回溯法)
Error: listen EADDRINUSE: address already in use 127.0.0.1:3000
【飞控开发基础教程9】疯壳·开源编队无人机-PWM(电机控制)
optimizer.zero_grad()
Detailed MySQL-Explain
Different lower_case_table_names settings for server ('1') and data dictionary ('0') solution
MySQL 灵魂 16 问,你能撑到第几问?
面试前需要巩固的算法知识点(自用,更新中)
函数(c语言)
C语言(字符串,转义字符,关键字)
相对路径和绝对路径的区别
Qt实现一个重复文件检测小工具(原理:通过md5校验)
Navicat cannot connect to mysql super detailed processing method
navicat连接MySQL报错:1045 - Access denied for user ‘root‘@‘localhost‘ (using password YES)
Teach you to completely uninstall MySQL
50道SQL练习题(刷完直接进大厂)
ClickHouse data insert, update and delete operations SQL
配环境 / 初步测试
瑞吉外卖项目:新增菜品与菜品分页查询


