C++ 汉诺塔综合演示项目实现
技术约束
- 不允许使用尚未讲授过的后续课程知识点,如指针、引用、结构体、类等。
- 已学知识中,不允许使用 goto、全局变量(特定允许项除外)、C++ string 变量。
- 不允许使用 scanf/printf 进行输入/输出。
- 代码需达到'0 errors, 0 warnings'。
功能需求
将汉诺塔各小题集成在一个程序中,用菜单方式进行选择,并加入图形化演示要求(cmd 窗口中简单的图形显示)。
菜单选项:
- 基本解
- 基本解 (步数记录)
- 内部数组显示 (横向)
- 内部数组显示 (纵向 + 横向)
- 图形解 - 预备 - 画三个圆柱
- 图形解 - 预备 - 在起始柱上画 n 个盘子
- 图形解 - 预备 - 第一次移动
- 图形解 - 自动移动版本
- 图形解 - 游戏版
- 退出
工具库说明
伪图形界面下基本功能函数及图形工具函数集。
- cmd_console_tools.cpp / .h: 清屏及移动字符光标等功能。
- cmd_hdc_tools.cpp / .h: 伪图形界面下基本功能函数的具体实现。
- test-hdc.cpp: 测试用例。
注:cmd_console_tools 中的 cct_* 和 cmd_hdc_tools 中的 hdc_* 系列函数已能满足所有需求,不需要额外添加伪图形界面类的函数。
项目结构
建议建立项目包含以下文件:
- cmd_console_tools.cpp / .h
- cmd_hdc_tools.cpp / .h
- hanoi.h: 本项目头文件
- hanoi_const_value.h: 本项目头文件 (只读常量定义)
- hanoi_menu.cpp: 菜单的显示与选择
- hanoi_multiple_solutions.cpp: 菜单中各项汉诺塔演示的实现
- hanoi_main.cpp: main 函数
注意:生成的 exe 文件名应为 90-b1.exe。部分基础工具文件 (.h/.cpp) 通常作为依赖不修改,核心逻辑文件需提交。
变量管理
下列内容允许使用全局变量记录,其余均不允许(全局 const 变量/#define 宏定义数量不受限制):
- 总移动步数:1 个全局简单变量/静态局部变量
- 圆柱上现有圆盘的编号:3 个全局一维数组或 1 个全局二维数组
- 圆柱上现有圆盘的数量:3 个全局简单变量或 1 个全局一维数组
- 延时:1 个全局简单变量
功能模块详解
- 菜单项 1-4: 之前小作业的整合,占一定分数权重。
- 菜单项 5: 在屏幕上画出三根圆柱,为方便观察实现过程,需要加延时。
- 菜单项 6: 假设三根圆柱的编号从左到右分别为 ABC,要求输入起始圆柱的编号 (A-C),圆盘的数量 (限制在 1-10 之间),在起始圆柱上从上到下/从小到大依次画出 n 个圆盘,每个圆盘的颜色各不相同,需要加延时。
- 菜单项 7: 在菜单项 6 的基础上,完成第一个圆盘的移动。第一次移动并不一定是从源柱->目标柱,也可能是源柱->中间柱。移动的时候,有些延时是必须加的,否则无法模拟出移动效果。不允许直接在两个圆柱间移动,必须先上移、再平移、再下移。
- 菜单项 8: 汉诺塔演示过程的完整实现,每次圆盘的移动方式也必须是上移、平移、下移。
- 菜单项 9: 汉诺塔游戏 (人工操作移动步骤)。每次键盘输入两个字母 (A-C) 之间,大小写均可,表示本次移动的源柱和目标柱。移动时要检查合理性,若不符合移动规则 (大盘压小盘、源柱为空等) 要提示出错并重输,每次合理的移动都必须记录步数。待所有盘子按序移动到结束柱则提示'游戏结束'。本小题不需要调用递归函数。

