汉罗塔小游戏(自创)

article/2025/6/16 2:07:05

汉诺塔是这样一种小游戏:
有三根柱子。一开始,若干张圆盘按照上小下大的顺序串在第一根柱子上。而游戏的目标为将所有圆盘全部移动到第三根柱子上去,并且仍要保持上小下大的顺序。而且要求:
①每次只能移动一张圆盘。
②较大的圆盘不可以放在较小的圆盘上面。

比如说,在这一步我想把第一根柱子上的圆盘移动到第二根柱子上去,行不行呢?不行。
因为这样一移动,大圆盘就在小圆盘上面了。

在这里插入图片描述 

所以,我们只能把它移动到第三根空的柱子上去。

在这里插入图片描述
源代码:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define MAX_PLATES 15
#define SPACE 32
#define EMPTY 51316
#define CUR 32118
int nTimesTwo(int n){int product = 1;for(int i = 0; i < n; i++) product*=2;return product;
}
void cls(){system("cls");
}
void pause(){system("pause");
}
void tab(int times){for(int i=0; i<times; i++) printf("\t");
}
void line(int times){for(int i=0; i<times; i++) printf("\n");
}
void space(int times){for(int i=0; i<times; i++) printf(" ");
}
void printPlate(int size){switch(size){case 0:space(MAX_PLATES);printf("|\t");break;case EMPTY:space(MAX_PLATES);printf(" \t");break;case CUR:space(MAX_PLATES);printf("v\t");break;default:for(int i = 0; i < MAX_PLATES-size; i++){printf(" ");}for(int i = 0; i < size * 2 + 1; i++){printf("█");}if(size<8)tab(1);break;}
}
int menu(){int num = 0;int cur = 6;int key;while(num==0){cls();printf("********************汉诺塔小游戏********************\n");printf("请选择盘子的数量:\n");for(int i = 1; i <= MAX_PLATES; i++){if(cur == i){printf("[%d] ",i);}else{printf(" %d  ",i);}}line(1);key = getch();switch(key){case 'L': case 'l':return 0;break;case 'A': case 'a':if(cur == 1) cur=15;else cur--;break;case 'D': case 'd':if(cur == 15) cur=1;else cur++;break;case SPACE:num = cur;break;default:break;}}return num;
}int game(int plateNum){int pillar[3][MAX_PLATES+8] = {};int isPicked = 0;int cur = 0;int key;int steps=0;int notSuccess;for(int i = 0; i < plateNum; i++){pillar[0][i] = plateNum - i;}for(int i = 0; i < 3; i++){for(int j = MAX_PLATES+8-1;j>=MAX_PLATES+8-3; j--){pillar[i][j] = EMPTY;}}	while(1){cls();notSuccess = 0;if(!isPicked){pillar[cur][MAX_PLATES+8-2]=CUR;}for(int i = MAX_PLATES+8-1; i >= 0; i--){for(int j = 0; j < 3; j++){tab(1);printPlate(pillar[j][i]);}line(1);}for(int i = 0; i < 2; i++){for(int j = 0; j < MAX_PLATES + 5; j++){if(pillar[i][j] != 0){notSuccess = 1;}}}if(isPicked){notSuccess = 1;}if(!notSuccess){return steps;}key = getch();switch(key){case 'A': case 'a':if(cur == 0){pillar[2][MAX_PLATES+8-2] = pillar[0][MAX_PLATES+8-2];pillar[0][MAX_PLATES+8-2] = EMPTY;cur=2;}else{pillar[cur-1][MAX_PLATES+8-2] = pillar[cur][MAX_PLATES+8-2];pillar[cur][MAX_PLATES+8-2] = EMPTY;cur--;}break;case 'D': case 'd':if(cur == 2){pillar[0][MAX_PLATES+8-2] = pillar[2][MAX_PLATES+8-2];pillar[2][MAX_PLATES+8-2] = EMPTY;cur=0;}else{pillar[cur+1][MAX_PLATES+8-2] = pillar[cur][MAX_PLATES+8-2];pillar[cur][MAX_PLATES+8-2] = EMPTY;cur++;}break;case SPACE:if(isPicked == 1){if(pillar[cur][0]==0){pillar[cur][0] = pillar[cur][MAX_PLATES+8-2];pillar[cur][MAX_PLATES+8-2] = CUR;steps++;isPicked = 0;}else{for(int i = MAX_PLATES+5-1; i>=0; i--){if(pillar[cur][i] != 0){if(pillar[cur][MAX_PLATES+8-2] < pillar[cur][i]){pillar[cur][i+1] = pillar[cur][MAX_PLATES+8-2];pillar[cur][MAX_PLATES+8-2] = CUR;steps++;isPicked = 0;}else{printf("不能放在比自己小的盘子上!\n");pause();}break;}}}}else{for(int i = MAX_PLATES+5-1; i>=0; i--){if(pillar[cur][i] != 0){pillar[cur][MAX_PLATES+8-2] = pillar[cur][i];pillar[cur][i] = 0;isPicked = 1;break;}}}break;case 'L': case 'l':return 0;default:break;}}
}int main(void){int plateNum=0;int key;int confirm=0;int step=0;while(confirm != 'y' && confirm != 'Y'){plateNum = menu();if(plateNum == 0){printf("结束游戏……\n");return 0;}cls();printf("确定开始游戏吗?\n盘数:%d\n最小移动步数:%d\n按“Y”键确认,按其他任意键返回重选。\n",plateNum,nTimesTwo(plateNum)-1);confirm = getch();}step = game(plateNum);if(step != 0){printf("成功!你所用的步数为:%d步。\n",step);}printf("游戏结束。\n");pause();return 0;
}

 


