相信大家在学习C语言嵌套的时候已经学习过经典问题汉诺塔了,我学习时就想能不能搞个汉诺塔的游戏出来,结果睡了一觉就给忘了。今天突然想起,搞出来与大家分享,水平一般,但符合汉诺塔规则。最终代码我放在文章最后,希望能对大家的学习有一些帮助。

做出来是长这样的:

重要函数

除了stdio.h中的函数以外,我们还需要用到一些其它的库函数增加游戏体验。

#include<conio.h>   getch()

直接从键盘获取键值,不等待用户按回车,只要用户按一个键,getch就立刻返回。

#include<windows.h>  system("cls")

清屏函数

打印界面

最简单的一步,printf,不需要多赘述,打印完后清屏,输出操作方法与玩法.

    printf("                ########################################\n"); printf("                ########################################\n"); printf("                #####           汉诺塔             #####\n"); printf("                ########################################\n"); printf("                ########################################\n"); printf("                ####  按任意键开始  ####################\n"); printf("                ########################################\n");  printf("                ########################################\n"); getch();system("cls");//输出操作方法printf("                    游戏玩法\n");printf("        1.首先靠按键 A D 移动选择初始汉诺塔层数,回车确认\n"); printf("        2.使用数字键对塔上圆盘进行移动,例如连续输入 1 3 即表示将第1根柱子最上面的圆盘移动到第三根上\n"); printf("        3.无法移动处于第一个以下的圆盘,大的圆盘不能在小的上面\n");printf("      若知晓,按任意键即可开始游戏\n");getch();system("cls"); 

添加必要参数 

int i,ceng = 1;        /* i负责控制循环,ceng用来记录选择的层数*/
char c;                   /*得到从键盘输入的值*/
int wei1,wei2,bushu = 0;        /*记录输入的第一根柱子,第二根柱子,已经走过的步数*/

int li[4];        /*立柱1 2 3 上的圆盘的个数*/
int zhu[4][6] = {0};    /*记录每个柱上每层圆盘的大小*/
li[2] = li[3] = 0;

选择难度,汉诺塔层数 (目前仅供选择 1 3 5 )

在得到每个合法输入之后进行对变量值的调整,清屏后重新输入。

while(1){printf("                ***********************\n");printf("                ****    选择层数   ****\n");printf("                ***********************\n");printf("\n       ");if(ceng == 1)printf("||1层||    ");elseprintf("  1层      ");if(ceng == 3)printf("||3层||    ");elseprintf("  3层      ");if(ceng == 5)printf("||5层||    ");elseprintf("  5层      ");c = getch(); if(c == 'd'||c == 'D'){if( ceng == 5 )ceng = 1;else if( ceng == 3 )ceng = 5;elseceng = 3;}if( c == 'a' || c == 'a' ){if( ceng == 1 )ceng = 5;else if( ceng == 5 )ceng = 3;elseceng = 1;}system("cls");if( c == 13 )break;}

初始画面打印 (这里以横坐标7 9 31 为立柱的位置)

     int hang,lie;li[1] = ceng ;for(i = 0;i < ceng; i++)zhu[1][i] = ceng - i;for( hang = 4 ;hang >= 0 ; hang-- ){if( hang != 4 )printf("\n");for( lie = 0 ;lie <= 40 ;lie++ ){if( lie == 7 || lie == 19 || lie == 31 )printf("|");else if( hang < li[1] && abs( lie - 7 ) <= zhu[1][hang] )printf("*");elseprintf(" ");}}printf("\n");for(lie=0;lie<=40;lie++)printf("-");printf("\n");printf("%d %d %d\n",li[1],li[2],li[3]);printf("%d %d %d\n",zhu[1][ li[1] - 1 ],zhu[2][ li[2] - 1 ],zhu[3][ li[3] - 1 ]);

 汉诺塔移动(游戏核心)

while(1){if( li[3] == ceng )break;wei1 = getch() - '0';printf("输入柱1:%d号柱子\n",wei1);wei2 = getch() - '0';printf("输入柱2:%d号柱子\n",wei2);Sleep(800);if( 0 < wei1 && wei1 < 4 && 0 < wei2 && wei2 < 4 ){if( ( zhu[wei1][ li[wei1] - 1 ] < zhu[wei2][ li[wei2] - 1 ] || zhu[wei2][ li[wei2] - 1 ] == 0 ) && zhu[wei1][ li[wei1] - 1 ] !=0 ){int t;                              /*数据转换*/ t = zhu[wei1][ li[wei1] - 1 ];zhu[wei1][ li[wei1] - 1 ] = 0;zhu[wei2][ li[wei2] ] = t;li[wei1]--;li[wei2]++;system("cls");for( hang = 4 ;hang >= 0 ; hang-- ){if( hang != 4 )printf("\n");for( lie = 0 ;lie <= 40 ;lie++ ){if( lie == 7 || lie == 19 || lie == 31 )printf("|");else if( hang < li[1] && abs( lie - 7 ) <= zhu[1][hang] )printf("*");else if( hang < li[2] && abs( lie - 19 ) <= zhu[2][hang] )printf("*");else if( hang < li[3] && abs( lie - 31 ) <= zhu[3][hang] )printf("*");elseprintf(" ");}}printf("\n");for(lie=0;lie<=40;lie++)printf("-");printf("\n");bushu++;printf("%d %d %d\n",li[1],li[2],li[3]);printf("%d %d %d         总步数:%d\n",zhu[1][ li[1] - 1 ],zhu[2][ li[2] - 1 ],zhu[3][ li[3] - 1 ],bushu);}else if( wei1 == wei2 )printf("违法操作:如果我没有看错,这是同一根柱子,对吧。\n"); else if( zhu[wei1][ li[wei1] - 1 ] > zhu[wei2][ li[wei2] - 1 ] )   printf("违法操作:大的圆盘将压到小的圆盘\n");else if( zhu[wei1][ li[wei1] - 1 ] ==0 ) printf("违法操作:难道要我把空气移动上去?或许其他的游戏可以吧\n");}elseprintf("违法操作:我们可不存在这样的柱子\n");} printf("你赢了\n");

 善后处理

游戏本身不存在输的结果,在跳出循环之后,即可恭喜玩家获得胜利。再结合goto使游戏就可以循环着玩了。如果说如何退出,emmm,右上角的叉叉值得托付。

游戏的最终代码

