Python实现迷宫游戏

2023-11-20

摘要

本次实验设计了一款迷宫小游戏,采用用Python开发技术实现。以往经典的的游戏中有魂斗罗,拳皇,超级玛丽,贪吃蛇,俄罗斯方块等;发展到现在,玩游戏已经成为生活的一部分了,尤其是现在的很多游戏都已经网络社交化了,游戏种类也更加丰富了。Python在设计上坚持了清晰划一的风格,这使得Python成为一门易读、易维护,并且被大量用户所欢迎的、用途广泛的语言。因此,利用Python语言制作一个简单的迷宫小游戏,将是本次论文讨论的内容。该迷宫小游戏使用几个模块绘制呈现,并实现可以自由操作的功能。
This experiment designed a small maze game, using Python development technology to achieve.Past classic games have contra, Boxing Emperor, Super Mary, snake, Tetris and so on,Up to now, playing games has become a part of life, especially now many games have been social network, games have become more diversified. Python’s adherence to a clear and uniform style of design has made it an easy-to-read, maintainable, and versatile language that is popular with a large number of users. Therefore, using Python language to make a simple maze game will be the content of this paper.The maze game USES several modules to draw and render, and to achieve the function of free operation.

1.引言

1.1研究的背景及意义

Python是一种跨平台的计算机程序设计语言。 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。
当Python作为游戏脚本内嵌在游戏中,这样做即可以利用游戏引擎的高性能,又可以受益于脚本化开发的优点。即游戏剧本、数据、玩法逻辑这类需要灵活修改和调整的部分可以写在脚本中,只需要修改脚本内容就可以调整游戏内容,不需要重新编译游戏。简单的小游戏可以直接用Python一类的脚本语言开发,善用一些库应该也可以达到不错的性能。

1.2研究的内容

为了了解Python的模块脚本的使用,本次实验使用Python语言实现的一款迷宫小游戏,从而去更深度认识Python的功能。本次实验分三个模块绘制,首先用Maze类绘制出迷宫地图,再用Player类实现玩家的方向动作,再由Controller类实现操作器让玩家方便操作,最后在主函数中运行实现迷宫小游戏。

2.系统结构

2.1系统的结构

本次项目由主函数、maze模块、player模块和controller模块组成。如下图所示。
图2-1

2.2基本思路

先创建maze模块绘制迷宫地图;再定义玩家移动前后的位置方向;再设计操作器实现玩家自由操作;最后由主函数将各个模块集合。其流程图如下图所示。
图2-2

3.实现代码

在迷宫问题中,首先解决的就是迷宫的地图,我们从实现的效果以及主函数中,不难得知在主函数中的maze_list里,1表示迷宫的墙,0表示迷宫内的通道,如下图所示:
图3-1

3.1Maze类

而实际实现迷宫的绘制在Maze类中,以下为maze模块中的代码及解析。在Maze类中,先调用Turtle父类初始化方法,方便后面调用,再绘制出迷宫内的一格墙,最后由一格墙循环打印出整个迷宫。

from turtle import Turtle
import turtle

#设置游戏的窗口大小和背景颜色
turtle.screensize(800,600, "pink")

class Maze(Turtle):
  size = 20    #迷宫内一格墙的长宽
  
  def __init__(self, maze_list):
    # 需要先调用父类的初始化方法才能在初始化方法中调用父类的方法
    Turtle.__init__(self)
    self.maze_list = maze_list
    # 为了加快绘图速度隐藏海龟,速度设为最快
    self.hideturtle()
    self.speed(0)
    self.draw_walls()

#绘制迷宫内一格墙的过程
  def draw_wall(self):
    self.pendown()
    self.begin_fill()
    #绘制墙的颜色
    self.fillcolor('red')
    #首先画一个距离为20的横线,再向右旋转90度,循环4次形成方形
    for i in range(4):
      self.forward(self.size)
      self.right(90)
    self.end_fill()
    self.penup()

#绘制整个迷宫的墙
  def draw_walls(self):
    self.penup()
    # 从 (-130, 130) 开始
    self.goto(-130, 130)
    #打印墙,横纵循环13次(整个迷宫的长和宽由13格墙组成)
    for row in range(13):
      for col in range(13):
        #主函数中的maze_list里面的1则打印出一格墙
        if self.maze_list[row][col] == 1:
          self.draw_wall()
        # 右移一列
        self.goto(self.size * (col + 1) - 130, 130 - self.size * row)
      # 下移一行
      self.goto(-130, 130 - self.size * (row + 1))

