Pygame实战之迷宫游戏的实现

 更新时间:2022年02月18日 15:57:20   作者:嗨!栗子同学  
玩迷宫游戏长大的我们,欣慰地看到,下一代仍热爱着这个经典游戏。本文将通过Python中的Pygame库制作这一经典的游戏,需要的可以参考一下

导语

哈喽!哈喽我是栗子,每日更新来啦——

“玩迷宫游戏长大的我们,欣慰地看到,下一代仍热爱着这个经典游戏。

如果你的孩子也爱玩迷宫,那真要恭喜你了。”

之前给大家更新过一款《走迷宫》的小游戏大家还记得嘛?!后面有小伙伴儿让我做一款ai版本的,让自动儿,今天,让我们发挥想象力,一起用代码做一款AI版本的迷宫吧!还可以锻炼脑力一直玩儿啦~

正文

本文小程序用递归的方法解决迷宫问题,加入了可以自动生成迷宫,但有些问题还不是很明白生成迷宫用了很笨的方法,在生成20行、列以上的迷宫时会很慢啦~

就简单的研究一下,之后有更好的会继续学了给大家更新滴!

1)效果展示

2)主程序

代码共主要有三块,太多了所以这里只展示主程序的代码

import random
import pygame
 
FPS = 60
ROW = 10
COL = 10
BLOCK = 20
BORDER = 20
SCREEN_WIDTH = COL * BLOCK + BORDER * 2
SCREEN_HEIGHT = ROW * BLOCK + BORDER * 2
IMPOSSIBLE_COLOR = (128, 128, 128)
POSSIBLE_COLOR = (76, 141, 174)
ROUTE_COLOR = (12, 137, 24)
 
 
# noinspection PyPep8Naming
class DrawMaze(object):
    def __init__(self):
        self.screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))    # 创建屏幕对象
        pygame.display.set_caption('{}*{} Maze'.format(ROW, COL))               # 窗口标题
        self.clock = pygame.time.Clock()
        self.color = POSSIBLE_COLOR                 # 首先设置路径块与可能块的颜色相同
        self.maze = MakeMaze().create(ROW, COL)
        self.no_route = True
 
    def display(self):
        """ 在窗口中显示迷宫,按任意键显示路径 """
        while True:
            self.screen.fill((0, 0, 0))
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    exit()
                if event.type == pygame.MOUSEBUTTONDOWN:    # 按鼠标显示路径,再按取消显示
                    if self.no_route:
                        self.color = ROUTE_COLOR
                        self.no_route = False
                    else:
                        self.color = POSSIBLE_COLOR
                        self.no_route = True
                if event.type == pygame.KEYDOWN:            # 按任意键重新生成迷宫
                    self.maze = MakeMaze().create(ROW, COL)
 
            self.drawBlock(self.color)
            self.clock.tick(FPS)
            pygame.display.update()
 
    def drawBlock(self, color):
        """ 用遍历取出迷宫数据并在窗口中画颜色块 """
        for i, line in enumerate(self.maze):
            for j, value in enumerate(line):
                rect = (j * BLOCK + BORDER, i * BLOCK + BORDER, BLOCK, BLOCK)
                if value == 0:
                    pygame.draw.rect(self.screen, IMPOSSIBLE_COLOR, rect, 0)
                elif value == 1:
                    pygame.draw.rect(self.screen, POSSIBLE_COLOR, rect, 0)
                else:
                    pygame.draw.rect(self.screen, color, rect, 0)
 
 