#include<stdio.h>
#include<conio.h>
#include<windows.h>
int main(){int i,ceng = 1;char c;int wei1,wei2,bushu = 0;/*立柱位置7 19 31 */int li[4]; int zhu[4][6] = {0};li[2] = li[3] = 0;/*打印界面*/
KAIDUAN:system("cls");printf("                ########################################\n"); printf("                ########################################\n"); printf("                #####           汉诺塔             #####\n"); printf("                ########################################\n"); printf("                ########################################\n"); printf("                ####  按任意键开始  ####################\n"); printf("                ########################################\n");  printf("                ########################################\n"); getch();system("cls");//输出操作方法printf("                    游戏玩法\n");printf("        1.首先靠按键 A D 移动选择初始汉诺塔层数,回车确认\n"); printf("        2.使用数字键对塔上圆盘进行移动,例如连续输入 1 3 即表示将第1根柱子最上面的圆盘移动到第三根上\n"); printf("        3.无法移动处于第一个以下的圆盘,大的圆盘不能在小的上面\n");printf("      若知晓,按任意键即可开始游戏\n");getch();system("cls"); /*选择难度,汉诺塔层数*/ while(1){printf("                ***********************\n");printf("                ****    选择层数   ****\n");printf("                ***********************\n");printf("\n        ");if(ceng == 1)printf("||1层||    ");elseprintf("  1层      ");if(ceng == 3)printf("||3层||    ");elseprintf("  3层      ");if(ceng == 5)printf("||5层||    ");elseprintf("  5层      ");c = getch(); if(c == 'd'||c == 'D'){if( ceng == 5 )ceng = 1;else if( ceng == 3 )ceng = 5;elseceng = 3;}if( c == 'a' || c == 'a' ){if( ceng == 1 )ceng = 5;else if( ceng == 5 )ceng = 3;elseceng = 1;}system("cls");if( c == 13 )break;}/*处理初始地图*/int hang,lie;li[1] = ceng ;for(i = 0;i < ceng; i++)zhu[1][i] = ceng - i;for( hang = 4 ;hang >= 0 ; hang-- ){if( hang != 4 )printf("\n");for( lie = 0 ;lie <= 40 ;lie++ ){if( lie == 7 || lie == 19 || lie == 31 )printf("|");else if( hang < li[1] && abs( lie - 7 ) <= zhu[1][hang] )printf("*");elseprintf(" ");}}printf("\n");for(lie=0;lie<=40;lie++)printf("-");printf("\n");printf("%d %d %d\n",li[1],li[2],li[3]);printf("%d %d %d\n",zhu[1][ li[1] - 1 ],zhu[2][ li[2] - 1 ],zhu[3][ li[3] - 1 ]);/*汉诺塔移动*/while(1){if( li[3] == ceng )break;wei1 = getch() - '0';printf("输入柱1:%d号柱子\n",wei1);wei2 = getch() - '0';printf("输入柱2:%d号柱子\n",wei2);Sleep(800);if( 0 < wei1 && wei1 < 4 && 0 < wei2 && wei2 < 4 ){if( ( zhu[wei1][ li[wei1] - 1 ] < zhu[wei2][ li[wei2] - 1 ] || zhu[wei2][ li[wei2] - 1 ] == 0 ) && zhu[wei1][ li[wei1] - 1 ] !=0 ){int t;                                /*数据转换*/ t = zhu[wei1][ li[wei1] - 1 ];zhu[wei1][ li[wei1] - 1 ] = 0;zhu[wei2][ li[wei2] ] = t;li[wei1]--;li[wei2]++;system("cls");for( hang = 4 ;hang >= 0 ; hang-- ){if( hang != 4 )printf("\n");for( lie = 0 ;lie <= 40 ;lie++ ){if( lie == 7 || lie == 19 || lie == 31 )printf("|");else if( hang < li[1] && abs( lie - 7 ) <= zhu[1][hang] )printf("*");else if( hang < li[2] && abs( lie - 19 ) <= zhu[2][hang] )printf("*");else if( hang < li[3] && abs( lie - 31 ) <= zhu[3][hang] )printf("*");elseprintf(" ");}}printf("\n");for(lie=0;lie<=40;lie++)printf("-");printf("\n");bushu++;printf("%d %d %d\n",li[1],li[2],li[3]);printf("%d %d %d         总步数:%d\n",zhu[1][ li[1] - 1 ],zhu[2][ li[2] - 1 ],zhu[3][ li[3] - 1 ],bushu);}else if( wei1 == wei2 )printf("违法操作:如果我没有看错,这是同一根柱子,对吧。\n"); else if( zhu[wei1][ li[wei1] - 1 ] > zhu[wei2][ li[wei2] - 1 ] )   printf("违法操作:大的圆盘将压到小的圆盘\n");else if( zhu[wei1][ li[wei1] - 1 ] ==0 ) printf("违法操作:难道要我把空气移动上去?或许其他的游戏可以吧\n");}elseprintf("违法操作:我们可不存在这样的柱子\n");} printf("你赢了\n");/*重新开始*/for( hang = 3 ;hang >= 0 ;hang--)for( lie = 0 ;lie <= 5 ;lie++)zhu[hang][lie] = 0;bushu = li[3] = 0;Sleep(800);printf("按任意键重新开始\n");getch();goto KAIDUAN; return 0;
}