3.2Player类

迷宫内自然需要一个玩家(海龟)来走出迷宫,所以此处用Player类对玩家player进行定义,以下为player模块中的代码及解析。其中通过对玩家的初始位置、终点位置、以及移动到相应的位置的定义,实现玩家在迷宫内的通道移动,即移动时的位置和玩家自身方向的改变。

from turtle import Turtle
import turtle

class Player(Turtle):
  def __init__(self, maze_list, start_m, start_n, end_m, end_n):
    # 父类初始化
    Turtle.__init__(self)
    #初始的横纵坐标
    self.m = start_m
    self.n = start_n
    #终点的横纵坐标
    self.end_m = end_m
    self.end_n = end_n
    #迷宫地图
    self.maze_list = maze_list
    self.hideturtle()
    self.speed(0)
    self.penup()
    # 玩家移到对应的位置
    self.goto(self.n * 20 - 120, 120 - self.m * 20)
    # 生成玩家
    self.shape('turtle')
    self.color('yellow')
    #玩家初始方向
    self.setheading(270)
    self.showturtle()
    
#当玩家到达终点时,显示'you win!'
  def reach_exit(self, m, n):
    if m == self.end_m and n == self.end_n:
      # 走出迷宫,显示'you win!'
      text = turtle.Turtle()
      text.hideturtle()
      text.penup()
      text.goto(-125, -10)
      text.color('blue')
      text.write('you win!', font = ('SimHei', 48, 'bold'))

  #定义玩家可移动的位置,即只允许在迷宫内的通道里移动
  def canmove(self, m, n):
    #遇到0允许移动
    return self.maze_list[m][n] == 0

  #玩家移动时位置发生的变化
  def move(self, m, n):
    self.m = m
    self.n = n
    self.goto(self.n * 20 - 120, 120 - self.m * 20)
    self.reach_exit(m, n)

  #向上移动
  def go_up(self):
    if self.canmove(self.m - 1, self.n):
      self.setheading(90)
      self.move(self.m - 1, self.n)

  #向下移动
  def go_down(self):
    if self.canmove(self.m + 1, self.n):
      self.setheading(270)
      self.move(self.m + 1, self.n)

  #向左移动
  def go_left(self):
    if self.canmove(self.m, self.n - 1):
      self.setheading(180)
      self.move(self.m, self.n - 1)

  #向右移动
  def go_right(self):
    if self.canmove(self.m, self.n + 1):
      self.setheading(0)
      self.move(self.m, self.n + 1)

3.3Controller类

当拥有玩家出现时,便需要让玩家拥有操作器,从而操作玩家离开迷宫,所以此处使用controller模块,其功能是为了方便玩家的控制,以下为controller模块中的代码及解析。在Controller类中,先绘制出控制器上、下、左、右的图示,再绑定鼠标的点击事件,最后用abs函数进行比较去判断鼠标点击时的位置方向控制。

from turtle import Turtle
import turtle

class Controller(Turtle):
  def __init__(self, go_up, go_down, go_left, go_right):
    # 父类初始化
    Turtle.__init__(self)
    # 初始值设置
    self.go_up = go_up
    self.go_down = go_down
    self.go_left = go_left
    self.go_right = go_right
    # 绘制控制器
    self.hideturtle()
    self.speed(0)
    self.draw_btn('上', -15, 165)
    self.draw_btn('下', -15, -135)
    self.draw_btn('左', -165, 15)
    self.draw_btn('右', 135, 15)
    # 绑定点击事件
    screen = self.getscreen()
    screen.onclick(self.handlescreenclick)

  #此处与绘制迷宫内一格墙的方法雷同,不做解释
  def draw_btn(self, name, x, y):
    self.penup()
    self.goto(x, y)
    self.begin_fill()
    self.fillcolor('#ffffff')
    for i in range(4):
      self.forward(30)
      self.right(90)
    self.end_fill()
    self.color('#000000')
    self.goto(x + 7, y - 20)
    self.write(name, font = ('SimHei', 12, 'bold'))

  #当点击事件发生时利用abs函数进行比较判断
  def handlescreenclick(self, x, y):    
    if y > 0 and abs(x) < y:
      self.go_up()
    if y < 0 and abs(x) < -y:
      self.go_down()
    if x < 0 and abs(y) < -x:
      self.go_left()
    if x > 0 and abs(y) < x:
      self.go_right()

3.4主函数

最后再由主函数将各个模块集合。

from maze import Maze
from player import Player
from controller import Controller

