概述:該篇博客主要介紹的是曾經一度風靡全網的答案之書小程序。
目錄
?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.小結
以上就是本篇博客的所有內容了,如果大家能從中學到知識的話,還請給博主點點贊。
?