首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

漢諾塔遊戲 C++ 實作:遞歸演示、使用者互動與撤銷功能完整代碼

     編輯:關於VC++

專案概述

經典漢諾塔遞歸問題的圖形化遊戲實作,包含:使用者手動拖曳移動、自動遞歸演示、撤銷功能、關卡選擇 (最多 8 層,受堆疊限制)。

核心類別設計

CMap - 單步狀態記錄與繪圖

  • iCount[3]:三根柱子各自的圓盤數量
  • Rect[3][NUM]:每根柱子上每個圓盤的矩形區域
  • 建構函數初始化:所有圓盤在柱子 0,依大小堆疊
  • operator= 深拷貝支援狀態記錄
  • OnDraw(HDC):遍歷繪製所有圓盤

Hanio - 遊戲主邏輯

class Hanio {
public:
    int iStep;              // 目前步數
    CMap Record[MAXSTEP];   // 歷史狀態記錄

    Hanio();                // 初始化 iStep=0, Record
    void OnDraw(HDC hdc);   // 繪製目前步驟
    void Undo();            // 撤銷:iStep--, 重繪
    void Move(int iStart, int iEnd);  // 移動圓盤,合法性檢查
    void AutoMove(int iA, int iB, int iC, int iNum); // 遞歸自動演示
};

關鍵演算法細節

Move - 移動合法性檢查

  1. 起始/目標柱索引有效性 (0~2)
  2. 不可移動至相同柱子
  3. 起始柱必須有圓盤
  4. **大盤不可疊小盤**:目標柱頂盤寬度 < 移動盤寬度 時拒絕

合法則:記錄新狀態至 Record[++iStep],更新圓盤矩形位置 (目標柱頂部),觸發 WM_PAINT 重繪。

AutoMove - 遞歸自動演示

void Hanio::AutoMove(int iA, int iB, int iC, int iNum) {
    if (iNum == 3) {  // 基礎案例:3 盤固定 7 步
        Move(iA, iC); Sleep(500);
        Move(iA, iB); Sleep(500);
        Move(iC, iB); Sleep(500);
        Move(iA, iC); Sleep(500);
        Move(iB, iA); Sleep(500);
        Move(iB, iC); Sleep(500);
        Move(iA, iC); Sleep(500);
    } else {          // 遞歸分解
        AutoMove(iA, iC, iB, iNum-1);
        Move(iA, iC); Sleep(500);
        AutoMove(iB, iA, iC, iNum-1);
    }
}

注意:Sleep 阻塞訊息迴圈,自動演示期間無法響應其他操作。生產環境建議改用多執行緒或計時器分步驟執行。

執行畫面

漢諾塔遊戲畫面

技術限制與改進方向

  • 最大 8 層 (堆疊/遞歸深度限制)
  • 自動演示阻塞 UI,建議改為狀態機 + 計時器或背景執行緒
  • 可增加步數計數、最佳解提示、動畫緩動效果
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved