2D迷宫

迷宫游戏是许多小伙伴儿时经常做的游戏,它能锻炼我们的空间推理能力、逻辑力、耐心与恒心,也能带来许多欢乐。

让我们设计一个迷宫游戏,在DFRobot-行空板屏幕上体验一下吧!

任务目标

通过三轴加速度传感器获取加速度值,继而控制角色在地图上移动走出迷宫。


知识点

1、认识三轴加速度传感器

2、学习使用Pinpong库读取加速度值的方法

3、学习使用turtle库绘制迷宫的方法

材料清单

软件使用:Mind+编程软件x1

知识储备

1、什么是重力加速度与加速度传感器

地球表面附近的物体因受重力产生的加速度叫做重力加速度,也叫自由落体加速度,用g表示。

加速度传感器,是一种能够测量加速度,将其转换为电信号的设备。

行空板的加速度传感器是内置在板子上的,可以测量X,Y,Z三个方向的加速度,其中,X轴正方向为金手指一侧的方向,Y轴正方向为Home按键一侧的方向,Z轴垂直于板子,正方向为屏幕背面一侧的方向。

2、Pinpong库读取加速度值

Pinpong库的“pinpong.extension.unihiker”文件下“GD32Sensor_acc”类中的“get_x()”、“get_y()”、“get_z()”三个方法可以分别获取x/y/z三个方向的加速度值,并且由于在文件中已经对该类进行过实例化生成了一个accelerometer对象,因此,我们在使用时,可以直接通过“accelerometer.getx()”/“accelerometer.gety()”/“accelerometer.getz()”指令来获取各自方向的加速度值。当然,在这之前,我们需要先导入Pinpong库相关的文件并初始化板子。

from pinpong.board import Board # 从pinpong.board包中导入Board模块

from pinpong.extension.unihiker import * # 导入pinpong.extension.unihiker包中所有模块

Board().begin() # 初始化,选择板型和端口号,不输入则进行自动识别

 x = accelerometer.get_x() # 获取x轴加速度值y = accelerometer.get_y() # 获取y轴加速度值

其中,x和y是一个变量,分别用来存储检测到的x和y轴方向的加速度值。

3、turtle库屏幕控制的常见函数

turtle库中关于屏幕控制的函数有很多,我们只使用其中的一部分,编程时,通过“import turtle”导入库后可采用“turtle.函数名()”的形式来实现功能。

(1)bgpic()函数设置绘图窗口(画布)的背景颜色

通过bgpic()函数我们可为当前的窗口屏幕设置背景颜色。

turtle.bgcolor(“pink”) # 设置窗口背景颜色

其中,“pink”指的是粉红色。这里的颜色同样可以通过RGB值、十六进制值、固定值三种不同的方式来表示。

(2)clear()函数清空窗口

通过clear()函数我们可以将窗口上的内容清空掉。

turtle.clear() # 清空窗口

4、turtle库画笔运动的常见函数

(1)setheading()函数设置画笔当前的朝向

通过setheading()函数我们可使画笔朝向任何方位。0°表示正东方向,90°表示正北方向,180°/-180°表示正西方向,270°/-90°表示正南方向。

turtle.setheading(90) # 设置画笔的朝向为90°方向

其中,“90”指的是具体要指向的方位角度。可通过改变方位角度值来改变画笔的朝向。

(2)write()函数书写文字

通过write()函数我们可以使画笔在窗口屏幕上书写文字。

turtle.write(‘you win!’,font = (‘微软雅黑’, 30)) # 书写“you win!”

其中,“you win!”指的是具体要写入的文字内容,align指的是对齐方式,“center”表示中心对齐,font指的是字体,这里为大小30的微软雅黑字体。

动手实践

任务描述1:绘制迷宫

在屏幕上绘制一幅盘根错节的迷宫图。

1、硬件搭建

STEP1:通过USB连接线将行空板连接到计算机

2、程序编写

STEP1:创建与保存项目文件

启动Mind+,另存项目并命名为“005、2D迷宫”。

STEP2:创建与保存Python文件

创建一个Python程序文件“protract.py”,双击打开。

STEP3:程序编写1

