怎么用 Python 写一个迷宫游戏的程序?

在这里插入图片描述
一行之前做过少儿编程老师,做过非常多的2D游戏
迷宫有些也是其中之一

先给你贴上迷宫代码,直接复制粘贴就可以运行哦

import pygame
import game
from random import choice

ROWS = 30
COLUMS = 30
SIDE = 22
SCREEN_WIDTH = COLUMS * SIDE
SCREEN_HEIGHT = ROWS * SIDE
FOUR_NEIGH = {pygame.K_UP: (-1, 0), pygame.K_LEFT: (0, -1), pygame.K_RIGHT: (0, 1), pygame.K_DOWN: (1, 0)}
DIRE = {pygame.K_LEFT: pygame.K_RIGHT, pygame.K_RIGHT: pygame.K_LEFT,
        pygame.K_UP: pygame.K_DOWN, pygame.K_DOWN: pygame.K_UP}


class Cell(object):
    def __init__(self, screen, rect):
        self.screen = screen
        self.rect = rect
        self.walls = {key: False for key in FOUR_NEIGH}

        self.visited = 0
        self.type = 'nothing'

    def draw(self):
        if self.type == 'end':
            self.screen.fill(0x11ff11, self.rect)
        elif self.type == 'body':
            pygame.draw.circle(self.screen, 0xff1122, self.rect.center, (SIDE - 4) // 2)

        if not self.walls[pygame.K_LEFT]:
            start = (self.rect.left, self.rect.top)
            end = (self.rect.left, self.rect.top + self.rect.height)
            pygame.draw.line(self.screen, 0x000000, start, end, 2)

        if not self.walls[pygame.K_RIGHT]:
            start = (self.rect.left + self.rect.width - 2, self.rect.top)
            end = (self.rect.left + self.rect.width - 2, self.rect.top + self.rect.height)
            pygame.draw.line(self.screen, 0x000000, start, end, 2)

        if not self.walls[pygame.K_UP]:
            start = (self.rect.left, self.rect.top)
            end = (self.rect.left + self.rect.width, self.rect.top)
            pygame.draw.line(self.screen, 0x000000, start, end, 2)

        if not self.walls[pygame.K_DOWN]:
            start = (self.rect.left, self.rect.top + self.rect.height - 2)
            end = (self.rect.left + self.rect.width, self.rect.top + self.rect.height - 2)
            pygame.draw.line(self.screen, 0x000000, start, end, 2)


class Maze(game.Game):
    def __init__(self, title, size, fps=15):
        super(Maze, self).__init__(title, size, fps)
        self.init_game()

    def init_game(self):
        self.maze = []
        for i in range(ROWS):
            row = []
            for j in range(COLUMS):
                rect = pygame.Rect(j * SIDE, i * SIDE, SIDE, SIDE)
                row.append(Cell(self.screen, rect))
            self.maze.append(row)
        self.init_maze()

        self.body = (0, 0)
        self.bind_key(list(FOUR_NEIGH.keys()), self.move)
        self.start_time = pygame.time.get_ticks()

    def init_maze(self):
        history = [(0, 0)]
        while history:
            r, c = choice(history)
            self.maze[r][c].visited = True
            history.remove((r, c))
            check = []
            for key in FOUR_NEIGH:
                x, y = r + FOUR_NEIGH[key][0], c + FOUR_NEIGH[key][1]
                if x < 0 or y < 0 or x >= ROWS or y >= COLUMS:
                    continue
                if self.maze[x][y].visited == 1:
                    check.append(key)
                elif self.maze[x][y].visited == 0:
                    history.append((x, y))
                    self.maze[x][y].visited = 2
            if len(check):
                dire = choice(check)
                x, y = r + FOUR_NEIGH[dire][0], c + FOUR_NEIGH[dire][1]
                self.maze[r][c].walls[dire] = True
                self.maze[x][y].walls[DIRE[dire]] = True

        self.maze[0][0].type = "body"
        self.maze[ROWS-1][COLUMS-1].type = "end"

    def move(self, key):
        if self.end:
            return
        r, c = self.body
        x, y = r + FOUR_NEIGH[key][0], c + FOUR_NEIGH[key][1]
        if self.maze[r][c].walls[key] and self.maze[x][y].walls[DIRE[key]]:
            self.body = (x, y)
            self.maze[r][c].type = "nothing"
            self.maze[x][y].type = "body"
            self.is_draw = True

    def update(self, current_time):
        if self.end:
            return
        r, c = self.body
        if (r, c) == (ROWS-1, COLUMS-1):
            self.init_game()
            self.draw(0)
            # self.end = True
        time = (pygame.time.get_ticks() - self.start_time) / 1000
        title = "过关时间 ---- time: %.2f s" % (time)
        pygame.display.set_caption(title)

    def draw(self, current_time):
        if not self.is_draw or self.end:
            return
        self.is_draw = False
        self.screen.fill(0xffffff)
        for i in range(ROWS):
            for j in range(COLUMS):
                self.maze[i][j].draw()
        pygame.display.update()


if __name__ == '__main__':
    print('''
    欢迎来到无尽的迷宫
    按下方向键开始游戏.
    ''')
    maze = Maze("迷宫", (SCREEN_WIDTH, SCREEN_HEIGHT))
    maze.run()

在这里插入图片描述
天下武功,唯快不破

一行将选了编程技术各方面的经典书籍,并整理成电子书分享在看的知友

计算机必看经典书单(含下载方式)​

如果对你有帮助的话,记得给一行点个赞哦~
在这里插入图片描述

你好,我是一行,厦门大学硕士毕业,用python发表过两篇顶刊论文 日常分享python的技术学习,面试技巧,赚钱认知等,欢迎关注
@一行玩python 一行肝了3天,精选了9个方面的计算机技术资料,希望能够对你能有帮助 链接:
https://pan.baidu.com/s/1-OKeUGF1mWJM3O4mEV0DLg 提取码: 0000

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值