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

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

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


源代码:

#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;
}

汉罗塔小游戏(自创)相关推荐

  1. 微信小游戏投放创角没有数据上报?

    微信小游戏投放录 欢迎使用神奇的MP投放后台 小游戏 官网文档 接入步骤 上报类型 解决踩坑 欢迎使用神奇的MP投放后台 如果有联调上的问题,首页有博主联系方式 小游戏 最近各个投放平台都开放了小游戏 ...

  2. 【项目展示】自己用C语言编写的汉诺塔小游戏

    本文目录 1.前言 2.什么是汉诺塔? 3.项目规格 4.基本思路 5.源代码 6.运行结果 7.感想与心得 8.未来规划 1.前言 昨儿个把自己大一时候写过的五子棋重构了一下,之后就在想着要不把不知 ...

  3. python汉诺塔游戏_Python实战:搭建汉诺塔小游戏,快和小伙伴一起玩玩吧

    汉诺塔游戏:看谁能在短时间内将排好顺序的圈,按同样的顺放在另一根柱子上,每次只能动一个. 今天用python搭建汉诺塔小游戏(简约版) 代码亲测有效!源代码如下: #左中右塔用一个列表存储 left ...

  4. 【使用递归玩通关汉诺塔游戏】算法01-递归(斐波那契数列、汉罗塔问题)-java实现

    递归 定义:在一个方法(函数)的内部调用该方法(函数)本身的编程方式 简而言之就是 "自己调自己" 在玩游戏之前让我们先对递归有一个简单的了解吧! 5.1 递归简介 递归必须有一个 ...

  5. C语言--汉诺塔小游戏

    汉诺塔小游戏的游戏规则:有三个柱子abc,其a柱上面有若干个圆盘,要求借助三个柱子将a柱上面的圆盘按顺序移动到c柱上去,并且c柱上每次只能增加一个圆盘,问需要移动多少次才可以完成此游戏. 一.首先理解 ...

  6. html实现汉诺塔小游戏

    文章目录 1.设计来源 汉诺塔由来 1.1 主界面 1.2 游戏规则 1.3 游戏完成界面 2.效果和源码 2.1 动态效果 2.2 源代码 源码下载 作者:xcLeigh 文章地址:https:// ...

  7. C语言递归小游戏—汉诺塔(hanoi)

    前言: 汉诺塔大家都不陌生吧,在猩球崛起这个电影里,人们通过凯撒玩汉诺塔知道了它的智商增高了,这个益智小游戏的规则就是: 汉诺塔(Tower of Hanoi),又称河内塔.是一个源于印度古老传说的益 ...

  8. C++自创打怪小游戏

    大家好,我是yanxinchenji 第一次发博客有点紧张 我前几天写了个打怪小游戏 想发博客上给大家看看 有什么bug欢迎在评论区提出(毕竟这还是个测试版 也可以加我微信:yanxinchenjic ...

  9. python撩妹技能_猜数字小游戏python实现(可用来撩妹撩汉)

    import random import time number = random.randint(0,199) print("----------猜数字小游戏----------" ...

最新文章

  1. python是不是特别垃圾-震惊!垃圾分类居然能用Python搞定!
  2. springmvc二十二:annotation-driven标签
  3. 如何成为CSDN博客专家
  4. [POJ 3164]Command Network(最小树形图,朱刘算法)
  5. 解决 Unmapped Spring configuration files found.Please configure Spring facet.
  6. 迪士尼自研算法突破百万高清像素用AI换脸来拍电影
  7. jdbc mysql分页_JDBC【数据库连接池、DbUtils框架、分页】
  8. IOS开发之Target-Action模式
  9. 摩托罗拉投资Android外来往戏开辟商Moblyng
  10. Linux学习笔记5 - Shell编程(类似于Windows下的批处理)
  11. java mysql字符串拼接_Oracle与MySQL字符串拼接
  12. Github上优秀的开源项目
  13. 用Altium Designer的databaseLib文件连接MySQL数据库工具管理自己的元器件信息数据库
  14. MPI(Massage Passing Interface)
  15. 性能测试——抗攻击-hyenae-ddos攻击
  16. Android 图片资源大瘦身
  17. 网易2019实习生招聘编程题集合
  18. 朱松纯:初探计算机视觉三个源头兼谈人工智能
  19. 苹果开发者账号注册申请流程
  20. 网站流量日志数据分析系统(模块开发----数据仓库设计)

热门文章

  1. 如何察看僵尸进程 zombie
  2. 整理任正非思想:团结奋斗 再创华为佳绩-1994
  3. (3)网页视频获取下载案例3
  4. Autoar之 CAN NM网络管理
  5. 今日的金山,而非往日的金山
  6. android 小米8底部有一大片黑色
  7. JAVA守护线程 非守护线程
  8. leetcode每日一题27
  9. 5款服装进销存软件测评,教您如何挑选出好用的
  10. 小程序弹框wx.showModal、wx.showActionSheet、wx.showToast