杜郎俊赏 - dujun.io

Python试炼第三发:数图狂拼

程序说明

本程序是一个数字拼图类游戏,我自认为它已经足够成熟和完善,值得一玩!

多达15K的代码量!你既然进来了一定要下,下了一定要顶!只有得到你的支持,我才有动力去创造更棒的程序!这是我第三个py作品,是我到目前为止的得意之作,也希望得到大家的肯定。

本游戏的规则和一般的拼图类游戏一样,就是按顺序把图拼好,对于数字拼图来说就是将数字从上到下、从左到右按数字从小到大排列好。规则简单,但是在玩法上我做了别出新裁的创新(至少我本人没有在网上或者其他任何地方看到过这种玩法)。一般常见的拼图游戏,都是用方向键或者2、8、4、6来控制方块的移动,而且是“所见即所得”模式,即按下控制键以后,方块就马上朝那个方向移动。而我将玩法设计成“连击”模式,即连续输入方向指令,按确定之后再移动。方向指令是常规的2(向上)、8(向下)、4(向左)、6(向右)。同时可以在要求输入方向指令的时候输入0退出游戏。

我将这个游戏分成了三级难度。3×3(9格),4×4(16格)和5×5(25格),在游戏一开始会要求设置难度。
当然了,即便再增加6×6、7×7或者更高的难度,在程序中都只是复制粘贴,加一点修改的工作而已了。可是事实上如果你有这个打算的话,说明你还没有意识到这种玩法的难度。我没有限定“连击”的次数,你可以一次性输入任意长的方向指令串。当然如果你每次只输入一个方向,这就失去这个游戏的独特魅力,和普通的拼图游戏没有区别了。如果你能一口气输入10个指令,20个指令,36个指令,甚至更多,你还认为这个游戏玩起来简单吗?(小时候玩象棋,听老人家说,高手要把36步以后的棋路都想到,我从来不信,脑子还不炸了)

我想看到这里你应该了解了,这个游戏本身很简单,它真正的难度就是挑战你自己。你的心算能力越强悍,这个游戏就能玩得越出彩!游戏还将记录最长的“连击”数,和总的移动步数。让“连击”更长,让总移更少,挑战自己吧!

游戏示意

假设当前的数图拼盘如下:

[4][1][2]
[7][5][3]
[8]   [6]

于是,我们只要输入移动指令串:6884422(这只是7个“连击”),然后按确定,数图拼盘就完成了,如下:

[1][2][3]
[4][5][6]
[7][8]

相关翻译

为了保持最大兼容性(避免未知错误,因为这涉及你的平台环境),我没有使用中文。对于英文有困难的朋友,下面给出翻译:

Set the degree of difficulty.
设置游戏难度。    

3 * 3 (9 blocks), 4 * 4 (16 blocks) or 5 * 5 (25 blocks)? 
3 × 3(9 格),4 × 4(16 格)还是 5 × 5(25 格)?    

Enter 3/4/5: 
输入 3 或 4 或 5(来选择难度,分别对应 3 × 3、4 × 4、5 × 5)    

New Round Starts…
新的一局开始啦……

Enter coherent moves: (2/8/4/6 or 0 to give up)
输入连续的移动指令:(2 [向上] 或 8 [向下] 或 4 [向左] 6 [向右],或者输入 0 退出游戏)  

Error move!
移动错误!
这种情况是因为在当前的拼盘中无法向指令方向移动,比如上面第一个示意图中,显然是无法向上移动的。』   

Input Error!
输入错误!
『这种情况是因为你输入了 2、8、4、6、0 以外的字符』   

GAME OVER
游戏结束
『这种情况是因为你在指令中输入 0 退出了游戏』   

Max Combos
最大“连击”数    

Total moves
总的移动步数    

WELL DONE! CONGRATULATIONS! THANK YOU FOR PLAYING
好样的,恭喜过关!感谢品玩    

Try again?(0:exit Other:restart)
重新开始?(输入 0 退出;输入其他重新开局)

相关配置

我在6670上完美运行,如果你无法正常运行,可以考虑安装如下相关软件(选择你自己手机版本的平台)
我的机型是诺基亚6670,Python平台环境如下:

  • PythonForS60_1_4_0_2ndEd
  • PythonScriptShell_1_4_0_2ndEd
  • Ped_1.67_2ndEd

三炼手记

本程序主体分为四大功能块:

  1. 初始化数图拼盘(随机数应用)
  2. 打印数图拼盘(字符串应用)
  3. 方向指令控制(字符串应用;数组应用;循环语句、条件语句应用)
  4. 判定是否完成拼图(数组应用)

