本次实验设计了一款迷宫小游戏,采用用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.
Python是一种跨平台的计算机程序设计语言。 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。
当Python作为游戏脚本内嵌在游戏中,这样做即可以利用游戏引擎的高性能,又可以受益于脚本化开发的优点。即游戏剧本、数据、玩法逻辑这类需要灵活修改和调整的部分可以写在脚本中,只需要修改脚本内容就可以调整游戏内容,不需要重新编译游戏。简单的小游戏可以直接用Python一类的脚本语言开发,善用一些库应该也可以达到不错的性能。
为了了解Python的模块脚本的使用,本次实验使用Python语言实现的一款迷宫小游戏,从而去更深度认识Python的功能。本次实验分三个模块绘制,首先用Maze类绘制出迷宫地图,再用Player类实现玩家的方向动作,再由Controller类实现操作器让玩家方便操作,最后在主函数中运行实现迷宫小游戏。
本次项目由主函数、maze模块、player模块和controller模块组成。如下图所示。
先创建maze模块绘制迷宫地图;再定义玩家移动前后的位置方向;再设计操作器实现玩家自由操作;最后由主函数将各个模块集合。其流程图如下图所示。
在迷宫问题中,首先解决的就是迷宫的地图,我们从实现的效果以及主函数中,不难得知在主函数中的maze_list里,1表示迷宫的墙,0表示迷宫内的通道,如下图所示:
而实际实现迷宫的绘制在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))
迷宫内自然需要一个玩家(海龟)来走出迷宫,所以此处用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)
当拥有玩家出现时,便需要让玩家拥有操作器,从而操作玩家离开迷宫,所以此处使用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()
最后再由主函数将各个模块集合。
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)
实验结果如图。
通过点击上、下、左、右控制玩家的移动,如图。
当玩家走到终点时,将显示出’you win!’,如图。
基于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