汉诺塔小游戏 c语言相关推荐

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

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

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

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

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

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

  4. html实现汉诺塔小游戏

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

  5. 汉诺塔递归的c语言实现(递归)

    对于递归来讲, 汉诺塔实际是经典到不能再经典的例子了,   每个数据结构的教材对会提到. 但是到最后只给出一段类似下面的一段代码: #include<stdio.h>void move(i ...

  6. python递归详解+汉诺塔小案例_汉诺塔,python递归实现解法步骤

    def hanoi(n,x,y,z):#函数实现n个盘子在x,y,z,移动 if n==1: print(x, ' --> ', z) else: hanoi(n-1,x,z,y)#将n-1层个 ...

  7. c语言函数汉诺塔不用move,C语言——汉诺塔问题(函数递归)

    问题概述:古代有一个梵塔,塔内有3个座A,B,C.开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上,有一个老和尚想把64个盘子从A座移动到C座,但是规定每次只允许移动一个盘,且在移动过程中在 ...

  8. 汉诺塔问题(C语言代码)

    汉诺塔:汉诺塔(Tower of Hanoi)源于印度传说中,大梵天创造世界时造了三根金钢石柱子,其中一根柱子自底向上叠着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子 ...

  9. c语言汉诺塔移动次数,C语言计算汉诺塔最小挪动步数 (二)

    C语言计算汉诺塔最小移动步数 (二) 前几天写的:C语言计算汉诺塔最小移动步数(一) 当时还不知道用2^n-1这个公式来求解汉诺塔移动步骤.=_= 偶然间在网上发现了这个公式,发现当时写的算法还是比较 ...

最新文章

  1. 怎样从0开始搭建一个测试框架_0
  2. 【mmdetection2.0错误】——ModuleNotFoundError: No module named ‘mmdet‘
  3. 参加技术培训前的辅导,选得对,学得好
  4. this.fields.get(c) is undefined
  5. 黑客用上机器学习你慌不慌?这 7 种窃取数据的新手段快认识一下
  6. 关于silverlight主题皮肤(一)
  7. python练手经典100例-python零基础练手项目100+
  8. 一些图像处理函数用法
  9. Win8 内置游戏应用更新 中文翻译错误得以修正
  10. 多媒体音箱选购指南--理论篇
  11. 琵琶行用计算机弹,琵琶行中的三次弹奏
  12. QT 控件增加双击事件
  13. process launch failed: timed out waiting for app to launch问题解决
  14. 继电器在交流应用时的zero-crossing
  15. 【MineCraft】-- 如何开设我的世界服务器
  16. 因缺失增量信息而导致recoverseg恢复失败的情况
  17. 奇瑞新能源销量回升,iCar或延续辉煌
  18. 【历史上的今天】3 月 20 日:周以真提出计算思维;Docker 发布;思科收购 Linksys
  19. 标志寄存器(FLAGS,PSW,FR)简介
  20. 苹果退款_苹果退款理由怎么写_苹果退款教程|流程【图文】-太平洋电脑网PConline-太平洋电脑网...

热门文章

  1. 【天光学术】诉讼法论文:论交通肇事罪的认定与处理【开题报告 法学硕士研究生毕业论文】
  2. C语言-MSB/LSB大小端序
  3. Hadoop 和 Spark 知识点整理汇总
  4. 基于Java+SpringBoot+Thymeleaf+Mysql家政服务预约系统设计与实现
  5. JAVA面试潜规则大公开,能帮你多拿5k薪资!
  6. Python turtle 画正多边形和多角形
  7. 阿里巴巴2008校园招聘在线宣讲会
  8. ESP32学习笔记(七) 复位和时钟
  9. java-php-python-springboot-中医药院校科研会议系统-计算机毕业设计
  10. BZOJ 3609: [Heoi2014]人人尽说江南好