maze_list = [
  [1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1],
  [1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1],
  [1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1],
  [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1],
  [1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1],
  [1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1],
  [1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1],
  [1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1],
  [1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1],
  [1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1],
  [1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1],
  [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1],
  [1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1]
]

Maze(maze_list)
#0,5表示玩家起始的位置;12,7表示终点的位置
player = Player(maze_list, 0, 5, 12, 7)     
Controller(player.go_up, player.go_down, player.go_left, player.go_right)

4.实验

实验结果如图。
图4-1
通过点击上、下、左、右控制玩家的移动,如图。
图4-2
当玩家走到终点时,将显示出’you win!’,如图。
图4-3

5.总结和展望

基于Python的迷宫小游戏是采用python语言及其模块开发完成的。本项目实现了游戏流程中的所有功能,其游戏操作容易上手,界面设计颜色感官简洁明了,其内容功能有可拓展性,方便为来程序的优化设计。
这次项目设计开发为今后的学习和工作产生了积极的意义。由于还是初学者,在项目设计中还有欠缺和考虑不周的地方,游戏还有待进一步研究和改善,比如迷宫的地图目前没有设计随机生成等不足。

参考文献

[1]https://blog.csdn.net/jark_/article/details/77532105
[2]https://blog.csdn.net/qq_29681777/article/details/83719680
[3]https://www.jianshu.com/p/b5b1391420f1

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python实现迷宫游戏 的相关文章

  • 保存为 HDF5 的图像未着色

    我目前正在开发一个将文本文件和 jpg 图像转换为 HDF5 格式的程序 用HDFView 3 0打开 似乎图像仅以灰度保存 hdf h5py File Sample h5 img Image open Image jpg data np
  • 中断 Select 以添加另一个要在 Python 中监视的套接字

    我正在 Windows XP 应用程序中使用 TCP 实现点对点 IPC 我正在使用select and socketPython 2 6 6 中的模块 我有三个 TCP 线程 一个读取线程通常会阻塞select 一个通常等待事件的写入线程
  • 元组有什么用?

    我现在正在学习 Python 课程 我们刚刚介绍了元组作为数据类型之一 我阅读了它的维基百科页面 但是 我无法弄清楚这种数据类型在实践中会有什么用处 我可以提供一些需要一组不可变数字的示例吗 也许是在 Python 中 这与列表有何不同 每
  • 用枢轴点拟合曲线 Python

    我有下面的图 我想用 2 条线来拟合它 使用 python 我设法适应上半部分 def func x a b x np array x return a x b popt pcov curve fit func up x up y 我想用另
  • 将 python2.7 与 Emacs 24.3 和 python-mode.el 一起使用

    我是 Emacs 新手 我正在尝试设置我的 python 环境 到目前为止 我已经了解到在 python 缓冲区中使用 python mode el C c C c将当前缓冲区的内容加载到交互式 python shell 中 显然使用了什么
  • 独立滚动矩阵的行

    我有一个矩阵 准确地说 是 2d numpy ndarray A np array 4 0 0 1 2 3 0 0 5 我想滚动每一行A根据另一个数组中的滚动值独立地 r np array 2 0 1 也就是说 我想这样做 print np
  • 使用字典映射数据帧索引

    为什么不df index map dict 工作就像df column name map dict 这是尝试使用index map的一个小例子 import pandas as pd df pd DataFrame one A 10 B 2
  • 在Python中连接反斜杠

    我是 python 新手 所以如果这听起来很简单 请原谅我 我想加入一些变量来生成一条路径 像这样 AAAABBBBCCCC 2 2014 04 2014 04 01 csv Id TypeOfMachine year month year
  • 使用 xlrd 打开 BytesIO (xlsx)

    我正在使用 Django 需要读取上传的 xlsx 文件的工作表和单元格 使用 xlrd 应该可以 但因为文件必须保留在内存中并且可能不会保存到我不知道如何继续的位置 本例中的起点是一个带有上传输入和提交按钮的网页 提交后 文件被捕获req
  • Python beautifulsoup 仅限 1 级文本

    我看过其他 beautifulsoup 得到相同级别类型的问题 看来我的有点不同 这是网站 我正试图拿到右边那张桌子 请注意表的第一行如何展开为该数据的详细细分 我不想要那个数据 我只想要最顶层的数据 您还可以看到其他行也可以展开 但在本例
  • Python,将函数的输出重定向到文件中

    我正在尝试将函数的输出存储到Python中的文件中 我想做的是这样的 def test print This is a Test file open Log a file write test file close 但是当我这样做时 我收到
  • 如何在不丢失注释和格式的情况下更新 YAML 文件 / Python 中的 YAML 自动重构

    我想在 Python 中更新 YAML 文件值 而不丢失 Python 中的格式和注释 例如我想改造 YAML 文件 value 456 nice value to value 6 nice value 界面类似于 y yaml load
  • Jupyter Notebook 找不到 Python 模块

    不知道发生了什么 但每当我使用 ipython 氢 原子 或 jupyter 笔记本时都找不到任何已安装的模块 我知道我安装了 pandas 但笔记本说找不到 我应该补充一点 当我正常运行脚本时 python script py 它确实导入
  • Python3 在 DirectX 游戏中移动鼠标

    我正在尝试构建一个在 DirectX 游戏中执行一些操作的脚本 除了移动鼠标之外 我一切都正常 是否有任何可用的模块可以移动鼠标 适用于 Windows python 3 Thanks I used pynput https pypi or
  • import matplotlib.pyplot 给出 AttributeError: 'NoneType' 对象没有属性 'is_interactive'

    我尝试在 Pycharm 控制台中导入 matplotlib pyplt import matplotlib pyplot as plt 然后作为回报我得到 Traceback most recent call last File D Pr
  • 如何断言 Unittest 上的可迭代对象不为空?

    向服务提交查询后 我会收到一本字典或一个列表 我想确保它不为空 我使用Python 2 7 我很惊讶没有任何assertEmpty方法为unittest TestCase类实例 现有的替代方案看起来并不正确 self assertTrue
  • 如何在 pygtk 中创建新信号

    我创建了一个 python 对象 但我想在它上面发送信号 我让它继承自 gobject GObject 但似乎没有任何方法可以在我的对象上创建新信号 您还可以在类定义中定义信号 class MyGObjectClass gobject GO
  • 更改 Tk 标签小部件中单个单词的颜色

    我想更改 Tkinter 标签小部件中单个单词的字体颜色 我知道可以使用文本小部件来实现与我想要完成的类似的事情 例如使单词 YELLOW 显示为黄色 self text tag config tag yel fg clr yellow s
  • 使用 z = f(x, y) 形式的 B 样条方法来拟合 z = f(x)

    作为一个潜在的解决方案这个问题 https stackoverflow com questions 76476327 how to avoid creating many binary switching variables in gekk
  • 使用随机放置的 NaN 创建示例 numpy 数组

    出于测试目的 我想创建一个M by Nnumpy 数组与c随机放置的 NaN import numpy as np M 10 N 5 c 15 A np random randn M N A mask np nan 我在创建时遇到问题mas

