pygame写简单推箱子游戏
利用python的pygame包写一个简单的推箱子游戏
先设计游戏
首先想一想怎么设计游戏,比如,我是这样设计的,用一个矩阵去记录每一个关卡里图标的位置,所以有个关卡类,然后人这个对象类是必不可少的,还要按钮类等
- 关卡类,矩阵维护 ,定义一个88的矩阵,(理想化是88,最后贴图时你会发现多了其实也可以,只是窗口大小需要改变,定义死是为了保证游戏界面在窗口中居中)代表一个关卡,矩阵中,9,代表不填充,1代表墙,0代表空白地接,2代表当前箱子所在位置,3代表人,和4代表箱子应放置的位置(人经过变成5,箱子经过变成6)
- 如何维护,人的移动,对应矩阵操作,矩阵操作会进行判断是否可操作,还有箱子的移动,箱子移动是根据人的移动判断是否会带了箱子的移动,箱子移动是如何变化的,判断后贴图,怎样代表箱子运动了,1,人移动后的位置是箱子的位置,2箱子向人移动方向移动的位置不是墙或箱子。所以矩阵操作会有3种情况的返回值,0 代表不能移动,1代表人可以移动,2代表箱子也会移动,
- 人和箱子移动 ,箱子移动是由人移动带动的,所以,人移动了,才有可能带来箱子移动,我们只需判断,人移动是否能带来箱子移动,也是矩阵维护类返回结果告诉我们
- 关于过关和选关,简单贴图,设置了下一关和上一关,和当前关卡显示,如果当前关卡为1,上一关关卡颜色为青色,同理,下一关关卡为青色,鼠标经过按钮区域,贴灰色,怎样就有一种按钮感觉。过关, 矩阵中贴图时记录下正确点的位置,如果所有正确点的位置值是6,那就过关了。
- 撤销,利用栈去做,栈里放上一步矩阵没改变的样子,撤销时就把矩阵里值换成栈弹出的矩阵。
- 其他说明 对于人移动上的操作,我是那些改变那些贴图,但是对于那些鼠标点击事件(上一关,下一关,重新开始,撤销这些操作),全是窗口整体重新贴图
上代码吧
1.关卡类
import pygame
from txz.back_queue import back_queue
import copy
#关卡
class lev:
#关卡字典,存储每一关对应图标位置
dit = {
1:[
[9,9,1,1,1,9,9,9],
[9,9,1,4,1,9,9,9],
[9,9,1,0,1,1,1,1],
[1,1,1,2,0,2,4,1],
[1,4,0,2,3,1,1,1],
[1,1,1,1,2,1,9,9],
[9,9,9,1,4,1,9,9],
[9,9,9,1,1,1,9,9]
],
2:[
[9,9,1,1,1,1,9,9],
[9,9,1,4,4,1,9,9],
[9,1,1,0,4,1,1,9],
[9,1,0,0,2,4,1,9],
[1,1,0,2,3,0,1,1],
[1,0,0,1,2,2,0,1],
[1,0,0,0,0,0,0,1],
[1,1,1,1,1,1,1,1]
],
3:[
[9,9,1,1,1,1,9,9],
[9,1,1,0,0,1,9,9],
[9,1,3,2,0,1,9,9],
[9,1,1,2,0,1,1,9],
[9,1,1,0,2,0,1,9],
[9,1,4,2,0,0,1,9],
[9,1,4,4,6,4,1,9],
[9,1,1,1,1,1,1,9]
],
4:[
[1,1,1,1,1,9,9,9,9],
[1,0,0,0,1,1,1,1,1],
[1,2,1,0,1,0,0,0,1],
[1,0,0,0,0,0,2,0,1],
[1,4,5,1,2,1,2,1,1],
[1,4,2,0,0,0,0,1,9],
[1,4,4,0,0,1,1,1,9],
[1,1,1,1,1,1,9,9,9]
],
5:[
[9,1,1,1,1,1,1,9],
[9,1,0,0,0,0,1,9],
[9,1,0,2,2,0,1,9],
[9,1,1,6,3,0,1,9],
[9,1,0,4,0,1,9,9],
[9,1,0,6,0,1,9,9],
[9,1,0,6,0,1,9,9],
[9,1,0,4,0,1,9,9],
[9,1,1,1,1,1,9,9]
],
6:[
[9,1,1,1,1,1,1,9,9],
[9,1,0,0,0,0,1,1,9],
[1,1,4,1,1,0,0,1,9],
[1,0,6,5,0,0,0,1,9],
[1,0,0,1,2,2,0,1,9],
[1,0,0,0,0,1,1,1,9],
[1,1,1,1,1,1,9,9,9],
[9,9,9,9,9,9,9,9,9]
],
7:[
[9,1,1,1,1,1,9,9,9],
[9,1,0,3,0,1,1,1,9],
[1,1,0,1,2,0,0,1,9],
[1,0,6,4,0,4,0,1,9],
[1,0,0</