http://chatgpt.dhexx.cn/article/2aGDo8gi.shtml

相关文章

C语言实现递归解决汉罗塔问题

1.问题&#xff1a; 汉诺塔(Tower of Hanoi&#xff09;&#xff0c;又称河内塔。是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子&#xff0c;在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新…

汉罗塔Python递归实现

count0 def fn(n,begin,end,middle):global count #global更新并以字典形式返回当前全部局部变量(如果不是全局变量在每次调用时初值会被清零)if n1:print("{}:{}-->{}".format(1,begin,end))count1else :fn(n-1,begin,middle,end)print("{}:{}-->{}&qu…

汉罗塔与青蛙跳台阶的递归实现(及扩展青蛙跳台阶)C语言从入门到入土(入门篇)(算法篇p2)

目录 题目&#xff1a;汉罗塔递归实现 思路 实现 题目&#xff1a;青蛙跳台阶递归实现 思路 实现 青蛙跳台阶问题的延伸 谁都不能阻挡你成为更优秀的人。 题目&#xff1a;汉罗塔递归实现 汉罗塔&#xff0c;用递归实现&#xff0c;有三个柱子n个盘子在a&#xff0c;要怎…

【递归】小学生都看得懂的汉罗塔问题

文章目录 前言最简模型规律分析分析总结结论解读 篇尾 前言 大梵天创造世界的时候做了三个金刚石柱子&#xff0c;在一根柱子上从上到下按照大小顺序摞着64骗黄金盘子&#xff0c;大梵天命令婆罗门把圆盘开始按大小顺序重新摆放在另外一个柱子上。在小圆盘上不能放大圆盘&…

汉罗塔问题(递归)

数据结构–汉罗塔 题目描述 在经典汉诺塔问题中&#xff0c;有 3 根柱子及 N 个不同大小的穿孔圆盘&#xff0c;盘子可以滑入任意一根柱子。一开始&#xff0c;所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。移动圆盘时受到以下限制: 1.一…

多柱汉罗塔(python解法,带注释,注释为个人理解)

一、参考链接&#xff1a; 1、普通汉罗塔链接&#xff08;这边也是我的博文&#xff09;&#xff1a; (166条消息) 递归经典算法案例题&#xff08;汉罗塔、阶乘、斐波那契代码&#xff09;_南风~古草的博客-CSDN博客_汉罗塔 2、大佬的多柱汉罗塔博文&#xff08;有数学推…

累加—递归汉罗塔问题 (C语言)

一、累加—递归 一、代码 二、测试结果 二、汉罗塔问题 一、分析 二、代码 三、测试结果 三、总结 一、累加—递归 一、代码 //累加的递归实现 #include <stdio.h>int addTo(int n) {if(n < 0)return 0;else{return addTo(n-1)n;} } void addToTest() {int n…

【C语言】汉罗塔

前言 &#x1f388;大家好&#xff0c;我是何小侠&#x1f388; &#x1f300;大家可以叫我**小何或者小侠&#x1f300;** &#x1f534;我是一名普通的博客写作者&#x1f534; &#x1f490;希望能通过写博客加深自己对于学习内容的理解&#x1f490; &#x1f338;也能帮助…

[C语言]C语言解决汉罗塔问题(初学者版)