在这个任务中,我们将绘制一幅迷宫图,由于迷宫图的绘制过程比较复杂,因此,我们将其单独编写在protract程序文件中,以便在后续直接调用。

(1) 导入所需功能库

这里,我们需要使用turtle库来绘制迷宫,因此,我们需要先导入它。

import turtle # 导入turtle库

(2) 创建图形窗口

为了能使迷宫显示在屏幕上,我们需要先创建一个和屏幕大小一致的图形窗口,而后在图形窗口中创建一块画布,设置好相应的大小尺寸和背景颜色,并设置屏幕延迟为0,避免卡顿。

turtle.setup(240, 320) # 设置图像窗口大小

turtle.bgcolor(“pink”) # 设置窗口背景颜色

turtle.delay(0) # 屏幕延迟

(3) 设计迷宫路线方案

对于迷宫图的绘制,我们分两步进行。首先,我们设定一个宽和高都为20像素的小方格作为一堵墙,之后,以此小方格为一个单位来设定整体的迷宫,由于屏幕的宽为240像素,高为320像素,在横向上,我们可绘制13个方格(屏幕显示为11个整块方格+2边各一个半块方格),而在纵向上,我们也够绘制13个方格。

这里,我们以“0”和“1”来表示小方格的有无,并通过列表嵌套的形式来表示迷宫的路线。

迷宫列表

maze_list = [

[0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0], # 第0行

[0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0], # 第1行

[0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0], # 第2行

[0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0], # 第3行

[0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0], # 第4行

[0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0], # 第5行

[0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0], # 第6行

[0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0], # 第7行

[0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0], # 第8行

[0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0], # 第9行

[0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0], # 第10行

[0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0], # 第11行

[0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0], # 第12行

]

(4) 创建迷宫类并在类中设定绘图的基本属性

在实际编程时,我们先创建一个迷宫类,之后再通过类的实例化来创建迷宫对象,在迷宫类中,我们首先需要定义一个方格的尺寸,并设置绘图的一些基本属性。

class Maze(turtle.Turtle): # 定义Maze类

size = 20    #设定迷宫内一格墙的边宽尺寸为20像素def __init__(self, maze_list):# 所有类都有一个名为 __init__() 的函数,它始终在启动类时执行# __init__方法是专门用来定义一个类具有哪些属性的方法# 需要先调用父类的初始化方法才能在初始化方法中调用父类的方法turtle.Turtle.__init__(self) # 解绑Maze类中的方法,使其也拥有Turtle类中的方法self.maze_list = maze_list # 设置迷宫列表# 为了加快绘图速度隐藏海龟,速度设为最快self.hideturtle() # 隐藏海龟画笔self.speed(0) # 设置海龟移动(绘图)速度为最快self.draw_walls() # 绘制整个迷宫

(5) 在迷宫类中创建绘制单个方格的函数

之后,我们还需要在类中定义一个绘制单个方格的函数以便在绘制整体迷宫时调用。

绘制迷宫内一格墙的过程

def draw_wall(self):self.pendown() # 落笔self.begin_fill() # 填充self.fillcolor('red') #设置填充颜色为红# 首先画一个距离为20的横线,再向右旋转90度,循环4次形成正方形for i in range(4):self.forward(20) # 前进20像素self.right(90) # 右旋转90度self.end_fill() # 结束填充self.penup() # 抬起画笔

(6) 在迷宫类中创建绘制整体迷宫的函数

这里,我们可通过调用绘制单个方格的函数并结合线路来绘制整体的迷宫。

绘制整个迷宫的墙

def draw_walls(self):self.penup() # 抬起画笔self.goto(-120, 120) # 走到初始位置# 绘制墙体,循环嵌套,横纵各重复13次(整个迷宫的长和宽由13格墙组成)for row in range(13): # 行循环for col in range(13): # 列循环# 主函数中的maze_list里面的1则打印出一格墙if self.maze_list[row][col] == 1: # 如果迷宫列表中的某行某列为1self.draw_wall() # 画单堵墙           self.goto(20 * (col + 1) - 130, 130 - 20 * row) # 右移一列self.goto(-130, 130 - 20 * (row + 1)) # 下移一行

Tips:完整protract示例程序如下:

向上滑动阅览

import turtle # 导入turtle库

