創建 VC++ 項目後,`cpp` 文件裡自動生成大量代碼(`stdafx.h`、`_tmain`、`CWinApp` 等),不知從何下手寫貪吃蛇。
| 維度 | 控制台應用 | MFC 圖形界面 |
|---|---|---|
| 項目類型 | Win32 Console Application | MFC Application (Dialog/SDI/MDI) |
| 核心庫 | 純 C++ STL、Windows API (SetConsoleCursorPosition) | MFC 封裝類 (CDC、CWnd、CBitmap、Timer) |
| 繪製方式 | 字符陣列 + 控制台光標移動 | 雙緩衝繪圖 (BitBlt)、GDI+ |
| 輸入處理 | `_kbhit()` + `_getch()` 非阻塞鍵盤 | 消息映射 `ON_WM_KEYDOWN` / `PreTranslateMessage` |
| 學習曲線 | 平緩,專注邏輯算法 | 陡峭,需懂消息泵、文檔/視圖架構 |
| 推薦場景 | **初學者首選**、算法驗證、課程作業 | 有 Windows 桌面開發基礎、需精美 UI |
// 核心結構
struct Point { int x, y; };
deque<Point> snake; // 身體節點
Point food; // 食物
int dir; // 方向: 0上 1下 2左 3右
// 主循環
while (running) {
if (_kbhit()) handleInput(_getch()); // 非阻塞讀鍵
moveSnake(); // 更新座標
checkCollision(); // 牆/自身/食物
render(); // 清屏 + 重繪字符陣列
Sleep(100); // 速度控制
}
// 渲染關鍵:SetConsoleCursorPosition + printf
無需理會 VS 生成的 `stdafx.h`,直接在 `_tmain` 寫邏輯,或新建 `Snake.cpp/h` 包含類封裝。
void CSnakeDlg::OnPaint() {
CPaintDC dc(this);
CRect rect; m_gameArea.GetClientRect(&rect);
CDC memDC; memDC.CreateCompatibleDC(&dc);
CBitmap bmp; bmp.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height());
memDC.SelectObject(&bmp);
// 在 memDC 上繪製蛇、食物、網格...
dc.BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);
}
先走控制台路線。 用純 C++ 實現邏輯(數據結構:隊列/鏈表、算法:碰撞檢測、隨機生成),跑通後再考慮遷移到 MFC/QT 做圖形化。VS 生成的樣板代碼(`stdafx.h`、`CWinApp`)是項目基礎設施,**不用看懂每一行**,只需知道入口在 `_tmain` 或 `CWinApp::InitInstance`,業務代碼寫在自己的類/函數裡即可。