Python推箱子V1.00

先拿资源:

百度网盘

链接:https://pan.baidu.com/s/1BK6UWMtaDkGGmZYim0APyg 
提取码:

再来看效果:

Python推箱子V1.00_第1张图片


 

Python推箱子V1.00_第2张图片

Python推箱子V1.00_第3张图片

Python推箱子V1.00_第4张图片

 

 

最后看代码:

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.没有良好的交互菜单。
 

你可能感兴趣的:(Python)