这个程序的构思也是我在驾校练车排队的时候完成的,并在我的小6上开始初步设计。在小6上练习了随机数的应用,然后估计了整个程序的代码量(正如现在所见,它已经达到15K),明智地放弃了在手机端编写,回来以后在PC端的PythonWin上完成。

程序设计,以及花费了更多时间的调试过程中,编程本身已经不是障碍,而真正的障碍是平台之间的差异性。在PC端,数字、英文状态的空格、括号和点号等都是严格地占一个字符的距离空间。但是在手机端运行却不是那么回事,空格、括号、点号的距离空间都比数字小。这也是我花了很多时间来修正的地方。

py编程爱好者可以借鉴一下:手机端,一个点号加一个英文空格(即". ")的距离才是一个数字的距离。

如果有人要问,为什么这个程序界面这么简陋,这是因为:1.我还没开始尝试py界面编程,而事实上这种情况下代码量太大。2.我美工太一般,初级PS水平。配色方面也很弱。

除去这一点,无论是创意性,可玩性,实用性,这个作品都是我到目前为止,以及将来一段时间内的,巅峰之作。

顺便可以透露一点,我一直在玩3×3模式,很想挑战一口气完成3×3拼图,而事实上,30个“连击”之后脑子已经完全乱了,而离完成貌似还很远……

2007.09.04 15:56 更新

在原游戏中加入逆序和判断,确保不会出现无解的情况,同时加入重新开局的选项。

更新手记

这款游戏我自己在驾校练车的时候,乐此不疲玩了很久,但是经常遇到这种情况:例如3×3模式中最终摆成了:

[1][2][3]
[4][5][6]
[8][7]

以前玩“文曲星”上的数字拼图游戏也是经常遇到这种情况的。
我当时在想,这种情况到底是否有解?不然为什么怎么也摆不出来。

发短信问了几个数学系的同学,未果。最后还是回来google一下找到了答案。下面与大家分享一下。

小游戏见大智慧,大家领略一下数学王国的冰山一角吧。

以下文字结合网上说法写成:

益智游戏是一种较为大众化的应用数学,任何人不论对数学是否感兴趣,或多或少都会为它着迷。主要是因为它具有趣味性、消遣性及益智性,而不似一般数学那么的深奥及枯燥。

数字拼图就是这样的一个数学益智游戏。一般市售的数字盘,是在一个 4×4 的盘面中放入 1~15 的数字,并保留一个空格,游戏者的任务是利用移动空格旁边的数字,依序排列(序花式),所以本游戏也被叫做“移动十五”、“十五子棋”,“十五子迷”,“数字智慧盘”等。

数字拼图通常有三种玩法:

第一种:将数字盘中的数字方块全部倒出,然后随意装回盘中(随机花式),游戏者要恢复成顺序花式。
我编制的这个游戏就是属于这种随机花式。

第二种:将数字盘中的数字方块先排成顺序花式,然后随意移动到某种花式(随移花式),游戏者要恢复成顺序花式。

第三种:从初始花式开始,游戏者移动到指定的花式。

对于第二种随移花式,既然是由顺序花式任意移动后产生的,理论上只要顺着相反顺序移动回去就可以了,必定有解。对于第三种情况,很少有听到这么玩的,不说也罢。

我们要谈的就是第一种随机花式。

随机花式会有无解的情况发生,比如我一开始提到的那种情形。一般通过逆序数来判断一个花式是否可以变成序花式。

把数字盘中的数字当成一个数列,其顺序为从左到右、从上到下,比如:

9, 8, 4, 7, 3, 12, 13, 10, 11, 5, 15, 1, 6, 14, 2

什么是逆序呢?当数列中较小的数字排在较大数字后面时,就是逆序。以上面为例:

数字 9 共有 8 个逆序,因为 1, 2, 3, 4, 5, 6, 7, 8 都在它后面。
数字 8 共有 7 个逆序,因为 1, 2, 3, 4, 5, 6, 7 都在它后面。
以下类似。
数字 2 没有逆序,因为它是最后一个数字,后面没有数字。

以上所有的逆序和是 8 + 7 + 3 + 5 + 2 + 6 + 6 + 4 + 4 + 2 + 4 + 0 + 1 + 1 = 53

当逆序和为偶时有解,为奇则无解。

在原来的游戏中我没有判断无解的情况,这也是一般“文曲星”游戏的规则,是需要玩家自己判断的,一旦无法完成只能放弃。

我现在发现它的不爽了,特别是在5×5这样“浩大”的工程,解到后面发现无解是很郁闷。

为此我修正了原程序,加进了逆序和判断,一旦为奇,则对调第一格和第二格数字,这样就能保证逆序和为偶。

附件

[附件]源码下载

标签: PyS60
日期:2007-09-03