turtle.setup(240, 320) # 设置图像窗口大小

turtle.bgcolor(“pink”) # 设置窗口背景颜色

turtle.delay(0) # 屏幕延迟,设为0避免卡顿

**# turtle.tracer(0) # turns off screen updates
**# turtle.delay(0) # there’s a 10-millisecond pause whenever the turtle moves if the delay is not turned off.
# turtle.tracer(0, 0)

迷宫列表

maze_list = [

[0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0], # 第0行

[0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0], # 第1行

[0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0], # 第2行

[0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0], # 第3行

[0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0], # 第4行

[0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0], # 第5行

[0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0], # 第6行

[0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0], # 第7行

[0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0], # 第8行

[0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0], # 第9行

[0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0], # 第10行

[0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0], # 第11行

[0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0], # 第12行

]

class Maze(turtle.Turtle): # 定义Maze类

size = 20    #设定迷宫内一格墙的边宽尺寸为20像素def __init__(self, maze_list):# 所有类都有一个名为 __init__() 的函数,它始终在启动类时执# __init__方法是专门用来定义一个类具有哪些属性的方法# 需要先调用父类的初始化方法才能在初始化方法中调用父类的方法turtle.Turtle.__init__(self) # 解绑Maze类中的方法,使其也拥有Turtle类中的方法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(20) # 前进20像素self.right(90) # 右旋转90度self.end_fill() # 结束填充self.penup() # 抬起画笔# 绘制整个迷宫的墙def draw_walls(self):self.penup() # 抬起画笔self.goto(-120, 120) # 走到初始位置# 绘制墙体,循环嵌套,横纵各重复13次(整个迷宫的长和宽由13格墙组成)for row in range(13): # 行循环for col in range(13): # 列循环# 主函数中的maze_list里面的1则打印出一格墙if self.maze_list[row][col] == 1: # 如果迷宫列表中的某行某列为1self.draw_wall() # 画单堵墙           self.goto(20 * (col + 1) - 130, 130 - 20 * row) # 右移一列self.goto(-130, 130 - 20 * (row + 1)) # 下移一行

STEP4:程序编写2

在上述“protract”程序中,我们只是创建了一个迷宫类,但无法直接看到效果,因此,接下来,我们再创建一个“main1.py”Python 文件,双击打开编写程序,观察绘制的迷宫效果。

(1)导入所需文件

在这个任务中,为了能创建迷宫对象并保持窗口界面,我们需要导入刚才编写的protract程序文件和turtle库文件。

import turtle # 导入turtle库

import protract # 导入protract模块

(2)生成迷宫对象并结束绘图

最后,我们通过类的实例化来生成迷宫对象,并结束绘图保持窗口。

protract.Maze(protract.maze_list) # 实例化Maze类,创建迷宫对象

turtle.done() # 结束绘图,保持窗口

Tips:完整示例程序如下:

import turtle # 导入turtle库

import protract # 导入protract模块

protract.Maze(protract.maze_list) # 实例化Maze类,创建迷宫对象

turtle.done() # 结束绘图,保持窗口

3、程序运行

STEP1:连接板子

STEP2:点击右上方的运行按钮,运行“main1.py”程序

STEP3:观察效果

观察行空板,可以看到首先出现了一个粉红的背景,之后一个个红色的小方块从左上角开始依次出现,最终拼合在一起,形成了一幅错综复杂的迷宫。

任务描述2:检测加速度值

在上个任务中,我们完成了迷宫图的绘制,而为了能够通过加速度值来控制角色在迷宫上移动,接下来,我们需要先检测一下加速度值在各个不同方向上的变化情况。

1、程序编写

STEP1:创建与保存项目文件

新建一个Python程序文件“main2.py”,双击打开。

Step2:程序编写

(1)导入所需功能库

由于我们将在屏幕上显示加速度值,因此,我们需要先导入unihiker库和time时间库。同时,为了能够检测加速度,我们还需导入Pinpong相关库并初始化行空板。

from unihiker import GUI # 导入unihiker库

import time # 导入time库

from pinpong.board import Board # 从pinpong.board包中导入Board模块

from pinpong.extension.unihiker import * # 导入pinpong.extension.unihiker包中所有模块

