經典漢諾塔遞歸問題的圖形化遊戲實作,包含:使用者手動拖曳移動、自動遞歸演示、撤銷功能、關卡選擇 (最多 8 層,受堆疊限制)。
iCount[3]:三根柱子各自的圓盤數量Rect[3][NUM]:每根柱子上每個圓盤的矩形區域operator= 深拷貝支援狀態記錄OnDraw(HDC):遍歷繪製所有圓盤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); // 遞歸自動演示
};
合法則:記錄新狀態至 Record[++iStep],更新圓盤矩形位置 (目標柱頂部),觸發 WM_PAINT 重繪。
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 阻塞訊息迴圈,自動演示期間無法響應其他操作。生產環境建議改用多執行緒或計時器分步驟執行。
