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

        起因是我在学习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…

无懈可击的身份验证:深入了解JWT的工作原理

&#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 无懈可击的身份验证&#xff1a;深入了解JWT的工作原理 前言JWT的基础概念基本概念JWT的工作流程注意事项 JWT的工作原理生成令牌传输令牌验证令牌 JWT的安全性考量1. 使用强…

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;希望对广大读者和学生有所帮助。…

自然语言处理(NLP)技术-AI生成版

自然语言处理&#xff08;NLP&#xff09;是一种涵盖众多技术的交叉学科&#xff0c;旨在使计算机能够理解、生成和处理自然语言文本。它涉及语言学、计算机科学、统计学和人工智能等多个领域。下面将举例说明NLP技术在实际应用中的一些场景。 情感分析 情感分析是指使用NLP技…

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…

WebGL笔记:js中矩阵库的使用

矩阵库 手写矩阵&#xff0c;其实很麻烦&#xff0c;可以将其模块化市面上已经有许多开源的矩阵库 比如《WebGL 编程指南》里的 cuon-matrix.jsthree.js 的 Matrix3 和 Matrix4 对象 three.js的 Matrix4 对象的用法 1 &#xff09;核心代码 1.引入Matrix4对象 import { Mat…

Spring一些基础问题整理

备注&#xff1a;针对基本问题做一些基本的总结&#xff0c;不是详细解答&#xff01; 1.Spring Boot与以前的Spring有什么区别&#xff1f; 具体可以见博客&#xff1a; 微服务架构具体实现工具框架&#xff1a;Spring Boot概览与核心原理 https://blog.csdn.net/xiaofeng103…

牛客在线编程(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即可 第三步 启动项目你就看到效果了

java面经1day

String, StringBuffer,StringBuilder的区别 从俩方面开始下手 是否可变 是否安全 回答: String是final实现&#xff0c;其为不可变长&#xff0c;每次变长都会新增对象。而StringBuffer,StringBuilder他们的父类都是AbstractStringBuilder 然后安全&#xff1a;String因为…

Python换硬币

将一笔零钱换成5分、2分和1分的硬币&#xff0c;要求每种硬币至少有一枚。 输入格式: 输入在一行中给出待换的零钱数额x∈(8,100)。 输出格式: 要求按5分、2分和1分硬币的数量依次从大到小的顺序&#xff0c;输出各种换法。每行输出一种换法&#xff0c;格式为&#xff1a;…

[原创][4]探究C#多线程开发细节-“初步体验ManualResetEvent类带来的同步效果“

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XXQQ: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、Delphi…

JavaWeb | JSP内置对象

目录&#xff1a; 1.认识JSP内置对象2.JSP内置对象的特点3.九大内置对象3.1 out对象的作用向 “客户端” 输出各种数据内容对 “服务器” 上的输出缓冲区进行管理 3.2 request对象的作用能够获取客户端的基本信息 3.3 response对象的作用利用response对象进行 “重定向”利用re…

重积分的应用@物理应用部分@质心@转动惯量@引力

文章目录 abstract相关概念质心重心 质心的计算平面质心基本概念薄片质心静矩元素薄片质心坐标均匀薄片的质心形心坐标例 对称图形的质心例空间体的质心均匀半球的质心 转动惯量平面薄片的转动惯量计算方法空间体的情形例例 引力(*) abstract 重积分的应用(物理应用) 质心转动…

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. 总损失 实验和…