先拿资源:
百度网盘
链接:https://pan.baidu.com/s/1BK6UWMtaDkGGmZYim0APyg
提取码:
再来看效果:
最后看代码:
import pygame
import sys
import time
"""
空地:0
墙壁:1
障碍:2
目的地:3
箱子:4
玩家:5
玩家到达目的地:8
箱子到达目的地: 7
"""
"""
列表[i][j]: i-行(竖),j-列(横)
贴图[i][j]: i-x轴(横) , j-y轴(竖)
"""
# 游戏状态检测
result_flag = 0
# 定义游戏地图
init_game_list = []
# 箱子完成个数
xz = 0
# 页面检测
ym = 1 # 1.游戏页面 -1.说明页面
class Game(object):
def __init_game_map_list__(self):
global init_game_list, result_flag
list1 = [1, 1, 1, 1, 1, 1, 1, 1]
list2 = [1, 0, 0, 2, 0, 0, 0, 1]
list3 = [1, 0, 0, 2, 0, 7, 0, 1]
list4 = [1, 0, 0, 2, 0, 3, 2, 1]
list5 = [1, 2, 0, 4, 0, 0, 0, 1]
list6 = [1, 0, 4, 0, 0, 3, 0, 1]
list7 = [1, 5, 0, 2, 2, 0, 0, 1]
list8 = [1, 1, 1, 1, 1, 1, 1, 1]
init_game_list = [list1, list2, list3, list4, list5, list6, list7, list8]
def __event_hander__(self):
global init_game_list, result_flag, xz, ym
# test 是妥协的产物,for(for())嵌套无法退出导致down键循环运行(理论上right键也应该有这种问题,但是没有),test阻止循环
test = 1
for event in pygame.event.get():
if event.type == pygame.QUIT: # 关闭程序
pygame.quit()
sys.exit()
if xz == 3: # 判断胜利
result_flag = 1
print("游戏获胜")
if event.type == pygame.MOUSEBUTTONDOWN: # 判断重新开始
x, y = pygame.mouse.get_pos()
if x >= 300 and x <= 500 and y >= 710 and y <= 790:
self.game()
elif x >= 0 and x <= 100 and y >= 700 and y <= 800:
ym = -ym
if event.type == pygame.KEYDOWN and result_flag == 0 and ym == 1: # 判断按键
for i in range(1, 7, 1):
for j in range(1, 7, 1):
if (init_game_list[i][j] == 5 or init_game_list[i][j] == 8) and test == 1:
print(i, i, j, j)
if event.key == pygame.K_UP or event.key == pygame.K_w:
if init_game_list[i - 1][j] == 0 or init_game_list[i - 1][j] == 3:
init_game_list[i - 1][j] += 5
init_game_list[i][j] -= 5
elif (init_game_list[i - 1][j] == 4 or init_game_list[i - 1][j] == 7) and (
init_game_list[i - 2][j] == 0 or init_game_list[i - 2][j] == 3):
init_game_list[i - 1][j] += 1
init_game_list[i - 2][j] += 4
init_game_list[i][j] -= 5
elif event.key == pygame.K_DOWN or event.key == pygame.K_s:
if init_game_list[i + 1][j] == 0 or init_game_list[i + 1][j] == 3:
init_game_list[i + 1][j] += 5
init_game_list[i][j] -= 5
test = 0 # 只有这里会出现一按就运行到底的问题
break
elif (init_game_list[i + 1][j] == 4 or init_game_list[i + 1][j] == 7) and (
init_game_list[i + 2][j] == 0 or init_game_list[i + 2][j] == 3):
init_game_list[i + 1][j] += 1
init_game_list[i + 2][j] += 4
init_game_list[i][j] -= 5
test = 0 # 只有这里会出现一按就运行到底的问题
elif event.key == pygame.K_LEFT or event.key == pygame.K_a:
if init_game_list[i][j - 1] == 0 or init_game_list[i][j - 1] == 3:
init_game_list[i][j - 1] += 5
init_game_list[i][j] -= 5
elif (init_game_list[i][j - 1] == 4 or init_game_list[i][j - 1] == 7) and (
init_game_list[i][j - 2] == 0 or init_game_list[i][j - 2] == 3):
init_game_list[i][j - 1] += 1
init_game_list[i][j - 2] += 4
init_game_list[i][j] -= 5
elif event.key == pygame.K_RIGHT or event.key == pygame.K_d:
if init_game_list[i][j + 1] == 0 or init_game_list[i][j + 1] == 3:
init_game_list[i][j + 1] += 5
init_game_list[i][j] -= 5
elif (init_game_list[i][j + 1] == 4 or init_game_list[i][j + 1] == 7) and (
init_game_list[i][j + 2] == 0 or init_game_list[i][j + 2] == 3):
init_game_list[i][j + 1] += 1
init_game_list[i][j + 2] += 4
init_game_list[i][j] -= 5
break
def __print_map__(self):
global init_game_list, result_flag, ym, xz
xz = 0 # 妥协的代码
for i in range(0, 8, 1):
for j in range(0, 8, 1):
if init_game_list[i][j] == 0:
self.screen.blit(self.kd, (j * 100, i * 100))
elif init_game_list[i][j] == 1:
self.screen.blit(self.qb, (j * 100, i * 100))
elif init_game_list[i][j] == 2:
self.screen.blit(self.za, (j * 100, i * 100))
elif init_game_list[i][j] == 3:
self.screen.blit(self.mdd, (j * 100, i * 100))
elif init_game_list[i][j] == 4:
self.screen.blit(self.xz1, (j * 100, i * 100))
elif init_game_list[i][j] == 5:
self.screen.blit(self.r, (j * 100, i * 100))
elif init_game_list[i][j] == 7:
self.screen.blit(self.xz2, (j * 100, i * 100))
xz += 1 # 检测有多少个箱子到达目的地
print(xz)
elif init_game_list[i][j] == 8:
self.screen.blit(self.r, (j * 100, i * 100))
else:
self.screen.blit(self.error, (j * 100, i * 100))
if result_flag == 1: # 胜利提示图片
self.screen.blit(self.win, (200, 7))
if ym == -1: # 说明页面和返回游戏图片
self.screen.blit(self.sm_plus, (0, 0))
self.screen.blit(self.ret, (0, 700))
if ym == 1: # 查看说明页面图片
self.screen.blit(self.search, (0, 700))
self.screen.blit(self.restart, (300, 710)) # 重新开始图片
pygame.display.update()
def __image__(self):
global init_game_list, result_flag, xz, ym
pygame.display.set_caption("Python推箱子V1.00") # 设置窗口标题
result_flag = 0 # 游戏状态检测
init_game_list = [] # 定义游戏地图
xz = 0 # 箱子完成个数
ym = 1 # 页面检测 1.游戏页面 -1.说明页面
pygame.init()
self.screen = pygame.display.set_mode((800, 800), 0, 0)
self.sms = pygame.image.load("./images/sm.png")
self.sm_plus = pygame.image.load("./images/sm_plus.png")
self.qb = pygame.image.load("./images/qb.png")
self.kd = pygame.image.load("./images/kd.png")
self.xz1 = pygame.image.load("./images/xz1.png")
self.xz2 = pygame.image.load("./images/xz2.png")
self.za = pygame.image.load("./images/za.png")
self.r = pygame.image.load("./images/r.png")
self.mdd = pygame.image.load("./images/mdd.png")
self.error = pygame.image.load("./images/error.png")
self.restart = pygame.image.load("./images/restart.png")
self.win = pygame.image.load("./images/win.png")
self.search = pygame.image.load("./images/search.png")
self.ret = pygame.image.load("./images/return.png")
def game(self):
global init_game_list, result_flag
self.__image__() # 初始化图片及窗口资源
self.__init_game_map_list__() # 初始化地图列表数据
self.__print_map__() # 打印地图
while True:
self.__event_hander__() # 检测按键,更改玩家周围九格的数值
self.__print_map__() # 打印地图
if __name__ == '__main__':
song = Game()
song.game()
素材及其源码来源:
图片素材均为自制
源码没有原始借鉴,纯属原创。
作者之前创作过C语言版的推箱子,有三个关卡,可以选择关卡或者通关自动跳转下一关。
https://mp.csdn.net/editor/html/109370567
代码相对来说还算简洁,但是有两处妥协。
属于使用一些变量来解决一些莫名其妙的问题。
未来会做一些算法精进和新版本。
作品优点:
1.有便捷的说明书,不影响使用又美观。
2.素材丰富。
3.有便捷的重新开始功能
作品缺点:
1.关卡少,只有一关。
2.没有 “返回一步” 的功能。
3.没有良好的交互菜单。