趣味编程:答案之书

概述:该篇博客主要介绍的是曾经一度风靡全网的答案之书小程序。

目录

 1. 效果展示

2. 源码展示 

3. 代码逻辑详解

3.1 头文件与全局变量 

3.2  main函数

3.3 主循环

3. 4 绘制界面

4. 运行问题

5.小结


 1. 效果展示

             该小程序是动态的效果, 因此实际运行的效果相较于博客会更具有动态感一点。

2. 源码展示 

#include <graphics.h>
#include <conio.h>
#include <time.h>
#include <vector>
// 答案库
std::vector<const char*> answers =
{"是", "否", "或许", "稍后再问","毫无疑问", "结果未明", "保持期待","别指望", "绝对肯定", "暂时观望","机会渺茫", "积极行动", "改变策略","无法预测", "遵循直觉", "需要努力","时机未到", "放手去做", "谨慎为好"
};
// 窗口尺寸
const int WIDTH = 800;
const int HEIGHT = 600;int main()
{// 初始化图形窗口initgraph(WIDTH, HEIGHT);srand(time(NULL)); // 随机种子bool isPaused = false;int answerIndex = 0;// 主循环while (true){// 检查窗口关闭if (MouseHit()){MOUSEMSG msg = GetMouseMsg();if (msg.uMsg == WM_CLOSE) break;}// 按键检测if (_kbhit()){int key = _getch();if (key == ' ') // 空格键切换暂停状态{isPaused = !isPaused;}}// 非暂停时更新答案if (!isPaused){answerIndex = rand() % answers.size();}// 绘制界面BeginBatchDraw();cleardevice();// 绘制背景setfillcolor(RGB(30, 30, 30));solidrectangle(0, 0, WIDTH, HEIGHT);// 设置文字样式settextstyle(100, 0, "楷体");setbkmode(TRANSPARENT);// 设置文字颜色settextcolor(RGB(200, 200, 100));RECT r = { 0, 0, WIDTH, HEIGHT };drawtext(answers[answerIndex], &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);// 绘制提示文字settextcolor(WHITE);settextstyle(20, 0, _T("宋体"));outtextxy(20, HEIGHT - 50, "按空格键暂停/继续");outtextxy(20, HEIGHT - 30, "点击右上角关闭程序");EndBatchDraw();Sleep(50); // 控制刷新速度}closegraph();return 0;
}

3. 代码逻辑详解

3.1 头文件与全局变量 
#include <graphics.h>
#include <conio.h>
#include <time.h>
#include <vector>
// 答案库
std::vector<const char*> answers =
{"是", "否", "或许", "稍后再问","毫无疑问", "结果未明", "保持期待","别指望", "绝对肯定", "暂时观望","机会渺茫", "积极行动", "改变策略","无法预测", "遵循直觉", "需要努力","时机未到", "放手去做", "谨慎为好"
};
// 窗口尺寸
const int WIDTH = 800;
const int HEIGHT = 600;
  • 引入了多个头文件graphics.h 用于图形界面的绘制,conio.h 用于控制台输入输出,time.h 用于处理时间,vector 用于使用 C++ 的向量容器。
  • answers 是一个存储各种答案的向量,这些答案将在程序中随机显示。
  • WIDTH 和 HEIGHT 定义了图形窗口的宽度和高度。
