Python实现迷宫游戏

项目:迷宫游戏

  • 摘要
  • 1.引言
    • 1.1研究的背景及意义
    • 1.2研究的内容
  • 2.系统结构
    • 2.1系统的结构
    • 2.2基本思路
  • 3.实现代码
    • 3.1Maze类
    • 3.2Player类
    • 3.3Controller类
    • 3.4主函数
  • 4.实验
  • 5.总结和展望
  • 参考文献

摘要

本次实验设计了一款迷宫小游戏,采用用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模块组成。如下图所示。
Python实现迷宫游戏_第1张图片

2.2基本思路

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

3.实现代码

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

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.实验

实验结果如图。
Python实现迷宫游戏_第4张图片
通过点击上、下、左、右控制玩家的移动,如图。
Python实现迷宫游戏_第5张图片
当玩家走到终点时,将显示出’you win!’,如图。
Python实现迷宫游戏_第6张图片

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

你可能感兴趣的:(Python实验作业)