Board().begin() # 初始化,选择板型和端口号,不输入端口号则进行自动识别

(2)实例化GUI类并在屏幕上显示初始的x、y轴方向上的加速度值
在显示初始加速度值时,我们可以不输入数值,表示为空。

gui = GUI() # 实例化GUI类,创建gui对象

value_1 = gui.draw_text(x=65, y=65, text=‘x轴加速度值:’, font_size=13) #显示文字

value_2 =gui.draw_text(x=65, y=178, text=‘y轴加速度值:’, font_size=13)#显示文字

value_x = gui.draw_text(x=85, y=122, text=‘’, font_size=13) # 显示初始x轴加速度值

value_y = gui.draw_text(x=85, y=240, text=‘’, font_size=13) #显示初始y轴加速度值

(3)循环检测加速度值并更新数值

接下来,我们每隔1秒不停得检测x和y轴方向上的加速度值,并实时更新显示在屏幕上。

while True:

x = accelerometer.get_x() # 获取x轴加速度值y = accelerometer.get_y() # 获取y轴加速度值value_x.config(text = x) # 更新显示x轴加速度值value_y.config(text = y) # 更新显示y轴加速度值time.sleep(1)print(x,y)

Tips:完整示例程序如下:

向上滑动阅览

from unihiker import GUI # 导入unihiker库

import time # 导入time库

from pinpong.board import Board # 从pinpong.board包中导入Board模块

from pinpong.extension.unihiker import * # 导入pinpong.extension.unihiker包中所有模块

Board().begin() # 初始化,选择板型和端口号,不输入则进行自动识别

gui = GUI() # 实例化GUI类,创建gui对象

value_1 = gui.draw_text(x=65, y=65, text=‘x轴加速度值:’, font_size=13) # 显示文字

value_2 = gui.draw_text(x=65, y=178, text=‘y轴加速度值:’, font_size=13) # 显示文字

value_x = gui.draw_text(x=85, y=122, text=‘’, font_size=13) # 显示初始x轴加速度值

value_y = gui.draw_text(x=85, y=240, text=‘’, font_size=13) # 显示初始y轴加速度值

while True:

x = accelerometer.get_x() # 获取x轴加速度值y = accelerometer.get_y() # 获取y轴加速度值value_x.config(text = x) # 更新显示x轴加速度值value_y.config(text = y) # 更新显示y轴加速度值time.sleep(1)print(x,y)

2、程序运行

STEP1:连接板子

STEP2:运行程序并观察效果

点击运行后,将行空板由水平放置状态往四个不同的方向倾斜。由于板子静止时只受到一个重力加速度,而重力加速度始终朝向地面,因此,可以看到当板子向下倾斜时,x轴方向上的加速度值不断增大,垂直时数值在1左右;当板子向上倾斜时,x轴方向上的加速度值不断减小,垂直时数值在-1左右;当板子向左倾斜时,y轴方向上的加速度值不断增大,垂直时数值在1左右;当板子向右倾斜时,y轴方向上的加速度值不断减小,垂直时数值在-1左右;


任务描述3:走迷宫

接下来,我们将把绘制的迷宫图和加速度检测结合起来,通过加速度的不同方位来控制角色走迷宫。

1、程序编写

STEP1:创建与保存项目文件

新建一个Python程序文件“main3.py”,双击打开。

Step2:程序编写

(1)导入所需功能库

在这个任务中,我们将在绘制的迷宫图上创建一个海龟角色作为玩家,并通过板载三轴加速度计来控制它移动,因此我们需要先导入turtle库,绘制迷宫的protract程序文件,time时间库以及Pinpong库,并初始化行空板。

import turtle # 导入turtle库

import time # 导入time库

import protract # 导入绘制迷宫文件

from pinpong.board import Board # 导入pinpong.board包中Board模块

from pinpong.extension.unihiker import * # 导入pinpong.extension.unihiker包中所有模块

Board().begin() # 初始化,选择板型和端口号,不输入端口号则进行自动识别

(2)绘制迷宫
由于我们的游戏是在迷宫上进行,因此,我们需要先实例化上个任务protract程序文件中创建的“Maze“类来生成一个迷宫对象。

