前段时间用C语言做了个字符版的推箱子,着实是比较简陋。正好最近用到了Python,然后想着用Python做一个图形界面的推箱子。这回可没有C那么简单,首先Python的图形界面我是没怎么用过,在网上找了一大堆教材,最后选择了tkinter,没什么特别的原因,只是因为网上说的多。
接下来就来和大家分享一下,主要分享两点,第一就是这个程序的实现过程,第二点就是我在编写过程中的一些思考。
一、介绍
开发语言:Python 3.7
开发工具:PyCharm 2019.2.4
日期:2019年10月2日
作者:ZackSock
这次的推箱子不同与C语言版的,首先是使用了图形界面,然后添加了背景音乐,还有就是可以应对多种不同的地图。我内置了三张地图,效果图如下:
比上次的高级多了,哈哈。
二、开发环境
我也不知道这么取名对不对,这里主要讲的就是使用到的模块。因为Python不是我的强项,所以我只能简单说一下。
首先我使用的是Python3.7,主要用了两个模块,tkinter和pygame。其中主要使用的还是tkinter,而pygame是用来播放音乐的。(因为没去了解pygame,所有界面我是用tkinter写的)。
库的导入我使用的是pycharm,导入非常方便。如果使用其它软件可以考虑用pip安装模块,具体操作见下文:https://www.jb51.net/article/171391.htm。
pip install tkinter pip install pygame
三、原理分析
1、地图
地图在思想方面没有太大改变,还是和以前一样使用二维数组表示。不过我认为这样确实不是非常高效的做法,不过这个想法也是在我写完之后才有的
2、移动
在移动方面我修改了很多遍,先是完全按照原先的算法。这个确实也实现了,不过只能在第一关有效,在我修改地图之后发现了一系列问题,然后根据问题发现实际遇到的情况要复杂很多。因为Python是用强制缩进替代了{},所以代码在观看中会有些难度,希望大家见谅。
移动的思想大致如下:
/** * 0表示空白 * 1表示墙 * 2表示人 * 3表示箱子 * 4表示终点 * 5表示已完成的箱子 * 6表示在终点上的人 */ 一、人 1、移动方向为空白 前方设置为2 当前位置为0 2、移动方向为墙 直接return 3、移动方向为终点 前面设置为6 当前位置设置为0 4、移动方向为已完成的箱子 4.1、已完成箱子前面是箱子 return 4.2、已完成箱子前面是已完成的箱子 return 4.3、已完成箱子前面是墙 return 4.4、已完成箱子前面为空白 已完成箱子前面设置3 前方位置设置为6 当前位置设置为0 4.5、已完成箱子前面为终点 已完成箱子前面设置为5 前方位置设置为6 当前位置设置为0 5、前方为箱子 5.1、箱子前方为空白 箱子前方位置设置为3 前方位置设置为2 当前位置设置为0 5.2、箱子前方为墙 return 5.3、箱子前方为箱子 return 5.4、箱子前方为已完成的箱子 return 5.5、箱子前方为终点 箱子前方位置设置为5 前方位置设置为2 当前位置设置为0 二、在终点上的人 1、移动方向为空白 前方设置为2 当前位置设置为4 2、移动方向为墙 直接return 3、移动方向为终点 前面设置为6 当前位置设置为4 4、移动方向为已完成的箱子 4.1、已完成箱子前面是箱子 return 4.2、已完成箱子前面是已完成的箱子 return 4.3、已完成箱子前面是墙 return 4.4、已完成箱子前面为空白 已完成箱子前面设置3 前方位置设置为6 当前位置设置为4 4.5、已完成箱子前面为终点 已完成箱子前面设置为5 前方位置设置为6 当前位置设置为4 5、前方为箱子 5.1、箱子前方为空白 箱子前方位置设置为3 前方位置设置为2 当前位置设置为4 5.2、箱子前方为墙 return 5.3、箱子前方为箱子 return 5.4、箱子前方为已完成的箱子 return 5.5、箱子前方为终点 箱子前方位置设置为5 前方位置设置为2 当前位置设置为4