随机推荐

  • JAVA 【爬虫】 Selenium 无头浏览,禁止加载图片,启动参数,失效,无效

    JAVA Selenium 无头浏览 禁止加载图片 启动参数 失效 无效 可能有如下几个原因 代码问题 命令参数写错 无头浏览 headless 禁止加载图片 blink settings imagesEnabled false Chrom
  • DS1302芯片介绍

    低功耗时钟芯片DS1302可以对年 月 日 时 分 秒进行计时 且具有闰年补偿等多种功能 DS1302的性能特性 实时时钟 可对秒 分 时 日 周 月以及带闰年补偿的年进行计数 用于高速数据暂存的31 8位RAM 最少引脚的串行I O 2
  • MySQL安装与使用(Windows)

    Windows平台提供了两种安装MySQL的方式 1 图形化安装 msi安装文件 链接 link 2 免安装 zip压缩文件 链接 link 安装MySQL 一 图形化安装 1 双击下载的 MySQL 安装文件 进入 MySQL 安装界面
  • Socket编程中的强制关闭与优雅关闭及相关socket选项

    以下描述主要是针对windows平台下的TCP socket而言 首先需要区分一下关闭socket和关闭TCP连接的区别 关闭TCP连接是指TCP协议层的东西 就是两个TCP端之间交换了一些协议包 FIN RST等 具体的交换过程可以看TC
  • 虚拟机三种网络模式

    基本知识 ipconfig查看信息 网关 Gateway 又称网间连接器 协议转换器 是你连接到的上层节点的地址 ip地址是你本身的地址 如果是路由器分配的 那么是路由器所构建的内网地址 网卡 需要网卡才能连接其他设备 是设备端的 交换机
  • vscode+phpstudy配置php环境

    1 先打开phpstudy 将WAMP启动 2 点击左侧的软件管理 随便选一个版本的php安装 我这里下的是5 3 29版本的 3 点击上面的系统环境 找到刚刚安装好的php 进入设置 点击扩展选项 将XDebug调试组件打开 并记下端口
  • MEF:COA-NET

    COA NET COLLABORATIVE ATTENTION NETWORK FOR DETAIL REFINEMENT MULTI EXPOSURE IMAGE FUSION COA NET 用于细节细化多曝光图像融合的协作关注网络 近
  • [Js进阶]如何用jquery获取到shadowRoot里的内容

    HTML组件相关的标准 HTML Template Shadow DOM 则是原生组件封装的基本工具 它可以实现组件与组件之间的独立性 Custom Elements 是用来包装原生组件的容器 通过它 你就只需要写一个标签 就能得到一个完整
  • python计算工资编程-Python实现扣除个人税后的工资计算器示例

    本文实例讲述了Python实现扣除个人税后的工资计算器 分享给大家供大家参考 具体如下 正好处于找工作期间避免不了会跟单位谈论薪资的情况 当然所有人跟你谈的都是税前收入 税后应该实际收入有多少呢 今天就简单写一个个人税收收入计算器 仅仅是觉
  • Linux下uboot编译出错(/bin/bash: arm-none-linux-gnueabi-gcc: command not found )

    unboot压缩包解压 tar xz 在终端进入解压目录 xz d tar xz tar xvf tar 向Makefile添加编译路径 在makefile的开头添加本机的编译路径 ARCH arm CROSS COMPILE opt fs
  • 【error】org.apache.catalina.core.StandardContext.startInternal 由于之前的错误,Context[/geoserver]启动失败

    error org apache catalina core StandardContext startInternal 由于之前的错误 Context geoserver 启动失败 tomcat10配置geoserver war包启动错误
  • Android 一些常见BUG汇总(持续更新)

    写在前面的话 每个开发者在工作中会遇到或多或少的小bug 这里博主把它们记录下来 以便以后查阅 开始 1 file storage emulated 0 DCIM xxx jpg exposed beyond app through Cli
  • [SDOI2012]拯救小云公主【bfs+二分答案】

    题目链接 正难则反 要直接求从起点到终点的最大距离 不妨反过来求最小的可以阻止骑士从起点到终点的对于全体圆的最小半径 那么 就是阻止从左上角到右下角的所有相交圆 于是 就是要变成没有从左上角到右下角的相交圆才可以 那么不妨跑一个bfs来判断
  • 全面分析冒泡排序过程

    冒泡排序也是一种简单直观的排序算法 其思想是 它重复地走访过要排序的数列 一次比较两个元素 如果他们的顺序错误就把他们交换过来 走访数列的工作是重复地进行直到没有再需要交换 也就是说该数列已经排序完成 这个算法的名字由来是因为越小的元素会经
  • leetcode分类刷题:二分查找(Binary Search)(二、隐藏有序序列的数学类型)

    参加了下2023届秋招 不得不感叹leetcode lintcode的题目实在太多了 也很难 特别对于我这种非科班生而言 感觉有必要分类整理一下 以便以后在工作中更好的应用 花了点时间刷了下二分查找的相关题目 刷的越多 反而越不会了 先把目
  • 还没做完的小程序

    include
  • 基于swiper使用vue-awesome-swiper 实现鼠标移入暂停自动播放、左右按钮控制前进后退、常见避坑、API中文文档地址

    vue 中使用swiper vue awesome swiper 鼠标移入暂停自动播放 左右按钮控制前进后退 常见避坑 swiper对应vue awesome swiper版本会带来很多坑点 推荐下面对照版本 帮大家避坑了 亲测可用 一 n
  • oracle 中的开窗函数over()

    开窗函数与聚合函数一样 都是对行的集合组进行聚合计算 它用于为行定义一个窗口 这里的窗口是指运算将要操作的行的集合 它对一组值进行操作 不需要使用GROUP BY子句对数据进行分组 能够在同一行中同时返回基础行的列和聚合列 反正我理解这个函
  • 原生-秒数转换为小时、分钟

    function formatSeconds value var secondTime parseInt value 秒 var minuteTime 0 分 var hourTime 0 小时 if secondTime gt 60 如果
  • Python实现迷宫游戏

    项目 迷宫游戏 摘要 1 引言 1 1研究的背景及意义 1 2研究的内容 2 系统结构 2 1系统的结构 2 2基本思路 3 实现代码 3 1Maze类 3 2Player类 3 3Controller类 3 4主函数 4 实验 5 总结和