当前位置: 首页 > news >正文

趣味编程:答案之书

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

目录

 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.小结

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

 

相关文章:

  • viewDesign里的table内嵌套select动态添加表格行绑定内容丢失
  • string[字符串中第一个的唯一字符][蓝桥杯]
  • Matlab 车辆四自由度垂向模型平稳性
  • 基于C#的CAN总线通信开发指南
  • 在Postman中高效生成测试接口:从API文档到可执行测试的完整指南
  • windows的rancherDesktop修改镜像源
  • 算法训练营第十一天|150. 逆波兰表达式求值、239. 滑动窗口最大值、347.前 K 个高频元素
  • 安卓应用卡顿、性能低下的背后原因
  • goner/otel 在Gone框架接入OpenTelemetry
  • stable-diffusion windows本地部署
  • Spring AI 集成 DeepSeek V3 模型开发指南
  • 【C++】C++函数指针详解与实用技巧
  • 小白借助ai对全栈进行浅浅理解(学习笔记)-Lambda、Optional 避免空指针与新的日期时间 API
  • 南邮计科电工电子实验第五次课与非门设计数字锁逻辑电路小测答案
  • 线程池的核心参数和线程创建方式,线程和进程
  • 介绍Unity中的Dictionary
  • 【RAG技术全景解读】从原理到工业级应用实践
  • 树莓派5+Ubuntu24.04 LTS串口通信 保姆级教程
  • Mockoon 使用教程
  • 解决:‘java‘ 不是内部或外部命令,也不是可运行的程序-Java环境变量配置(含JDK8、JDK21安装包一站式配置)
  • 长期对组织隐瞒真实年龄,广元市城发集团原董事韩治成被双开
  • 看展览|2025影像上海艺博会:市场与当代媒介中的摄影
  • 全国人大常委会启动食品安全法执法检查
  • 马上评丨行人转身相撞案:走路该保持“安全距离”吗
  • 一周文化讲座|城市移民与数字时代的新工作
  • 国家税务总局泰安市税务局:山东泰山啤酒公司欠税超536万元