protract.Maze(protract.maze_list) # 实例化Maze类,创建迷宫对象

(3)创建玩家类,并在类中设置玩家的基本属性与功能

对于迷宫图上的玩家角色,我们通过先创建玩家类再实例化的方式来生成玩家对象。

同时,在创建的玩家类中,我们需要设置玩家的一些基本属性及功能。

这里,我们设置好玩家初始位置和终点位置,设置玩家角色所在的地图为迷宫地图,设置移动速度为最快,并使玩家在移动到迷宫的起点后以海龟的形态显示在屏幕上,同时,设置海龟玩家的颜色和初始朝向。

class Player(turtle.Turtle): # 创建玩家类

def __init__(self, maze_list, start_m, start_n, end_m, end_n):turtle.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') # 设置玩家颜色为yellowself.setheading(270) # 设置玩家初始方向self.showturtle() # 显示玩家

(4)在玩家类中设定可移动范围
由于游戏机制,我们需要设定玩家只能在迷宫内的通道里移动。

def canmove(self, m, n): # 定义玩家可移动的位置,即只允许在迷宫内的通道里移动

    if 0 <= m and m <= 12: # 如果在第0行到第12行之内print(m,n) # 打印return self.maze_list[m][n] == 0 # 返回值0,表示第m行第n列没有墙,可以移动

(5)在玩家类中创设定移动时位置的变化
在玩家可移动后,我们需要设定移动时位置发生的变化。

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) # 判断是否到达终端

(6)在玩家类中设定不同方向的移动

之后,我们还需要设定玩家在四个方向上的移动。

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) # 设置向右移动

(7)在玩家类中设定终点的判别
当玩家的横纵坐标和终点坐标点一致时,我们判定游戏结束,并在屏幕上显示获胜的信息,同时,使游戏重新开始。

def reach_exit(self, m, n): # 判断是否到达终端,当玩家到达终点时,显示’you win!’

    if m == self.end_m and n == self.end_n: # 如果移动到终点text = turtle.Turtle() # 创建文字对象text.hideturtle() # 隐藏画笔text.penup() # 抬起画笔text.goto(0,0) # 移动到原点text.color('blue') # 设定颜色为bluetext.write('you win!',align="center",font = ('微软雅黑', 30)) # 书写“you win!”time.sleep(2) # 延时两秒text.clear() # 清空self.restart() # 重新开始游戏

(8)在玩家类中设定重新开始机制

在到达终点后,我们使玩家再次回到初始位置。

def restart(self): # 重新开始游戏

    self.goto(-20, 120) # 移动到(-20,120)坐标点位self.m = 0 # 起点的行数self.n = 5 # 起点的列数self.end_m = 12 # 终点的行数self.end_n = 5 # 终点的列数

(9)生成玩家

之后,我们通过实例化类来生成一个玩家角色。

player = Player(protract.maze_list, 0, 5, 12, 5) # 实例化Player类,创建一个玩家对象

(10)设定陀螺仪标志值

为了能够在后续通过x轴和y轴上的加速度值来判定方位,我们需要提前设定一个用以比较的参考标志值。这里,经过上述任务2的读取检测,我们选取“0.4”作为标志值。

thread_value = 0.4 # 定义一个标志值

(11)循环读取加速度值并进行检测

最后,我们使用永久循环的方式持续获取陀螺仪x轴和y轴加速度的值,并以此与标志值进行比较,继而判定移动的方向。

while True:

x = accelerometer.get_x() # 获取x轴加速度值y = accelerometer.get_y() # 获取y轴加速度值time.sleep(0.15)if x > thread_value : # 如果x轴加速度值 > 阈值player.go_down() # 向下移动time.sleep(0.1)if x < -thread_value: # 如果x轴加速度值 < 阈值player.go_up() # 向上移动time.sleep(0.1)if y > thread_value : # 如果y轴加速度值 > 阈值player.go_left() # 向左移动time.sleep(0.1)if y < -thread_value : # 如果y轴加速度值 < 阈值player.go_right() # 向右移动time.sleep(0.1)

Tips:完整示例程序如下:

向上滑动阅览

import turtle # 导入turtle库

import time # 导入time库

import protract # 导入protract模块

