汉诺塔游戏的设计(附代码)

C语言 - 汉诺塔详解(超详细) 文章目录一、前言二、汉诺塔打印步数三、汉诺塔打印步骤 一、前言 一、汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。          A       B       C 二、汉诺塔打印步数   1. /******************* 阅读详情

汉诺塔游戏的设计

汉诺塔问题是最经典的递归问题,笔者就该问题设计了这个游戏,由用户交互游戏和自动演示两部分组成,支持撤销功能、选关、自动完成等功能。

  首先建立了类CMap,该类主要实现用户每一步的操作和画图显示功能,记录的时候只须记录每组盘子的个数和盘子的矩形。代码和注释如下:

//记录每一步的盘子的情况
class CMap
{
public:
  //每组盘子的个数
  int iCount[3];
  //3组盘子里面,每个盘子的位置,用矩形表示
  RECT *Rect[3];
  //构造函数
  CMap()
  {
    //三组盘子,每组盘子的矩形
    for(int i=0;i<3;i++)
      Rect[i]=new RECT[NUM];
    //初始化每组盘子的个数
    iCount[0]=NUM;
    iCount[1]=0;
    iCount[2]=0;
    //第一组盘子的矩形的位置
    for(i=0;i<NUM;i++)
    {
      Rect[0][i].left=Center[0]-(NUM-i)*Dx2;
      Rect[0][i].right=Center[0]+(NUM-i)*Dx2;
      Rect[0][i].bottom=(NUM+1-i)*Dx;
      Rect[0][i].top=(NUM-i)*Dx;
    }
    //第二组盘子的矩形初始化为空
    for(i=0;i<NUM;i++)
    {
      Rect[1][i].left=0;
      Rect[1][i].right=0;
      Rect[1][i].bottom=0;
      Rect[1][i].top=0;
    }
    //第三组盘子的矩形初始化为空
    for(i=0;i<NUM;i++)
    {
      Rect[2][i].left=0;
      Rect[2][i].right=0;
      Rect[2][i].bottom=0;
      Rect[2][i].top=0;
    }
  }
  //运算符重载
  CMap operator=(CMap Other)
  {
    //对新的CMap对象,应该重新分配内存
    for(int i=0;i<3;i++)
      Rect[i]=new RECT[NUM];
    //依次赋值
    for(i=0;i<3;i++)
    {
      iCount[i]=Other.iCount[i];
        for(int j=0;j<NUM;j++)
        Rect[i][j]=Other.Rect[i][j];
    }
    //返回
    return *(this);
  }
  //画图,显示盘子的情况
  void OnDraw(HDC hdc)
  {
    //画出每个盘子
    for(int i=0;i<3;i++)
      for(int j=0;j<iCount[i];j++)
        Rectangle(hdc,
          Rect[i][j].left,
          Rect[i][j].top,
          Rect[i][j].right,
          Rect[i][j].bottom);
  }
  //析构函数
  ~CMap()
  {
    //内存的释放
    for(int i=0;i<3;i++)
    {
      if(Rect[i]!=NULL)
      {
        Rect[i]=NULL;
        delete Rect[i];
      }
    }
  }
};
下面是汉诺塔的主类Hanio,该类的成员函数有OnDraw(),Undo(),Move(),AutoMove()等,分别实现汉诺塔的画图显示、撤销、移动盘子、自动移动盘子等功能,代码及注释如下:class Hanio
{
public:
  //当前的步数
  int iStep;
  //记录每一步的盘子的情况
  CMap Record[MAXSTEP];
public:
  //构造函数
  Hanio()
  {
    //初始化,步数为0
    iStep=0;
    //初始化记录
    for(int i=0;i<MAXSTEP;i++)
    {
      Record[i]=CMap();
    }
  }
  //画图,显示汉诺塔的情况
  void OnDraw(HDC hdc)
  {
    Record[iStep].OnDraw(hdc);
  }
  //撤销
  void Undo()
  {
    if(iStep>0)
      iStep--;
    //重绘
    Draw();
  }
  //移动盘子
  void Move(int iStart,int iEnd)
  {
    //得到当前盘子的记录
    CMap Map=Record[iStep];
    //移动的情况判断,去除非法的移动
    if(iStart<0||iStart>=3)
      return;
    if(iEnd<0||iEnd>=3)
      return;
    if(iStart==iEnd)
      return;
    if(Map.iCount[iStart]<1)
      return;
    //得到移动前的开始组,结束组的盘子的个数
    int iStartRectNum=Map.iCount[iStart];
    int iEndRectNum=Map.iCount[iEnd];
    //从小盘子移动到大盘子上面的情况是不可以的。
    if(iEndRectNum>0)
      if(Width(Map.Rect[iStart][iStartRectNum-1])>=Width(Map.Rect[iEnd][iEndRectNum-1]))
        return;
    //步数累加
    iStep++;
    //记录新的盘子的情况
    Record[iStep]=Record[iStep-1];
    //移走的那一组盘子的个数减少
    Record[iStep].iCount[iStart]--;
    //被移到的那一组的盘子个数增加
    Record[iStep].iCount[iEnd]++;
    //重新计算移动后的盘子的矩形
    //主要是被移到的那一组的最上面那个盘子的矩形的计算
    RECT rect;
    rect.left=Center[iEnd]-Width(Map.Rect[iStart][iStartRectNum-1])/2;
    rect.right=Center[iEnd]+Width(Map.Rect[iStart][iStartRectNum-1])/2;
    rect.bottom=(NUM+1-Map.iCount[iEnd])*Dx;
    rect.top=(NUM-Map.iCount[iEnd])*Dx;
    Record[iStep].Rect[iEnd][iEndRectNum]=rect;
    //刷新
    SendMessage(hWnd,WM_PAINT,0,0);
  }
  //自动移盘子
  void AutoMove(int iA,int iB,int iC,int iNum)
  {
    //递归实现自动移盘子
    //递归的出口,如果个数为3,按如下进行移动。
    if(iNum==3)
    {
      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);
    }
    //个数大于3,递归实现移动。
    else
    {
      //递归自动移动。
      AutoMove(iA,iC,iB,iNum-1);
      Move(iA,iC);
      ::Sleep(500);
      AutoMove(iB,iA,iC,iNum-1);
    }
  }
};
程序实现的结果如下图:

汉诺塔游戏的设计

  由于堆栈内存的限制,选关不可能是无限个盘子,本程序设计的最大关数是8。自动移动是用递归实现的,自动移动的过程中,其他消息无法响应,可以改成多线程或由用户控制的形式。上述的程序附有Visual C++源代码,并在Windows XP和Visual C++6.0下调试成功。

 
Python 一步一步教你用pyglet制作汉诺塔游戏(续) 汉诺塔(Tower of Hanoi),是一个源于印度古老传说的益智玩具。这个传说讲述了大梵天创造世界的时候,他做了三根金刚石柱子,并在其中一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门将这些圆盘从下面开始按大小顺序重新摆放在另一根柱子上,并规定在小圆盘上不能放大圆盘,同时在三根柱子之间一次只能移动一个圆盘。当盘子的数量增加时,移动步骤的数量会呈指数级增长,圆盘数为n时,总步骤数steps为2^n - 1。汉诺塔问题是一个递归问题,也可以使用非递归法来解决,例如使用栈来模拟递归过程。 阅读详情

相关推荐

Python 一步一步教你用pyglet制作汉诺塔游戏(终篇)

这个传说讲述了大梵天创造世界的时候,他做了三根金刚石柱子,并在其中一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门将这些圆盘从下面开始按大小顺序重新摆放在另一根柱子上,并规定在小圆盘上不能放大圆盘,同时在三根柱子之间一次只能移动一个圆盘。当盘子的数量增加时,移动步骤的数量会呈指数级增长,圆盘数为n时,总步骤数steps为2^n - 1。这个问题不仅是一个数学和逻辑问题,也是一个很好的教学工具,可以用来教授递归、算法和逻辑思考等概念。

汉阳Hann's Home 4337

汉诺塔游戏设计-c++课程设计

汉诺塔游戏设计 汉诺塔简介 汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。 功能要求 1)基本要求: (1)主界面 (2)完成汉诺塔游戏 (3)并且可以多次进行。 2)创新要求: (1) 加入汉诺塔游戏的起源与规则,增加游戏的趣味性及其情怀。

m0_53300448的博客 1462

深入浅出『汉诺塔』

汉诺塔是一道非常经典的递归问题,提到汉诺塔,你是否心有余悸呢?本文带你深入浅出汉诺塔!理解递归问题的求解。

LEE180501的博客 1万+

汉诺塔+汉诺四塔(C/C++)

汉诺塔(C/C++)

m0_71934846的博客 8337

c# 实现汉诺塔游戏(附代码)

c# 实现汉诺塔游戏附代码前言一、主要代码二、附注释的三、理解总结 前言 游戏的玩法关键:奇数个盘子,第一个先移到C上;偶数个盘子,第一个先移到B上. 平台和背景容器是事先画好的,碟子是动态生成的,使用了容器控件panel的拖动事件来实现拖动碟子(就是个label控件而已)的功能。 一、主要代码 using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms; names

王大师企业官方博客 1081

C#实现汉诺塔游戏源代码

方法是包含一系列语句的代码块,用于执行特定的任务。方法可以带参数并可能返回结果。在C#中,使用static关键字定义静态方法,使用void表示不返回任何值,或指定返回类型以返回数据。// 方法体接口(Interface)是定义一个或多个方法或属性的引用类型。实现接口的类或结构必须提供接口成员的具体实现。接口常用于实现多态性,一个类可以实现多个接口。// 定义一个接口// Tower类实现接口elseelse在这个例子中,ITower接口定义了两个方法。

weixin_28746213的博客 924

汉诺塔C++实现

水题,简单易懂。

m0_62600503的博客 1450

汉诺塔游戏C语言实现

本文还有配套的精品资源,点击获取 简介:汉诺塔游戏是一种经典逻辑谜题,要求将盘子从一个柱子移动到另一个柱子,遵循特定规则。本C语言项目包含 main.c 文件,实现了汉诺塔游戏算法,包括递归函数、用户交互和错误处理。通过该项目,你可以学习递归编程、算法逻辑和用户交互。 1. 汉诺塔游戏简介 汉诺塔游戏是一个经典的数学智力游戏,其目标是将塔上不同...

weixin_35294091的博客 2028

汉诺塔游戏设计(C++控制台版)

汉诺塔游戏设计(C++控制台版) Hello! 小伙伴们。这次给大家带来小生的游戏作品——汉诺塔游戏。由于这是本人第一次设计游戏,可能某些地方存在问题,希望各位大佬能够批评指正,在这里,也感谢各位家仁们阅读此文章。 游戏简介 法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一...

SkyBlue_Jame的博客 3041

汉诺塔 c++程序

汉诺塔 c++程序 可执行汉诺塔

OPC与AI智能体集成实战:一人公司的技术栈构建与避坑指南

1. 先搞清楚“一人公司”和“AI工具”到底在解决什么问题 最近看到不少关于“裸辞搞OPC一人公司”和“AI时代骗局”的讨论,结合搜索热词里高频出现的 openclaw 、 AI编程 、 OPC ,我觉得有必要把这里面的水搅一搅,说点实在的。 首先得拆开看。标题里混了三个东西: 一人公司 、 OPC/OpenClaw 、 AI培训 。它们被放在一起讨论“骗局”,但本质上解决的是不同层面的问题。 一人公司 ,或者说个人工作室、独立开发者模式,核心是 用最小化团队(甚至一个人)去承接项目、开发产品或提供服务 。

weixin_29038345的博客 320

递归算法 —— Hanoi汉诺塔游戏

刚学习完递归函数接触汉诺塔问题的时候,汉诺塔问题困扰了我很久。博主花了很长时间理解这道题目,因此整理出了用递归解决汉诺塔问题的思路,希望对大家有所帮助。

干脆面la的博客 1万+

图像配准(Image Registration)——深度学习方法

参考:https://www.cnblogs.com/carsonzhu/p/11188574.html

m0_46483236的博客 4万+

汉诺塔小游戏

作者本文的目标是利用递归求解汉诺塔的。

daydayup 1190

二阶高通滤波器硬件设计:5种RC到有源方案对比与选型

在传感器前端和音频信号调理中,二阶高通滤波器是抑制直流偏移与低频干扰的关键模块。其设计核心围绕截止频率、品质因数Q、增益与噪声四个指标展开,其中Q值决定滤波器在转折频率附近的响应形状,如Butterworth最大平坦响应需Q=0.707。从纯无源RC电路到引入运放的有源拓扑,演变逻辑在于解决负载效应、提供增益并借助反馈提升Q值。实际工程中,RC级联、VCVS(Sallen-Key)、状态变量及回转器模拟电感等方案各有适用场景:RC电路简单但Q值受限,Sallen-Key单运放即可实现高Q,状态变量适合Q值独

weixin_32770423的博客 98

virtuoso--DFF

27-实验课-std_cell2

qq_61440044的博客 2004

html实现汉诺塔小游戏

html实现汉诺塔小游戏源码,汉诺塔源码下载,可以配置汉诺塔圆盘大小:3-8;动态加载最小移动次数,当前移动次数;可以回退,可以电脑完成汉诺塔。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 4954

Embarcadero Dev-C++ 6.3安装教程【保姆级】

Embarcadero Dev-C++ 6.3安装教程,保姆级教程~

Thebest_jack的博客 1万+

Python 一步一步教你用pyglet制作汉诺塔游戏

汉诺塔(Tower of Hanoi),是一个源于印度古老传说的益智玩具。这个传说讲述了大梵天创造世界的时候,他做了三根金刚石柱子,并在其中一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门将这些圆盘从下面开始按大小顺序重新摆放在另一根柱子上,并规定在小圆盘上不能放大圆盘,同时在三根柱子之间一次只能移动一个圆盘。当盘子的数量增加时,移动步骤的数量会呈指数级增长,圆盘数为n时,总步骤数steps为2^n - 1。

汉阳Hann's Home 5202

GEO芯片数据下载和探针ID转换(保姆级教程)

R语言安装、GEO芯片数据下载、探针ID转换

qq_43138237的博客 3万+

优化Cartographer重定位速度:从子图筛选到参数调优的完整思路

本文详细介绍了优化Cartographer重定位速度的完整方法,从子图筛选到参数调优,帮助工程师在已知初始位姿的前提下将重定位耗时降低50%以上。重点分析了性能瓶颈、子图筛选策略、匹配算法选择及环境自适应的参数优化策略,并通过实战案例展示了显著效果提升。

weixin_28704565的博客 463

汉诺塔游戏的设计

 汉诺塔游戏的设计 作者:苍竹先生 下载源代码 汉诺塔问题是最经典的递归问题,笔者就该问题设计了这个游戏,由用户交互游戏和自动演示两部分组成,支持撤销功能、选关、自动完成等功能。 首先建立了类CMap,该类主要实现用户每一步的操作和画图显示功能,记录的时候只须记录每组盘子的个数和盘子的矩形。代码和注释如下

ronin技术空间 801

【即插即用模块】注意力篇 | TGRS 2025 | ASD:自适应频域解耦,动态拆分高低频+空间注意力,频域空间特征双增强!

摘要: FDMF-Net提出了一种频域解耦多模态融合网络,核心组件为振幅谱解耦模块(ASD)。ASD通过自适应频域拆分和频域-空域协同增强,有效分离模态不变与模态特定特征。该模块利用MLP学习动态阈值调整高低频比例,并通过空间注意力分别强化频域特征,在遥感语义分割任务中实现了细节与结构的协同增强。实验表明,ASD模块能减少模态内冗余,提升特征判别性,为多模态数据融合提供了新思路。代码已开源,适用于需要强化细节与结构的视觉任务。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 306

c#语言编写汉诺塔游戏,c# 实现汉诺塔游戏

汉诺塔游戏一旦掌握了规律,其实是有点单调和无聊的,不过却是学习递归的一个绝佳例子,想当初学习老谭C的时候,就卡在这儿好长时间。对初学编程的人来说,递归本身就不易理解,如果使用C语言没有好的调试环境就更难去理解了。在这方面,VS调试输出是真方便,一目了然。但要想理解递归求解汉诺塔,还是得先玩一玩游戏本身,有点感受。另外,设计一下这个游戏也可以加深对它的理解,同时还可以对数据结构中的栈有一个简单的认识...

weixin_28759987的博客 1231

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

基于FPGA的汉诺塔游戏

汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。 汉诺塔游戏规则简单,对外部要求不高,不仅能增强思维能力,而且能提高智力,在休闲中使自己得到真正的长进。 使用Verilog HDL 以及VHDL语言,运用FPGA中的VGA显示原...

FPGA/MATLAB学习教程/源码/项目合作开发 7902

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

2.6 递归经典问题:汉诺塔游戏与汉诺塔圆盘移动次数

一、汉诺塔游戏规则 有A,B,C三个柱子,在A柱上有1~N个圆盘,将1~N个圆盘从A柱移动到C柱,移动过程中始终保持小盘在上,大盘在下 递归思路1: 将问题划分为1盘移动到B柱,2~N个圆盘移动到C柱的子问题 如果这样划分我们可以推演一下    ①先将1盘移动到B柱        这里肯定是没问题的     ②再将2~N移动到C柱         如果按这种方法,你会发现,你不...

the blog of Lee 6978

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

上一篇: Spy++原理探索(附代码)
下一篇: 超强仿QQ自动伸缩窗口
wx红杉树
博客等级 码龄21年 383粉丝 296原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值