目录 1、汉罗塔问题解决思路&#xff1a; 2、代码实现&#xff1a; 函数部分&#xff1a; 全部代码&#xff1a; 运行结果&#xff1a; 3、结语&#xff1a; 1、汉罗塔问题解决思路&#xff1a; 以三个为例&#xff0c;步骤为&#xff1a; 1.首先我们需要将其分成两个整体…

汉诺塔问题的详细讲解(python版)

2022.3.17 2022.11.15 增加次数计算一&#xff0e;抽象为数学问题&#xff1a; 从左到右有A、B、C三根柱子&#xff0c;其中A柱子上面有从小叠到大的n个圆盘&#xff0c;现要求将A柱子上的圆盘移到C柱子上去&#xff0c;期间只有一个原则&#xff1a;一次只能移到一个盘子且大…

Golang 汉罗塔问题

先用一般方法实现汉罗塔方法: 先确定三个"石柱" A B C 。n代表A柱起始圆盘数量 主函数: 结合栈来实现汉罗塔。 因为栈先进后出的特点 很适合汉罗塔。其实和上述方法本质一样,只不过添加了 栈的特性 这里定的栈最大容量为7,可以根据实际情况更改 栈的构造&#xff…

汉罗塔(递归分治)

Java代码如下 public class Hanoi {//操作步骤数private static int steps 1;public static void main(String[] args) {//盘子数目int diskNumber 4;doTowers(diskNumber, A, B, C);}private static void doTowers(int diskNum, char from , char via, char to){if (diskNum…

汉诺塔(Hanoi)问题,Java实现,C语言实现,Python实现!!!

目录 一、汉诺塔的玩法 二、汉诺塔的逻辑 三、代码实现 四、运行结果 五、总结 一、汉诺塔的玩法 汉诺塔&#xff08;Tower of Hanoi&#xff09;&#xff0c;又称河内塔&#xff0c;是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子&#x…

Java基础语法(汉罗塔)

Java基础语法&#xff08;汉罗塔&#xff09; 1 起源2 需求3 分析3.1 1个碟子3.2 2个碟子3.3 3个碟子3.4 4个碟子3.5 规律 4 代码实现&#xff1a;直接算法5 代码实现封装&#xff1a;栈的思想 1 起源 汉罗塔&#xff08;又称河内塔&#xff09;问题是源于印度一个古老传说的益…

《经典递归问题:汉罗塔》

&#x1f320;作者&#xff1a;TheMythWS. &#x1f386;专栏&#xff1a;《JavaSE》 &#x1f387;座右铭&#xff1a;不走心的努力都是在敷衍自己&#xff0c;让自己所做的选择&#xff0c;熠熠发光。 目录 ✨汉罗塔的介绍 图解游戏​ ✨N层汉罗塔需移动的次数 ✨汉罗塔的…

数据链路层 功能概述

数据链路层的研究思想 数据链路层基本概念 数据链路层功能概述 数据链路层功能概述

数据链路层功能概述、封装成帧与透明传输

你一定要做自己&#xff0c;做自己喜欢的事&#xff0c;然后把自己交给命运 文章目录 本章启航思维导图数据链路层数据链路层基本概念数据链路层功能概述封装成帧透明传输组帧的四种方法字符计数法字符填充法零比特填充法违规编码法 本章启航思维导图 数据链路层 数据链路层基…

【计算机网络】数据链路层——数据链路层功能/组帧/差错控制

文章目录 数据链路层数据链路层的功能为网络层提供服务链路管理帧定界、帧同步与透明传输流量控制 组帧字符计数法字符填充的首尾定界符法零比特填充的首尾标志法违规编码法 差错控制检错编码奇偶校验码循环冗余码 纠错编码 数据链路层 数据链路层的功能 数据链路层在物理层提…

19数据链路层的功能

1、数据链路层的功能 数据链路层在物理层提供服务的基础上向网络层提供服务&#xff0c;其主要作用是加强物理层传输原始比特流的功能&#xff0c;将物理层提供的可能出错的物理连接改造成逻辑上无差错的数据链路&#xff0c;使之对网络层表现为一条无差错的链路。 2、为网络层…

计算机网络——数据链路层功能概述、封装成帧、差错控制、流量控制与可靠传输机制

文章目录 前言一、数据链路层功能概述二、封装成帧1、透明传输2、封装成帧3、组帧的方法⑴字符计数法⑵字符/节填充法⑶零比特填充法⑷违规编码法 三、差错控制1、差错由来2、检错编码⑴奇偶校验码⑵循环冗余码 3、纠错编码——海明码 四、流量控制与可靠传输机制1、停止等待协…