from pinpong.board import Board # 导入pinpong.board包中Board模块

from pinpong.extension.unihiker import * # 导入pinpong.extension.unihiker包中所有模块

Board().begin() # 初始化,选择板型和端口号,不输入则进行自动识别

thread_value = 0.4 # 定义一个标志值

protract.Maze(protract.maze_list) # 实例化Maze类,创建迷宫对象

class Player(turtle.Turtle): # 创建玩家类

def __init__(self, maze_list, start_m, start_n, end_m, end_n):turtle.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') # 设置玩家颜色为yellowself.setheading(270) # 设置玩家初始方向self.showturtle() # 显示玩家def canmove(self, m, n): # 定义玩家可移动的位置,即只允许在迷宫内的通道里移动if 0 <= m and m <= 12: # 如果在第0行到第12行之内print(m,n) # 打印return self.maze_list[m][n] == 0 # 返回值0,表示第m行第n列没有墙,可以移动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) # 设置向右移动def reach_exit(self, m, n): # 判断是否到达终端,当玩家到达终点时,显示'you win!'if m == self.end_m and n == self.end_n: # 如果移动到终点text = turtle.Turtle() # 创建文字对象text.hideturtle() # 隐藏画笔text.penup() # 抬起画笔text.goto(0,0) # 移动到原点text.color('blue') # 设定颜色为bluetext.write('you win!',align="center",font = ('微软雅黑', 30)) # 书写“you win!”time.sleep(2) # 延时两秒text.clear() # 清空self.restart() # 重新开始游戏def restart(self): # 重新开始游戏self.goto(-20, 120) # 移动到(-20,120)坐标点位self.m = 0 # 起点的行数self.n = 5 # 起点的列数self.end_m = 12 # 终点的行数self.end_n = 5 # 终点的列数

player = Player(protract.maze_list, 0, 5, 12, 5) # 实例化Player类,创建一个玩家对象

while True:

x = accelerometer.get_x() # 获取x轴加速度值y = accelerometer.get_y() # 获取y轴加速度值time.sleep(0.15)if x > thread_value : # 如果x轴加速度值 > 阈值player.go_down() # 向下移动time.sleep(0.1)if x < -thread_value: # 如果x轴加速度值 < 阈值player.go_up() # 向上移动time.sleep(0.1)if y > thread_value : # 如果y轴加速度值 > 阈值player.go_left() # 向左移动time.sleep(0.1)if y < -thread_value : # 如果y轴加速度值 < 阈值player.go_right() # 向右移动time.sleep(0.1)

2、程序运行

STEP1:连接板子

STEP2:运行程序并观察效果

点击运行后,观察行空板,我们发现屏幕上先绘制出一个迷宫,随后一个小海龟出现在迷宫的出口,之后我们就可以通过转动行空板来控制小海龟走迷宫啦!


挑战自我

尝试更换迷宫线路列表中的“0、1“,来自己设计一个迷宫,游戏一番吧!
更多相关行空板Python入门系列教程学习请关注“蘑菇云创造”。