3.2  main函数
int main()
{// 初始化图形窗口initgraph(WIDTH, HEIGHT);srand(time(NULL)); // 随机种子bool isPaused = false;int answerIndex = 0;
  • initgraph(WIDTH, HEIGHT) 初始化一个指定宽度和高度的图形窗口。
  • srand(time(NULL)) 设置随机数种子,以确保每次运行程序时生成的随机数不同。
  • isPaused 是一个布尔变量,用于表示程序是否处于暂停状态,初始值为 false
  • answerIndex 用于记录当前显示的答案在 answers 向量中的索引,初始值为 0。
3.3 主循环
    // 主循环while (true){// 检查窗口关闭if (MouseHit()){MOUSEMSG msg = GetMouseMsg();if (msg.uMsg == WM_CLOSE) break;}// 按键检测if (_kbhit()){int key = _getch();if (key == ' ') // 空格键切换暂停状态{isPaused = !isPaused;}}// 非暂停时更新答案if (!isPaused){answerIndex = rand() % answers.size();}
  • while (true) 是一个无限循环,程序将在这个循环中不断运行,直到满足特定条件退出。
  • MouseHit() 检查是否有鼠标事件发生,如果有则通过 GetMouseMsg() 获取鼠标消息。如果鼠标消息的类型是 WM_CLOSE(即用户点击了窗口的关闭按钮),则使用 break 语句跳出循环,结束程序。
  • _kbhit() 检查是否有按键被按下,如果有则通过 _getch() 获取按键的 ASCII 码。如果按下的是空格键(ASCII 码为 ' '),则切换 isPaused 的状态。
  • 如果 isPaused 为 false,表示程序未暂停,使用 rand() % answers.size() 随机生成一个 answers 向量的索引,更新 answerIndex
3. 4 绘制界面
        // 绘制界面BeginBatchDraw();cleardevice();// 绘制背景setfillcolor(RGB(30, 30, 30));solidrectangle(0, 0, WIDTH, HEIGHT);// 设置文字样式settextstyle(100, 0, "楷体");setbkmode(TRANSPARENT);// 设置文字颜色settextcolor(RGB(200, 200, 100));RECT r = { 0, 0, WIDTH, HEIGHT };drawtext(answers[answerIndex], &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);// 绘制提示文字settextcolor(WHITE);settextstyle(20, 0, _T("宋体"));outtextxy(20, HEIGHT - 50, "按空格键暂停/继续");outtextxy(20, HEIGHT - 30, "点击右上角关闭程序");EndBatchDraw();Sleep(50); // 控制刷新速度}
  • BeginBatchDraw() 开始批量绘图,避免屏幕闪烁。
  • cleardevice() 清除当前绘图设备上的所有内容。
  • setfillcolor(RGB(30, 30, 30)) 设置填充颜色为深灰色,solidrectangle(0, 0, WIDTH, HEIGHT) 绘制一个填充的矩形作为背景。
  • settextstyle(100, 0, "楷体") 设置文字样式为 100 磅的楷体,setbkmode(TRANSPARENT) 设置文字背景为透明。
  • settextcolor(RGB(200, 200, 100)) 设置文字颜色为浅黄色,drawtext(answers[answerIndex], &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE) 在窗口中心绘制当前的答案。
  • settextcolor(WHITE) 设置提示文字颜色为白色,settextstyle(20, 0, _T("宋体")) 设置提示文字样式为 20 磅的宋体,outtextxy(20, HEIGHT - 50, "按空格键暂停/继续") 和 outtextxy(20, HEIGHT - 30, "点击右上角关闭程序") 在窗口底部绘制提示文字。
  • EndBatchDraw() 结束批量绘图,将绘制的内容一次性显示在屏幕上。
  • Sleep(50) 暂停程序 50 毫秒,控制界面的刷新速度。

4. 运行问题

该程序运行问题的解决如上篇博客所讲:趣味编程:爱心-CSDN博客

5.小结

以上就是本篇博客的所有内容了,如果大家能从中学到知识的话,还请给博主点点赞。

 

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

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

相关文章

多线程初阶(2)

说到多线程编程&#xff0c;一定少不了线程安全这个话题。我们前面了解了线程的原理以及线程与进程的关系。线程之间共享资源&#xff0c;这就代表了在多线程编程中一定会产生冲突&#xff0c;所以我们需要在敲代码时保证线程安全&#xff0c;避免这样的问题发生。 我们先看一…

【Ubuntu】安裝向日葵远程控制

前言 在Ubuntu 24.04.2下安装向日葵远程控制出错&#xff0c;少了一些依赖&#xff0c;需要安装一些依赖。 1.安装gconf2-common wget http://mirrors.kernel.org/ubuntu/pool/universe/g/gconf/gconf2-common_3.2.6-6ubuntu1_all.deb sudo dpkg -i gconf2-common_3.2.6-6ub…

【Python开源】深度解析:一款高效音频封面批量删除工具的设计与实现

&#x1f3b5; 【Python开源】深度解析&#xff1a;一款高效音频封面批量删除工具的设计与实现 &#x1f308; 个人主页&#xff1a;创客白泽 - CSDN博客 &#x1f525; 系列专栏&#xff1a;&#x1f40d;《Python开源项目实战》 &#x1f4a1; 热爱不止于代码&#xff0c;热情…

JAVA房屋租售管理系统房屋出租出售平台房屋销售房屋租赁房屋交易信息管理源码

一、源码描述 这是一套房屋租售管理源码&#xff0c;基于SpringBootVue框架&#xff0c;后端采用JAVA开发&#xff0c;源码功能完善&#xff0c;涵盖了房屋租赁、房屋销售、房屋交易等业务。 二、源码截图

一篇文章讲清楚mysql的聚簇索引、非聚簇索引、辅助索引

聚簇索引与非聚簇索引最大的区别就是&#xff1a; 聚簇索引的索引和数据是存放在一起的&#xff0c;都是在叶子结点&#xff1b; 非聚簇索引的索引和数据是分开存储的&#xff0c;叶子节点存放的是索引和指向数据文件的地址&#xff0c;通过叶子节点找到索引&#xff0c;再通…

使用ESPHome烧录固件到ESP32-C3并接入HomeAssistant

文章目录 一、安装ESPHome二、配置ESP32-C3控制灯1.主配置文件esp32c3-luat.yaml2.基础通用配置base.yaml3.密码文件secret.yaml4.围栏灯four_light.yaml5.彩灯rgb_light.yaml6.左右柱灯left_right_light.yaml 三、安装固件四、HomeAssistant配置ESPHome1.直接访问2.配置ESPHom…

什么是变量提升?

变量提升&#xff08;Hoisting&#xff09; 是 JavaScript 引擎在代码执行前的一个特殊行为&#xff0c;它会将变量声明和函数声明自动移动到当前作用域的顶部。但需要注意的是&#xff0c;只有声明会被提升&#xff0c;赋值操作不会提升。 ​​核心概念​​ 变量声明提升&…

【万字长文】深入浅出 LlamaIndex 和 LangChain:从RAG到智能体,轻松驾驭LLM应用开发

Langchain系列文章目录 01-玩转LangChain&#xff1a;从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块&#xff1a;四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain&#xff1a;从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…

2025 后端自学UNIAPP【项目实战:旅游项目】3、API接口请求封装,封装后的简单测试以及实际使用

一、创建请求封装目录 选中自己的项目&#xff0c;右键鼠标---->新建---->目录---->名字自定义【我的是api】 二、创建两个js封装文件 选中封装的目录&#xff0c;右键鼠标---->新建---->js文件---->名字自定义【我的两个js文件分别是my_http和my_api】 三…

autojs和冰狐智能辅助该怎么选择?

最近打算做自动化脚本&#xff0c;在autojs和冰狐智能辅助中做选择&#xff0c;不知道该怎么选。没办法只能花费大量时间仔细研究了autojs和冰狐智能辅助&#xff0c;综合考虑功能需求、开发复杂度、编程经验及项目规模等因素。以下是两者的核心对比及选择建议&#xff0c;仅供…

python24-匿名函数

课程&#xff1a;B站大学 记录python学习&#xff0c;直到学会基本的爬虫&#xff0c;使用python搭建接口自动化测试就算学会了&#xff0c;在进阶webui自动化&#xff0c;app自动化 匿名函数 匿名函数实践是检验真理的唯一标准 匿名函数 匿名函数是指没有名字的函数&#xff…

Android 查看 Logcat (可纯手机方式 无需电脑)

安装 Logcat Reader Github Google Play 如果有电脑 使用其ADB方式可执行如下命令 后续无需安装Termux # 使用 ADB 授予 android.permission.READ_LOGS 权限给 Logcat Reader adb shell "pm grant com.dp.logcatapp android.permission.READ_LOGS && am force-…

驱动开发硬核特训 · Day 30(上篇):深入理解 I2C 总线驱动模型(以 at24 EEPROM 为例)

作者&#xff1a;嵌入式Jerry 视频教程请关注 B 站&#xff1a;“嵌入式Jerry” 一、写在前面 在上一阶段我们已经深入理解了字符设备驱动与设备模型之间的结合方式、sysfs 的创建方式以及平台驱动模型的实际运用。今天我们迈入总线驱动模型的世界&#xff0c;聚焦于 I2C 总线…

超详细讲解注意力机制、自注意力机制、多头注意力机制、通道注意力机制、空间注意力机制

在如今的机器学习和深度学习领域&#xff0c;注意力机制绝对是一个热度居高不下的话题。事实上&#xff0c;注意力机制并不是一个全新的概念&#xff0c;早在多年前就已经被提出并应用。比如在图像分类任务中&#xff0c;SENet 和 ECA-Net 等模型中都运用了注意力机制&#xff…

Wireshark基本使用

本文会对Wireshark做简单介绍&#xff0c;带大家熟悉一下Wireshark的界面&#xff0c;以及如何使用过滤器。 接着会带大家查看TCP五层模型下&#xff0c;带大家回顾各层首部的格式。 最后会演示 Wireshark 如何抓取三次握手和四次挥手包的过程。 目录 一.Wireshark简介 二…

加速项目落地(Trae编辑器)

目录 vscode安装python支持 vscode常用插件 Trae编辑器 两个界面合成 补充&#xff08;QT开发的繁琐&#xff09; AI编程哪家强&#xff1f;Cursor、Trae深度对比&#xff0c;超详细&#xff01; - 知乎 Trae兼容vscode的插件&#xff0c;我们可以先在vscode里面装好再一…

stable diffusion的attention-map:提取和可视化跨注意力图

项目&#xff1a; wooyeolbaek/attention-map-diffusers: &#x1f680; Cross attention map tools for huggingface/diffusers 参考&#xff1a;【可视化必备技能&#xff08;1&#xff09;】SD / Flux 文生图模型的 Attention Map 可视化-CSDN博客

多环串级PID

文章目录 为什么要多环程序主函数内环外环 双环PID调参内环Kp调法Ki调法 外环Kp 以一定速度到达指定位置封装 为什么要多环 单环只能单一控制速度或者位置&#xff0c;如果想要同时控制多个量如速度&#xff0c;位置&#xff0c;角度&#xff0c;就需要多个PID 速度环一般PI…

基于Kubernetes的Apache Pulsar云原生架构解析与集群部署指南(上)

#作者&#xff1a;闫乾苓 文章目录 概念和架构概述主要特点消息传递核心概念Pulsar 的消息模型Pulsar 的消息存储与分发Pulsar 的高级特性架构BrokerBookKeeperZooKeeper 概念和架构 概述 Pulsar 是一个多租户、高性能的服务器到服务器消息传递解决方案。Pulsar 最初由雅虎开…

电子电气架构 --- 如何有助于提安全性并减少事故

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…