# noinspection PyPep8Naming
class MakeMaze(object):
    def __init__(self):
        self.route_list = []        # 初始化路线列表
 
    # noinspection PyUnusedLocal
    def create(self, x, y):
        """ 生成迷宫 """
        route_list = []  # 初始化路线列表
        while True:
            maze = [[random.choice([0, 1]) for j in range(y)] for i in range(x)]
            maze[0][0] = 1
            if self.walk(maze, 0, 0):
                return maze
 
    def walk(self, maze, x, y):
        """
        如果位置是迷宫的出口,说明成功走出迷宫
        依次向下、右、左、上进行探测,走的通就返回True,然后继续探测,走不通就返回False
        """
        if x == len(maze) - 1 and y == len(maze[0]) - 1:
            maze[x][y] = 2                      # 将出口位置做标记
            return True
 
        if self.validPos(maze, x, y):           # 递归主体实现
            self.route_list.append((x, y))      # 将位置加入路线列表中
            maze[x][y] = 2                      # 做标记,防止折回
            if self.walk(maze, x + 1, y) or self.walk(maze, x, y + 1) \
                    or self.walk(maze, x, y - 1) or self.walk(maze, x - 1, y):
                return True
            else:
                maze[x][y] = 1                  # 没走通把上一步位置标记取消,以便能够退回
                self.route_list.pop()           # 在位置列表中删除位置,即最后一个元素
                return False
        return False
 
    @staticmethod
    def pprint(maze):
        """ 打印迷宫 """
        [print(n) for n in maze]
 
    @staticmethod
    def validPos(maze, x, y):
        """ 判断坐标的有效性,如果超出数组边界或是不满足值为1的条件,说明该点无效返回False,否则返回True """
        if len(maze) > x >= 0 and len(maze[0]) > y >= 0 and maze[x][y] == 1:
            return True
        else:
            return False
 
 
def main():
    drawer = DrawMaze()                 # 用迷宫生成画图对象
    drawer.display()                    # 显示迷宫
 
 
if __name__ == '__main__':
    main()

以上就是Pygame实战之迷宫游戏的实现的详细内容,更多关于Pygame迷宫的资料请关注脚本之家其它相关文章!

相关文章

  • 备战618!用Python脚本帮你实现淘宝秒杀

    备战618!用Python脚本帮你实现淘宝秒杀

    本次的文章,分享一个淘宝秒杀脚本,这个脚本用Python编写,使用了Python库selenium,并且通过selenium + chromedriver,用程序控制chrome浏览器,完成抢购的一系列操作.有了这个脚本,大家至少可以与其他的机器人站在同一起跑线上,公平抢购喜欢的宝贝 ,需要的朋友可以参考下
    2021-06-06
  • pytorch中permute()函数用法补充说明(矩阵维度变化过程)

    pytorch中permute()函数用法补充说明(矩阵维度变化过程)

    这篇文章主要给大家介绍了关于pytorch中permute()函数用法补充说明的相关资料,本文详细说明了permute函数里维度变化的详细过程,需要的朋友可以参考下
    2022-04-04
  • pycharm无法导入lxml的解决办法

    pycharm无法导入lxml的解决办法

    这篇文章主要介绍了pycharm无法导入lxml的解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Sanic框架异常处理与中间件操作实例分析

    Sanic框架异常处理与中间件操作实例分析

    这篇文章主要介绍了Sanic框架异常处理与中间件操作,结合实例形式较为详细的分析了Sanic框架抛出异常、异常处理、中间件、监听器相关原理与操作技巧,需要的朋友可以参考下
    2018-07-07
  • Python3离线安装Requests模块问题

    Python3离线安装Requests模块问题

    这篇文章主要介绍了Python3离线安装Requests模块问题,本文实例代码给大家介绍的非常详细,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-10-10
  • 使用pytorch完成kaggle猫狗图像识别方式

    使用pytorch完成kaggle猫狗图像识别方式

    今天小编就为大家分享一篇使用pytorch完成kaggle猫狗图像识别方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • python 实现音频叠加的示例

    python 实现音频叠加的示例

    这篇文章主要介绍了python 实现音频叠加的示例,帮助大家更好的理解和使用python处理声音文件,感兴趣的朋友可以了解下
    2020-10-10
  • Django项目如何配置Memcached和Redis缓存?选择哪个更有优势?

    Django项目如何配置Memcached和Redis缓存?选择哪个更有优势?

    这篇文章主要介绍了Django项目如何配置Memcached和Redis缓存,帮助大家更好的理解和学习使用django框架,感兴趣的朋友可以了解下
    2021-04-04
  • python图片验证码生成代码

    python图片验证码生成代码

    这篇文章主要为大家详细介绍了python图片验证码生成代码,感兴趣的朋友可以参考一下
    2016-07-07
  • python动态视频下载器的实现方法

    python动态视频下载器的实现方法

    这里向大家分享一下python爬虫的一些应用,主要是用爬虫配合简单的GUI界面实现视频,音乐和小说的下载器。今天就先介绍如何实现一个动态视频下载器,需要的朋友可以参考下
    2019-09-09

最新评论