蘑菇云【行空板Python入门教程】第五课:2D迷宫相关推荐

  1. 蘑菇云「行空板Python入门教程」第九课-智慧农业物联网系统2

    5G元年的列车早已驶出,人工智能.大数据的浪潮还在涌动,云办公.云问诊成为防疫期间的热词. 现如今,物联网技术正处于时代发展的风口,相较于传统的硬件设备,物联网技术使得各种硬件设备能够通过信息传输设备 ...

  2. 【行空板Python入门教程】第二课:小小捕光仪

    在日常生活中,光线的强弱对人类的情绪有着很大的影响.无论是积极还是消极的情绪,愈明亮的光线会让这种感情愈加剧.也正因此,书房.厨房等一些具有实用功能的家居环境,往往会采用较强光线的灯光,这样更能让人集 ...

  3. 蘑菇云「行空板Python入门教程」第七课:舒尔特方格小游戏

    注意力是一切学习的根本,是大脑进行感知.学习.思维等认知活动的基本条件.然而,无论是孩子还是成年人,我们常常会因开小差.注意力无法集中而困扰.此时,找到一个合适的方法来训练我们的注意力势在必行. 舒尔 ...

  4. 蘑菇云「行空板Python入门教程」第六课:贪吃蛇小游戏

    在很久很久以前,手机屏幕都还是黑白的年代,有一款叫做"贪吃蛇"的游戏风靡了大街小巷,在那分辨率极低的屏幕上,几条扭扭曲曲的弧线似乎穿越了整个童年. 这节课上,就让我们用行空板来实现 ...

  5. 蘑菇云「行空板Python入门教程」第八课:智慧农业可视化系统

    在过去,我国农业自动化程度较低,与发达国家存在着较显著的差距.现如今,随着现代科技的不断进步,农业自动化水平日渐提高,越来越多的传感器.显示屏等电子设备被应用在农业中,随时随地监测农作物的生长,以便在 ...

  6. 蘑菇云【行空板Python入门教程】第四课:模拟星空

    模拟星空 古往今来,人们对于星空有着独特的喜爱.遥看那漫天的星斗,像黑夜里眨动的眼睛,又像一颗颗光闪闪.亮晶晶的夜明珠,更像在无边海洋上闪动着的点点银光,无不令人神往. 在这节课上,我们将自己动手,绘 ...

  7. 蘑菇云【行空板Python入门教程】第三课:多功能提醒器

    多功能提醒器 生活中,我们对于声音并不陌生,美妙动听的音乐令人陶醉,节奏感十足的鸣笛声令人警醒,然而,当音量达到一定的强度,妨碍到人们正常休息.学习和工作,声音就会成为噪音. 与此同时,闹钟在许多小伙 ...

  8. 蘑菇云「行空板Python入门教程」第十课:多节点智慧农业系统

    在上节课,我们设计了一个智慧农业物联网系统,通过一块行空板来检测植物生长时的土壤湿度情况,将湿度数据上传到SIoT物联网平台进行远程查看并在湿度较低时从平台远程控制浇水. 然而,在真实的农业场景中,常 ...

  9. 易语言新手入门教程第五课 - 计次循环命令讲解与实战

    易语言计次循环首命令: 调用格式: 〈无返回值〉 计次循环首 (整数型 循环次数,[整数型变量 已循环次数记录变量]) - 系统核心支持库->流程控制 英文名称:counter 执行本命令将把循 ...

最新文章

  1. mysql 授权管理
  2. 测试香港服务器访问速度的方法
  3. 032-element模块
  4. [云炬创业学笔记]第二章决定成为创业者测试18
  5. leetcode 263. 丑数(Java版)
  6. sql如何实现明细账_SQL 如何实现动态的行列转置
  7. composer-安装插件包
  8. 乌班图mysql8.0安装第一次手工启动_Ubuntu Server 16.04下mysql8.0安装配置图文教程
  9. FME SERVER介绍
  10. Atitit.excel导出 功能解决方案 php java C#.net版总集合.doc
  11. 计算机二级c语言word答案,全国计算机考试二级C语言南开100题答案(Word版)
  12. vue在开发环境怎么兼容ie_vue 配置兼容ie浏览器
  13. 面试题——————JAVA完成人民币大写转化
  14. 《Android开源库》 Google 最新Hover Menu(悬浮菜单)
  15. 为什么安装好mysql打不开_MySQL安装完成之后怎么启动? mysql安装完成后怎么
  16. 危险废物自动化立体仓库设计方案
  17. 达梦数据库全量数据恢复还原流程
  18. H3C防火墙端口开启二层模式,网络不通的解决方法
  19. 图像采集——偏振光源消除镜面反光
  20. 美工效果图大小 html,六、DIV CSS实战之布局美工图分析与切图

热门文章

  1. lifekeeper +DR+windows for sql 双机
  2. HTML哪些百度收录,四招让网站内容快速被百度收录
  3. 区块链每日必学:智能合约如何接收以太
  4. B2B电子竞价有什么好处?
  5. 学业、结婚、买房、工作.....即将20岁,焦虑扑面而来
  6. [日语二级词汇]动词(6)
  7. R语言常用快捷键、excel操作、绘制、统计
  8. 用指针实现strcmp函数功能
  9. PHP相关进制转换(二进制转数组、十进制转16进制、16进制转字符串)
  10. 数据结构-简介和部分算法分析