送女朋友一个猜数字小游戏,猜对了会显示爱心(给你心爱的他或她一个惊喜)

        起因是我在学习C语言完成老师布置C语言写一个猜数字的作业,突发奇想,能不能在这个猜对了之后弹出一个不一样的页面,然后就试试看能不能实现。基本思路是这样的:

1:先写一个C语言的猜数字的小游戏,在我上个文章有思路代码如下:链接挂这了:C语言猜数字小游戏-CSDN博客

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{printf("****   猜数字游戏!   ****\n");printf("****   按1开始游戏   ****\n");printf("****   按0退出游戏   ****\n");
}
void game()
{int ret = rand()%100+1;//printf("%d\n", ret);int num = 0;int cnt = 10;int sum = cnt;while (1){printf("你还有%d次机会\n", cnt);printf("请输入一个1-100之间的数:");scanf("%d", &num);if (num > ret){printf("数字太大了!\n");}else if (num < ret){printf("数字太小了!\n");}else{printf("恭喜你猜对了!\n");printf("猜对用了%d次\n", sum-cnt);break;}cnt--;if (cnt == 0){printf("你的机会用完了,游戏结束!\n");printf("正确的数字是%d\n\n\n", ret);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);return 0;
}

2:在此代码的基础上添加一些函数,在game()函数完成后实现弹出动画心形的思路

        2.1:首先要定义出这个心形的基本参数

float f(float x, float y, float z) 
{float a = x * x + 9.0f / 4.0f * y * y + z * z - 1;return a * a * a - x * x * z * z * z - 9.0f / 80.0f * y * y * z * z * z;
}float h(float x, float z) 
{for (float y = 1.0f; y >= 0.0f; y -= 0.001f)if (f(x, y, z) <= 0.0f)return y;return 0.0f;
}void color() 
{system("color c");
}

 3:这三个函数就可以实现一个跳动的心,然后在心形的下面放置你想对他说的话,代码如下:

void sentance() 
{char title1[] = "============ 2021 12 05 ============";char title2[] = "============ 2023 12 05 ============";          //输入标题char word[] = "====== 两周年快乐,我爱你宝贝!======";  //输入想说的文字printf("\n\t      ");                                         //调整格式printf("%s", title1);printf("\n\t      ");                                         //调整格式printf("%s", title2);printf("\n\t      ");printf("%s", word);
}

4:文字都可以自己添加,你想再多加几行也可以,直接多写几个char字符串最后再打印出来就可以。然后就是函数调用的问题;

我们可以在设置一个函数,这个函数可以让你的心形具有跳动的功能,代码如下:

int langman() 
{HANDLE o = GetStdHandle(STD_OUTPUT_HANDLE);_TCHAR buffer[25][80] = { _T(' ') };_TCHAR ramp[] = _T(".:-=+*#%@");for (float t = 0.0f;; t += 0.1f) {int sy = 0;float s = sinf(t);float a = s * s * s * s * 0.2f;for (float z = 1.3f; z > -1.2f; z -= 0.1f) {_TCHAR* p = &buffer[sy++][0];float tz = z * (1.2f - a);for (float x = -1.5f; x < 1.5f; x += 0.05f) {float tx = x * (1.2f + a);float v = f(tx, 0.0f, tz);if (v <= 0.0f) {float y0 = h(tx, tz);float ny = 0.01f;float nx = h(tx + ny, tz) - y0;float nz = h(tx, tz + ny) - y0;float nd = 1.0f / sqrtf(nx * nx + ny * ny + nz * nz);float d = (nx + ny - nz) * nd * 0.5f + 0.5f;*p++ = ramp[(int)(d * 5.0f)];}else*p++ = ' ';}}for (sy = 0; sy < 25; sy++) {COORD coord = { 0, sy };SetConsoleCursorPosition(o, coord);WriteConsole(o, buffer[sy], 79, NULL, 0);}Sleep(33);color();sentance();}
}

5:写到这函数基本就成形了,只差一个主函数了,我们再把主函数给它加上

代码如下:

int main()
{srand((unsigned int)time(NULL));int input = 0;do{menu();printf("请选择你需要的操作->");if (scanf("%d", &input) != 1 || (input != 0 && input != 1)){printf("输入错误,请重新输入!\n");while (getchar() != '\n');continue;}switch (input){case 1:game();break;case 0:printf("退出游戏!\n");break;default:/*printf("输入错误,请重新输入!\n");*/break;}} while (input != 0);return 0;
}

        当然还有猜数字游戏的主体函数以及菜单函数,这个我们先不着急,感兴趣的朋友可以直接复制下面的完整代码运行试试:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include <math.h>
#include <windows.h>
#include <tchar.h>void menu()
{printf("*********************************\n");printf("****   玩一个猜数字游戏吧!  ****\n");printf("****   规定步数内完成有惊喜  ****\n");printf("****   请按'1'可以开始游戏   ****\n");printf("****   请按'0'可以退出游戏   ****\n");printf("*********************************\n");
}void game()
{int ret = rand() % 100 + 1;int num = 0;int cnt = 10;int sum = cnt;while (cnt > 0){printf("你还有%d次机会\n", cnt);printf("请输入一个1-100之间的数:");if (scanf("%d", &num) != 1 || num < 1 || num > 100){printf("输入错误,请重新输入一个1-100之间的数\n");while (getchar() != '\n');continue;}if (num > ret){printf("\n数字太大了!\n\n");}else if (num < ret){printf("\n数字太小了!\n\n");}else{printf("\n恭喜你猜对了!\n\n");langman();printf("\n猜对用了%d次\n\n\n", sum - cnt + 1);return;}cnt--;}printf("你的机会用完了,游戏结束!\n");printf("正确的数字是%d\n\n\n", ret);
}float f(float x, float y, float z) 
{float a = x * x + 9.0f / 4.0f * y * y + z * z - 1;return a * a * a - x * x * z * z * z - 9.0f / 80.0f * y * y * z * z * z;
}float h(float x, float z) 
{for (float y = 1.0f; y >= 0.0f; y -= 0.001f)if (f(x, y, z) <= 0.0f)return y;return 0.0f;
}void color() 
{system("color c");
}void sentance() 
{char title1[] = "============ 2021 12 05 ============";char title2[] = "============ 2023 12 05 ============";          //输入标题char word[] = "====== 两周年快乐,我爱你宝贝!======";  //输入想说的文字printf("\n\t      ");                                         //调整格式printf("%s", title1);printf("\n\t      ");                                         //调整格式printf("%s", title2);printf("\n\t      ");printf("%s", word);
}int langman() 
{HANDLE o = GetStdHandle(STD_OUTPUT_HANDLE);_TCHAR buffer[25][80] = { _T(' ') };_TCHAR ramp[] = _T(".:-=+*#%@");for (float t = 0.0f;; t += 0.1f) {int sy = 0;float s = sinf(t);float a = s * s * s * s * 0.2f;for (float z = 1.3f; z > -1.2f; z -= 0.1f) {_TCHAR* p = &buffer[sy++][0];float tz = z * (1.2f - a);for (float x = -1.5f; x < 1.5f; x += 0.05f) {float tx = x * (1.2f + a);float v = f(tx, 0.0f, tz);if (v <= 0.0f) {float y0 = h(tx, tz);float ny = 0.01f;float nx = h(tx + ny, tz) - y0;float nz = h(tx, tz + ny) - y0;float nd = 1.0f / sqrtf(nx * nx + ny * ny + nz * nz);float d = (nx + ny - nz) * nd * 0.5f + 0.5f;*p++ = ramp[(int)(d * 5.0f)];}else*p++ = ' ';}}for (sy = 0; sy < 25; sy++) {COORD coord = { 0, sy };SetConsoleCursorPosition(o, coord);WriteConsole(o, buffer[sy], 79, NULL, 0);}Sleep(33);color();sentance();}
}int main()
{srand((unsigned int)time(NULL));int input = 0;do{menu();printf("请选择你需要的操作->");if (scanf("%d", &input) != 1 || (input != 0 && input != 1)){printf("输入错误,请重新输入!\n");while (getchar() != '\n');continue;}switch (input){case 1:game();break;case 0:printf("退出游戏!\n");break;default:/*printf("输入错误,请重新输入!\n");*/break;}} while (input != 0);return 0;
}

        

        试运行之后我们发现有一个问题,就是猜出来数字之后,图像立马就出现了,没有惊喜感,那我们就再加一个定时器函数,让猜对了之后屏幕上暂停几秒,最好能在暂停的时候屏幕上出现一些文字提示,说干就干,代码如下:

void settime(int seconds)
{for (int i = seconds; i > 0; i--){system("cls"); // 清空屏幕printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");printf("\t\t\t\t\t\t\t%d\n\n\n\n\n\n\n\n\n", i); // 放大居中显示倒计时数字Sleep(1000); // 暂停1秒}system("cls"); // 清空屏幕}

        这样屏幕上会短暂的出现自定义秒数的倒计时,如果你想添加别的文字也可以直接在函数中printf,接下哎代码基本上就大功告成了。

完整代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include <math.h>
#include <windows.h>
#include <tchar.h>void menu()
{printf("*********************************\n");printf("****   玩一个猜数字游戏吧!  ****\n");printf("****   规定步数内完成有惊喜  ****\n");printf("****   请按'1'可以开始游戏   ****\n");printf("****   请按'0'可以退出游戏   ****\n");printf("*********************************\n");
}void settime(int seconds)
{for (int i = seconds; i > 0; i--){system("cls"); // 清空屏幕printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");printf("\t\t\t\t\t\t\t%d\n\n\n\n\n\n\n\n\n", i); // 放大居中显示倒计时数字Sleep(1000); // 暂停1秒}system("cls"); // 清空屏幕}void game()
{int ret = rand() % 100 + 1;int num = 0;int cnt = 10;int sum = cnt;while (cnt > 0){printf("你还有%d次机会\n", cnt);printf("请输入一个1-100之间的数:");if (scanf("%d", &num) != 1 || num < 1 || num > 100){printf("输入错误,请重新输入一个1-100之间的数\n");while (getchar() != '\n');continue;}if (num > ret){printf("\n数字太大了!\n\n");}else if (num < ret){printf("\n数字太小了!\n\n");}else{printf("\n恭喜你猜对了!\n\n");settime(3);langman();printf("\n猜对用了%d次\n\n\n", sum - cnt + 1);return;}cnt--;}printf("你的机会用完了,游戏结束!\n");printf("正确的数字是%d\n\n\n", ret);
}float f(float x, float y, float z) 
{float a = x * x + 9.0f / 4.0f * y * y + z * z - 1;return a * a * a - x * x * z * z * z - 9.0f / 80.0f * y * y * z * z * z;
}float h(float x, float z) 
{for (float y = 1.0f; y >= 0.0f; y -= 0.001f)if (f(x, y, z) <= 0.0f)return y;return 0.0f;
}void color() 
{system("color c");
}void sentance() 
{char title1[] = "============ 2021 12 05 ============";char title2[] = "============ 2023 12 05 ============";          //输入标题char word[] = "====== 两周年快乐,我爱你宝贝!======";  //输入想说的文字printf("\n\t      ");                                         //调整格式printf("%s", title1);printf("\n\t      ");                                         //调整格式printf("%s", title2);printf("\n\t      ");printf("%s", word);
}int langman() 
{HANDLE o = GetStdHandle(STD_OUTPUT_HANDLE);_TCHAR buffer[25][80] = { _T(' ') };_TCHAR ramp[] = _T(".:-=+*#%@");for (float t = 0.0f;; t += 0.1f) {int sy = 0;float s = sinf(t);float a = s * s * s * s * 0.2f;for (float z = 1.3f; z > -1.2f; z -= 0.1f) {_TCHAR* p = &buffer[sy++][0];float tz = z * (1.2f - a);for (float x = -1.5f; x < 1.5f; x += 0.05f) {float tx = x * (1.2f + a);float v = f(tx, 0.0f, tz);if (v <= 0.0f) {float y0 = h(tx, tz);float ny = 0.01f;float nx = h(tx + ny, tz) - y0;float nz = h(tx, tz + ny) - y0;float nd = 1.0f / sqrtf(nx * nx + ny * ny + nz * nz);float d = (nx + ny - nz) * nd * 0.5f + 0.5f;*p++ = ramp[(int)(d * 5.0f)];}else*p++ = ' ';}}for (sy = 0; sy < 25; sy++) {COORD coord = { 0, sy };SetConsoleCursorPosition(o, coord);WriteConsole(o, buffer[sy], 79, NULL, 0);}Sleep(33);color();sentance();}
}int main()
{srand((unsigned int)time(NULL));int input = 0;do{menu();printf("请选择你需要的操作->");if (scanf("%d", &input) != 1 || (input != 0 && input != 1)){printf("输入错误,请重新输入!\n");while (getchar() != '\n');continue;}switch (input){case 1:game();break;case 0:printf("退出游戏!\n");break;default:/*printf("输入错误,请重新输入!\n");*/break;}} while (input != 0);return 0;
}

运行兄弟们自己试试,绝对惊喜!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/193938.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

StackGres 1.6 数据库平台工程功能介绍以及快速上手

StackGres 1.6 数据库平台工程功能 声明式 K8S CRs StackGres operator 完全由 Kubernetes 自定义资源管理。除了 kubectl 或任何其他 Kubernetes API 访问之外&#xff0c;不需要安装任何客户端或其他工具来管理 StackGres。您的请求由 CRD 的 spec 部分表示&#xff0c;任何 …

Redis 数据结构详解

分类 编程技术 Redis 数据类型分为&#xff1a;字符串类型、散列类型、列表类型、集合类型、有序集合类型。 Redis 这么火&#xff0c;它运行有多块&#xff1f;一台普通的笔记本电脑&#xff0c;可以在1秒钟内完成十万次的读写操作。 原子操作&#xff1a;最小的操作单位&a…

MySql下载和安装

MySql下载和安装 一、概述 MySQL是一个开放源代码的关系型数据库管理系统 &#xff0c;由瑞典MySQL AB&#xff08;创始人Michael Widenius&#xff09;公 司1995年开发&#xff0c;迅速成为开源数据库的 No.1。 二、下载和安装 下载地址&#xff1a;https://dev.mysql.com…

Python编程技巧 – 迭代器(Iterator)

Python编程技巧 – 迭代器(Iterator) By JacksonML Iterator(迭代器)是Python语言的核心概念之一。它常常与装饰器和生成器一道被人们提及&#xff0c;也是所有Python书籍需要涉及的部分。 本文简要介绍迭代器的功能以及实际的案例&#xff0c;希望对广大读者和学生有所帮助。…

Xshell会话文件解密获取密码

Xshell会话文件解密获取密码 开发了一个小工具用于获取已存储的xshell会话密码功能简介截图展示下载地址 开发了一个小工具用于获取已存储的xshell会话密码 在日常开发中&#xff0c;服务器太多&#xff0c;密码记不住。使用xshell管理服务器会话&#xff0c;记住密码&#xf…

Linux网络之连接跟踪 conntrack

一 Linux网络之连接跟踪 conntrack k8s 有关conntrack的分析 ① 什么是连接跟踪 netfilter连接跟踪 conntrack 详述 思考&#xff1a;连接跟踪模块会对哪些协议进行跟踪?TCP、UDP、ICMP、DCCP、SCTP、GRE ② 为什么需要连接跟踪 没有连接跟踪有很多问题是不好解决的&a…

牛客在线编程(SQL大厂面试真题)

1.各个视频的平均完播率_牛客题霸_牛客网 ROP TABLE IF EXISTS tb_user_video_log, tb_video_info; CREATE TABLE tb_user_video_log (id INT PRIMARY KEY AUTO_INCREMENT COMMENT 自增ID,uid INT NOT NULL COMMENT 用户ID,video_id INT NOT NULL COMMENT 视频ID,start_time d…

最大乘积分解(动态规划)

相较于我上一题写的动态规划&#xff0c;这一题比较简单 代码如下&#xff1a; #include<stdio.h>int main(void) {long long n, max[101] {0, 1};scanf("%lld", &n);for(int i 1; i < n; i)max[i] i;for(int i 1; i < n; i)for(int j 1; j &…

springboot数据源配置

springboot数据源配置 数据层解决方案——持久化技术 内置持久化解决方案——jdbcTemplate 内置数据库 H2一般用于测试环境&#xff0c;配置profiels&#xff0c;只在开发阶段使用&#xff0c;让他在上线的时候不走这里就可以了 要使用内嵌的数据库H2,要先导入jar包

设置WPF启动画面

WPF启动时间比较长&#xff0c;总让人觉得程序好像没有启动起来&#xff0c;所以想设置一个启动画面 发现WPF设置启动画面竟然如此的简单 第一步将图片放置在主工程目录下&#xff0c;如下图 第二步 将图片生成属性设置为SplashScreen即可 第三步 启动项目你就看到效果了

MDETR 论文报告

MDETR - Modulated Detection for End-to-End Multi-Modal Understanding MDETR - Modulated Detection for End-to-End Multi-Modal Understanding发现问题主要贡献和创新点主要方法和技术MDETR 的架构损失函数1. 框预测损失2. 软标记预测损失3. 对比对齐损失4. 总损失 实验和…

充电桩新老国标兼容性分析

1、背景介绍 1.1、充电桩相关标准发展历程 1.2、兼容性分析历史 1.3、兼容性分析的目的 1.4、兼容性分析的内容 2、B类协议兼容性分析 2.1、协议分层结构 2.2、链路层分析 2.3、版本协商与链路检测 ## 2.4、传输层分析 2.5、应用层 2.5.1、应用层数据 2.5.2、应用层数据…

链表【1】

文章目录 &#x1f348;2. 两数相加&#x1f34c;1. 题目&#x1f34f;2. 算法原理&#x1f353;3. 代码实现 &#x1f349;445. 两数相加 II&#x1f34d;1. 题目&#x1f350;2. 算法原理&#x1fad0;3. 代码实现 &#x1f348;2. 两数相加 &#x1f34c;1. 题目 题目链接&…

springboot整合easy-es实现数据的增删改查

背景 目前公司的一个老项目&#xff0c;查询贼慢&#xff0c;需要想办法提升一下速度&#xff0c;于是就想到了ES&#xff0c;现在尝试一下将ES整合到项目中来提升检索效率。 ES是基于倒排索引实现的&#xff0c;倒排索引中一个表相当于一个索引&#xff0c;表中的每条记录都…

【【Micro Blaze 的 最后补充 与 回顾 】】

Micro Blaze 的 最后补充 与 回顾 Micro Blaze 最小系统 以 MicroBlaze 为核心、LocalMemory&#xff08;片上存储&#xff09;为内存&#xff0c;加上传输信息使用的 UART串口就构成了嵌入式最小系统。当程序比较简单时&#xff0c;Local Memory 可以作为程序的运行空间以及…

VUE语法--img图片不显示/img的src动态赋值图片显示

1、问题概述 常见情景1&#xff1a;在VUE中使用img显示图片的时候&#xff0c;通过传参的方式传入图片的路径和名称&#xff0c;VUE不加载本地资源而是通过http://localhost:8080/...的地址去加载网络资源&#xff0c;从而出现了图片无法显示的情况。 常见情景2&#xff1a;针…

python装饰器解析(关键点:高阶函数、嵌套函数)(参数化装饰器、类装饰器)

文章目录 Python装饰器解析什么是Python装饰器基础理解 如何创建装饰器&#xff08;关键点&#xff1a;高阶函数、嵌套函数&#xff09;创建基础装饰器 使用装饰器使用示例 装饰器的返回值参数化装饰器创建参数化装饰器语法示例使用示例 类装饰器创建类装饰器语法示例使用示例 …

Javaweb之Vue组件库Element案例异步数据加载的详细解析

4.4.3.6 异步数据加载 4.4.3.6.1 异步加载数据 对于案例&#xff0c;我们只差最后的数据了&#xff0c;而数据的mock地址已经提供&#xff1a;http://yapi.smart-xwork.cn/mock/169327/emp/list 我们最后要做的就是异步加载数据&#xff0c;所以我们需要使用axios发送ajax请…

解决vscode中html部分无法嵌套注释

不管是React项目还是Vue项目&#xff0c;相信你一定遇到过同样的问题&#xff0c;如果想要注释的结构内部也存在注释&#xff0c;那么编译器会报以下问题 使用 HTML-Comment 这个插件即可解决问题 选中需要注释的区域并根据系统输入快捷键&#xff0c;可以发现就算嵌套了注释…

【Windows】如何实现 Windows 上面的C盘默认文件夹的完美迁移

如何实现 Windows 上面的C盘默认文件夹的完美迁移 1. 遇到的问题 在我想迁移C盘的 下载 和 视频 文件夹的时候&#xff0c;遇到了这样的问题&#xff0c;在迁移之后&#xff0c;我显卡录像的视频还是保存到了C盘默认位置里&#xff0c;以及我迁移了 下载 之后下载的盘依然是在…