IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言猜数字游戏实现 -> 正文阅读

[C++知识库]C语言猜数字游戏实现

目录

1.整体框架

2.简易菜单

3.游戏逻辑

3.1随机数字的生成

3.2猜数字

4.最终成果展示


猜数字游戏的要求:

1.生成1~100之间的随机数;

2.猜数字:

? ?1>猜小了,程序会告诉你猜小了,继续猜;

? ?2>猜大了,程序会告诉你猜大了,继续猜;

? ?3>才对了,程序会告诉:恭喜你猜对了!!!,游戏结束。

3.游戏可以反复玩。


1.整体框架

进入程序,输入1开始猜数字,输入0退出游戏,此处可用switch-case执行分支;

要使游戏至少能进行一次,可以使用do? while循环;

这样可以先写出整体框架

#include<stdio.h>
int main()
{   
	int input = 0;//要作为循环判断条件,所以初始化在循环体系外
	do
	{
		//打印菜单
		menu();
		//选择入口
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("猜数字\n");
            //游戏逻辑
			geme();
			break;
		case 0:
			//退出
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,请重新输入");
			break;
		}

	} while (input);//input是0时为假,是1时为真,可以作为判断标志
	return 0;
}

2.简易菜单

打印一个简易菜单,创建一个菜单函数:

void menu()
{
	printf("****************\n");
	printf("*    1.play    *\n");
	printf("*    0.exit    *\n");
	printf("****************\n");
}

到这里游戏的基本框架就有了

运行:


3.游戏逻辑

3.1随机数字的生成

在C语言中,有专门生成随机整数的函数,那就是rand函数

C/C++资源网站

rand函数返回的是0~RNAD_MAX之间的整数值

转到定义,可以看到RAND_MAX代表的十六进制数字 7fff

转换为十进制就是32767

那就明白了:

rand()随机生成0~32767之间的整数

按照思路创建game函数:

void game()
{
		int ret = rand();
		printf("%d\n", ret);
}

运行几次:

?

发现每次生成的数字都是相同的,

每次生成的数字是相同的?那可没意思,

怎么解决这个问题呢?

其实rand函数并不是这么使用的,我们忽视了一个关键点:

那就是在使用rand函数之前要调用srand函数来设置随机数的生成器

要调用srand函数,找到关于srand函数的信息

应用srand要返回一个整数值

下面随机给srand一个整数并运行程序:

诶?

如果给srand的值是固定的,那生成的数也是固定的

反过来想,如果给srand的值不是固定的,那生成的数不就不是固定的了吗?也就是实现了随机数的生成

问题又来了,有没有随时变化的值?

没错,那就是时间

于是我们引入一个概念:时间戳

恰好 C语言中,time函数会返回时间戳

time_t本质上就是整形,这里不做过多阐述

需要注意的是time函数需要的是time_t* ,也就是指针

而我们对返回的值没有确界要求,只要让time返回一个数就可以了

那我们给空指针NULL

srand(time(NULL));

此时出现了警告:

解决方法很简单,把time强制转化成unsigned int就好

于是就有了:

srand((unsigned int)time(NULL));

?加入game函数:

void game()
{
	srand((unsigned int)time(NULL));
	int ret = rand();
	printf("%d\n", ret);
}

运行几次:

问题双来了:

每次生成的数字都很接近,尤其是前后选择时间较短的时候

原因是每次选择都会调用一次srand函数,相当于每次进行游戏都会重置起点

其实srand函数只要调用一次就行了,不需要频繁调用

通过把srand函数放到main函数开头就可以解决这个问题了

最后,我们需要的是1~100的整数

只需要把rand返回的值模100并+1就ok

void game()
{
	int ret = rand()%100+1;
	printf("%d\n", ret);
}

3.2猜数字

常规思路

输入并判断:

    printf("猜一个吧");
	scanf("&d", &num);
	if (num > ret)
	{
		printf("猜大了");
	}
	else if (num < ret)
	{
		printf("猜小了");
	}
	else
	{
		printf("恭喜你猜对了!!!");
	}

?猜大和猜小都需要重新猜,知道猜对为止

所以while循环给死,猜对跳出

void game()
{
	int ret = rand()%100+1;
	int num = 0;
	//printf("%d\n", ret);
	while (1)
	{
		printf("猜一个吧:");
		scanf("%d", &num);
		if (num > ret)
		{
			printf("猜大了\n");
		}
		else if (num < ret)
		{
			printf("猜小了\n");
		}
		else
		{
			printf("恭喜你猜对了!!!\n");
			break;
		}

	}
}

4.最终成果展示

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>//包含rand和srand函数
#include<time.h>//包含time函数
void menu()
{
	printf("****************\n");
	printf("*    1.play    *\n");
	printf("*    0.exit    *\n");
	printf("****************\n");
}
void game()
{
	int ret = rand()%100+1;
	int num = 0;
	//printf("%d\n", ret);
	while (1)
	{
		printf("猜一个吧:");
		scanf("%d", &num);
		if (num > ret)
		{
			printf("猜大了\n");
		}
		else if (num < 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("选择错误,请重新输入");
			break;
		}

	} while (input);
	return 0;
}

这游戏我能玩一天!!!?


如果你觉得这篇文章还不错并且对你有帮助,不妨动动手指点赞收藏加转发,给一个大大的关注

你们的每一次支持都将转化为我前进的动力!!!

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-10-31 11:35:33  更:2022-10-31 11:37:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 3:41:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码