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

1、前言

昨儿个把自己大一时候写过的五子棋重构了一下,之后就在想着要不把不知道大几的时候写的一个汉诺塔小游戏也重构一下?于是说干就干,从12点创建tower.c敲到现在,4个小时就搞定了。这速度在我自己看来还是挺快的(本来以为今天之内能整完就算不错了),甚至快到让我严重怀疑还有很多BUG潜伏在程序里。我的这种担忧不是没有理由。以前出BUG,不去集中精力、仔细思考、慎重修改,基本上是不能解决问题的。而今天我居然随性地、稀里糊涂地删删改改了一些变量、语句,它居然就无障碍地跑起来了!?这让我自己都不太敢相信,也但愿它以后就一直这样,可别再出什么BUG了吧!

2、什么是汉诺塔?

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

为了能更好地理解这个规则,我们举圆盘数为3时的例子。
在这里插入图片描述
刚开始的时候,圆盘都在左边。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
比如说,在这一步我想把第一根柱子上的圆盘移动到第二根柱子上去,行不行呢?
不行。
因为啊,这样一移动,不就是大圆盘在小圆盘上面了吗?

在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
至此,我们便成功了。

所需要的最小移动步数与圆盘数量之间是存在一定规律的,即:
最 小 所 需 步 数 ( 圆 盘 数 量 ) = 2 圆 盘 数 量 − 1 最小所需步数(圆盘数量)=2^{圆盘数量}-1 ()=21

在刚刚的例子中,我们有3张圆盘,所以最小步数为:
最 小 所 需 步 数 ( 3 ) = 2 3 − 1 = 7 步 最小所需步数(3)=2^{3}-1=7步 (3)=231=7

而大家想一想,如果是15张圆盘,需要多少步呢?
最 小 所 需 步 数 ( 15 ) = 2 15 − 1 = 32767 步 最小所需步数(15)=2^{15}-1=32767步 (15)=2151=32767

仅仅相差12张圆盘,所需的数量是不是就大得惊人了?呵呵,这也是为什么我只能举3张圆盘的例子,而没敢举4张盘的例子——因为我懒,不想画15张图。
当然了,网上也有使用了递归算法的解汉诺塔的电脑程序,会告诉你具体到每一步应该进行什么样的移动操作,才能实现最小步数完成一定圆盘数的汉诺塔。感兴趣的同志可以去了解一下。

3、项目规格

【外部规格】
界面表现形式:CUI
操作方法:按AD键控制光标左右移动,按空格键捡起或放下圆盘。
异常处理:当玩家欲将较大的圆盘置于较小圆盘之上时,程序会报错
BUG情况:目前尚未在最新版本中发现肉眼可见的BUG(正常操作、容易想到的异常操作,均可如愿处理)

【内部规格】
开发环境:C语言,windows 10系统
代码总行数:252行
函数总数:10个(包括main函数)

4、基本思路

这次的基本思路还是和五子棋差不多。都是将二维数组转换成对应的文字符号,然后通过操作数组里面的数据状态来实现游戏过程。

只不过与五子棋不同的是,这次我是一个横的二维数组对应一个竖的游戏界面,所以理解起来比较的烧脑。这也是为什么出了这么多BUG的原因吧!

最后判断是否成功的方法也很简单。不是通过用for循环扫描第三根柱子上的情况是否与第一根柱子的初始情况一致,这样的原始算法会比较吃内存空间(因为要多声明一个数组copy[])。而是通过扫描前两根柱子是否为空来判断。在前两根柱子皆为空的前提下,还要去判断isPicked是否为1,如果为1,也就是现在有盘子正在被捡起来的情况,还不行,还必须同时满足isPicked==0,才会判定为成功。

5、源代码

#include <stdio.h&g
  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值