Pygame实战之迷宫游戏的实现

目录
  • 导语
  • 正文
    • 1)效果展示
    • 2)主程序

导语

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

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

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

之前给大家更新过一款《走迷宫》的小游戏大家还记得嘛?!后面有小伙伴儿让我做一款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迷宫的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python Pygame实战之打地鼠小游戏

    目录 前言 开发工具 环境搭建 原理简介 前言 今天给大家写一个个打地鼠小游戏,废话不多说直接开始- 开发工具 Python版本: 3.6.4 相关模块: pygame模块: 以及一些Python自带的模块. 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 原理简介 打地鼠的游戏规则相信大家都知道,这里就不多介绍了,反正就是不停地拿锤子打洞里钻出来的地鼠~ 首先,让我们确定一下游戏中有哪些元素.打地鼠打地鼠,地鼠当然得有啦,那我们就写个地鼠的游戏精灵类: '''地鼠'

  • Python+Pygame制作简易版2048小游戏

    目录 导语 正文 主要代码 效果图 导语 哈喽!大家好,我是栗子,感谢大家的支持! 新的一天,新气象,程序猿们的日常开始敲敲敲,改改改——今天给大家来一款简单的小游戏! 2048小游戏——准确的来说确实是一个简单版本的! 呐呐呐 ,主要是担心很多小伙伴儿直接上界面版本的看不懂,所以做了这款简单的2048,先看这篇简单版本的吧! 正文 为了搞懂这个游戏的规则,小编去直接下载了一款2048的小游戏,上手玩了一波! 然后.........完全停不下来!23333~ 玩法: 用手指或键盘上下左右滑动,将

  • Pygame实战练习之纸牌21点游戏

    导语 ​ 昨天不是周天嘛? 你们在家放松一般都会做什么呢? 周末逛逛街,出去走走看电影......这是你们的周末. 程序员的周末就是在家躺尸唐诗躺尸,偶尔加班加班加班,或者跟着几个朋友在家消遣时间打打麻将,扑克牌玩一下! ​ 尤其是放长假[ps:也没啥假,长假就是过年]在老家的时候,亲戚尤其多,七大姑八大姨的一年好不容易聚一次,打打麻将跟扑克这是常有的事儿,联络下感情这是最快的方式~ 说起打扑克,我们经常就是玩儿的二百四.炸金花.三个打一个那就是叫啥名字来着,容我想想...... ​ ​话说真词

  • Python实现过迷宫小游戏示例详解

    目录 前言 开发工具 环境搭建 原理简介 主要代码 前言 今天为大家带来解闷用的过迷宫小游戏分享给大家好了.让我们愉快地开始吧~ 开发工具 Python版本: 3.6.4 相关模块: pygame模块: 以及一些Python自带的模块. 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 原理简介 游戏规则: 玩家通过↑↓←→键控制主角行动,使主角从出发点(左上角)绕出迷宫,到达终点(右下角)即为游戏胜利. 逐步实现: 首先,当然是创建迷宫啦,为了方便,这里采用随机生成迷

  • 如何用 Python 制作一个迷宫游戏

    相信大家都玩过迷宫的游戏,对于简单的迷宫,我们可以一眼就看出通路,但是对于复杂的迷宫,可能要仔细寻找好久,甚至耗费数天,然后可能还要分别从入口和出口两头寻找才能找的到通路,甚至也可能找不到通路. 虽然走迷宫问题对于我们人类来讲比较复杂,但对于计算机来说却是很简单的问题.为什么这样说呢,因为看似复杂实则是有规可循的. 我们可以这么做,携带一根很长的绳子,从入口出发一直走,如果有岔路口就走最左边的岔口,直到走到死胡同或者找到出路.如果是死胡同则退回上一个岔路口,我们称之为岔口 A, 这时进入左边第二

  • Pygame实战之经典泡泡龙小游戏

    目录 导语 ​正文 一.准备中 二.开始敲代码 三.效果展示 总结 导语 Python版的消除类的游戏还是很多的,木木子之前也是推过不少~ 比如:百变的消消乐,还记得嘛?今天就出一个消除类--泡泡龙小游戏,希望你们喜欢哈~​! <泡泡乐>是一款适合全年龄玩家的游戏,采用非常经典的"泡泡龙"式的消除泡泡的玩法,游戏没有太多创新玩法,容 易上手.当我们一个人独处而无人聊天时可以用它来打发时间.来来来,跟着木木子一起开始玩泡泡龙游戏吧~ ​正文 一.准备中 1)游戏规则: 游戏玩

  • Pygame坦克大战游戏开发实战详解代码

    导语 哈喽!哈喽——我是木木子 今天来升级下之前写的坦克大战游戏嘛,哈哈哈 其实也不算是修改,就是稍微的调试一下!​​ 因为之前写的界面都是英文的 ,有的小伙伴儿英文一点儿都不会的可能看着别扭,今天来一款中 文版的给大家嘛! 俗话说的好:“雨露均沾”.哈哈哈.jpg 小简介: <坦克大战>,1985年由日本开发商南梦宫(Namco)开发,是第一款可以双打的红白机游戏. 当时使用的还是小霸王. 很多小朋友以学习的名义买了以后偷偷打的打游戏还被家长发现了有 没得! <坦克大战>红白机原

  • Pygame实战之迷宫游戏的实现

    目录 导语 正文 1)效果展示 2)主程序 导语 哈喽!哈喽我是栗子,每日更新来啦—— “玩迷宫游戏长大的我们,欣慰地看到,下一代仍热爱着这个经典游戏. 如果你的孩子也爱玩迷宫,那真要恭喜你了.” 之前给大家更新过一款<走迷宫>的小游戏大家还记得嘛?!后面有小伙伴儿让我做一款ai版本的,让自动儿,今天,让我们发挥想象力,一起用代码做一款AI版本的迷宫吧!还可以锻炼脑力一直玩儿啦~ 正文 本文小程序用递归的方法解决迷宫问题,加入了可以自动生成迷宫,但有些问题还不是很明白生成迷宫用了很笨的方法,在

  • Python Pygame实战之赛车游戏的实现

    目录 导语 一.环境安装 1)运行环境 2)素材环境 二.代码展示 三.效果展示 游戏开始—— 游戏界面—— 游戏结束—— 导语 小伙伴们大家好~ 如今的游戏可谓是层出不穷,NBA 2K系列啊,FIFA系列啊更是经典中的经典,不过小编发现,赛车游戏也是深受大家欢迎啊,像跑跑卡丁车.QQ飞车,还有主机游戏极品飞车系列. 咳咳咳......小编那时候主要是最喜欢里面的人物颜值来的! 赛车游戏,通常以款式多样的车型.各式各样的赛道.身临其境的拟真度吸引了众多玩家,而玩家在游戏中需要驾驶各类赛车驰骋在世

  • Python Pygame实战之愤怒的小鸟游戏实现

    目录 前言 一.运行环境 二.代码展示 三.效果展示 1)第一关 2)闯关成功 ​3)其他关卡(随机截图) 4)闯关失败 前言 <愤怒的小鸟>其实活得还不错,尽管我们一直在嘲笑它的IP帝国梦做得太大. 但要知道,把休闲益智游戏的生意做到这个份上的,恐怕也就独此一家了.尤其还是这样的一款古早.过时.难让人相信还能翻出什么花样的游戏.继前两期的效果来看,大家还是依旧挺喜欢这款游戏的啦~嘿!我是栗子,今天终于迎来了最终版本啦~ 这一期给大家写完<愤怒的小鸟最终版>三期完结撒花! 后续再想

  • Python+Pygame实战之泡泡游戏的实现

    目录 导语 一.环境安装 二.代码展示 三.效果展示 导语 泡泡王国 欢乐多多 咕噜噜,吹泡泡,七彩泡泡满天飘.大的好像彩气球,小的就像紫葡萄. ​当泡泡漫天飞舞时,大朋友.小朋友都会情不自禁地被它吸引.而当珍珠般的泡泡遇上可爱的程序员门时,又会出现什么样的美丽风景呢? 说到4399小游戏,没有人会陌生吧?我小时候经常趁着家长不在家的时候偷偷打开电脑打开小游戏的网页,在电脑桌前一坐就是一下午,真的不能赖我不适可而止,而是这些游戏真的太好 玩了!关于童年的经典游戏and有关泡泡的,之前已经仿写了一

  • Python Pygame实战之塔防游戏的实现

    目录 一.环境要求 二.游戏介绍 1.游戏目标 2.先上游戏效果图 三.完整开发流程 1.项目主结构 2.详细配置 3.定义敌人.塔楼.子弹的类 4.游戏开始:选择难度地图 5.游戏开始界面 6.游戏运行 7.游戏暂停 8.游戏结束及分数 9.引入音频.图片.地图.难度json 四.游戏启动方法 一.环境要求 windows系统,python3.6+ 安装模块 pip install pyqt5 pip install pygame 二.游戏介绍 1.游戏目标 按照关卡,设计不同的塔防地图(博主

  • python实战之利用pygame实现贪吃蛇游戏(二)

    一.前言 在上一篇博客中,我们实现了基本的界面搭建,这次实现一下逻辑部分. 二.创建蛇 首先,先分析一下蛇的移动,不然我们一定会吃亏的(别问,问就是自己写了一堆无效代码). 蛇的移动其实并没有想象中那样复杂,每一个模块都需要有一个方向,按照方向进行移动. 其实实际上就是一个出队的感觉,即每一个元素都取代上一个元素的位置,然后再按照贪吃蛇当前的方向,移动一下头节点即可. snake.py: """"

  • python实战之利用pygame实现贪吃蛇游戏(一)

    一.前言 之前尝试了自己用pygame写井字棋,这次玩的是贪吃蛇系列. 个人感觉模块可能会比较大,所以选择将函数和主要逻辑代码分在了两个文件中. fuc为函数模块,存储了事件感应和刷新界面等部分. main模块则是游戏的核心. 二.搭建界面 这里我就不重复了,可以先看一下这篇博客 其中界面的基本要素都有. main.py import pygame from fuc import * # 基本属性 lattice_wh = 20 #长宽 snake_color = (84, 255, 159)

  • Pygame实战练习之保护单身狗游戏

    导语 各位戏精大家好!我是木木子,这个中秋已经结束了,你们都带着对象回家了码? 中秋那几天朋友圈简直是大型秀恩爱现场. 又是一年中秋夜,依旧凭实力单身!呼吁大家记得保护下单身狗啊喂! ​ 作为一条人畜无害可可爱爱的单身狗 每年的假期几乎都被伤的体无完肤,今年我们不仅要好好生存,还要勇敢报复,让情侣们知道: 单身狗不是这么好欺负的~单身狗们报仇吧!今天带大家写一款贼有趣的单身狗小游戏~ ​ ​ 正文 首先准备好图片素材等: bgm音乐必备: import pygame class Sound():

  • Pygame实战练习之炸弹人学院游戏

    导语 在现在这个浮躁的年代:小编每次登陆王者荣耀,还有每次登陆刺激战场Z! 看着里面的聊天界面,各种代打.各种的找cp.小小编觉得,我们已经失去了玩游戏的初心. 接下来,小台将带领你们走回童年时光,一起领略我们当初玩4399的单纯与天真! ​ 还记得小时候小台每到放学时刻,就会拉着只比我小半岁的小表妹,一块去亲戚家里玩电脑 每一次打开电脑做的第一件事情就是,打开浏览器,输入4399这四个数字,那个时候觉得hao123真是一个神奇的主页! 可以让我打开4399玩各种游戏qwq,尤其是Q版泡泡堂深得

  • Pygame实战练习之飞机大战游戏

    导语 承载童年的纸飞机你还会叠嘛? 如果你是个80后或者90后,那你应该记得小时候玩的纸飞机. 叠好后,哈口仙气,飞出去,感觉棒棒哒. ​ 虽然是一个极其简单的玩具,但那时候,很多熊孩子能傻傻地玩上一整天. 今天带大家制作一款彩色版本另一个版本的飞机大冒险~ 欢迎阅读往期另一个飞机大战的文章:python开发飞机大战游戏. Are you ready? 一起开启飞机大冒险吧~ ▼▼▼ 正文 首先准备好飞机大冒险的图片: ​ 环境安装:主要游戏模块pygame. pip install pygam

随机推荐