Pygame实战之迷宫游戏的实现
程序员文章站
2024-01-21 08:32:16
目录导语正文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迷宫的资料请关注其它相关文章!