搜索
首页后端开发Python教程Python和Turtle如何制作迷宫小游戏,其中角色是一只海龟?

一、简介

1.什么是Turtle

Turtle英译过来为乌龟,不过我们介绍的不是这种动物,而是以此命名的一个绘图软件。

在python文档中介绍了Turtle本身是一款简单、易上手的绘图软件,非常适合新手进入编程的世界。

海龟绘图Turtle是Python内置模块,总之是非常简单好玩的一个库。

其动作主要有:抬笔,此后的动作只是移动画笔,画布上不会留下痕迹;落笔,只要移动画笔,画布上就会留下痕迹。

画笔动作只绝对移动、相对移动、向前(后)移动、转向(绝对角度、相对角度)、圆或圆弧、点(实心圆),故画不了椭圆,绘制函数曲线困难!

2.怎么玩转Turtle

当然在这里需要进入python编程环境,然后在这个python文件中就可以开始动手写有关turtle的代码。

Turtle是python安装时自带的内置模块,调用该模块非常简单,直接使用import方式加载:

import turtle 或 from turtle import *

这也是程序的第一行代码,用于准备好使用turtle这个模块。

3.画布的设置

1.1设置画布大小

turtle.screensize()       # 返回默认大小(400, 300)

1.2以默认绘图窗口大小显示窗口,窗口居屏幕中心

turtle.screensize(width, hight[, bg])

其中:width——表示画布宽度(单位像素);Hight——表示画布高度(单位像素);bg——画布背景颜色,该参数可缺省,缺省时为白色背景

1.3案例

如:

turtle.screensize(800, 600, "green"),表示画布大小为800×600,绿色画布。
turtle.setup(width, hight[, x, y])

其中:width, height——表示画布宽和高。当为整数时表示像素;为小数时则表示占据计算机屏幕的比例

4.设置背景/画布颜色

turtle.bgcolor()

二、Turtle的画笔设置

turtle.pensize(size)

其中:size——画笔粗细,用像素表示。

1.turtle绘图的基本方法

导入turtle库绘图模块后,就可以实现绘图,基本操作是向前(后)画直线,旋转(向左向右改变方向),画圆(圆弧)等。

这里介绍几个最常用的命令。

1.1设置画笔的属性

命令  说明
turtle.pensize(width) 用于设置画笔的宽度(即粗细),width越大越粗
turtle.pencolor(color) 用于设置画笔的颜色,color参数可以是字符串如"green","red",也可以是RGB三元组
turtle.shape(shape) 用于设置画笔的形状,shape参数为字符串,主要包含“turtle”乌龟形状,“square”正方形形状等
turtle.speed(speed) 用于设置画笔的移动速度。speed参数可以是字符串如“fast”,"slow"等,也可以是0到10间的整数

1.2画笔绘图的命令

命令 说明
turtle.fd(dis) 沿当前画笔方向向前移动dist像素长度
turtle.bk(dist) 沿当前画笔相反方向移动dist像素长度
turtle.right(degree) 沿当前画笔方向向右转degree°
turtle.left(degree) 沿当前画笔方向向左转degree°
turtle.down() 将画笔放下,开始画图
turtle.up() 提起笔移动,不绘制图形
turtle.circle() 画圆,半径为正(负),表示圆心在画笔的左边(右边)画圆
setx( ) 将当前x轴移动到指定位置
sety( ) 将当前y轴移动到指定位置
setheading(degree) 用于设置画笔的方向,参数degree为画笔方向与海龟坐标系x轴正向的夹角度数
ht() 用于将画笔隐藏

三、最后的案例Turtle小游戏

1.设计思路游戏规则

这个海龟闯关的小迷宫游戏是设计了三个关卡,运行代码之后会有相应的关卡弹窗设置,想完那关可以直接玩那关, 也可以按照顺序闯关。

特别注意:

很多人担心过不了关?没关系,小编给大家开了一个挂,这个挂就是按住F1就出现了迷宫的路线图哦!按住F2就是出现了一个海龟到起点自己走路线哈!

2.准备环节

小编用的Python3、Pycharm2021、Turtle模块导入即可。

然后相应的图片素材:

Python+Turtle怎么制作海龟迷宫小游戏

3.正式敲代码

# -*- coding: UTF-8 -*-
"""
源码基地:#806965976#
csdn账号:顾木子吖
海龟迷宫闯关游戏
"""
 
import turtle  # 导入海龟绘图模块
import random  # 导入随机数模块
 
game_title = '小海龟大迷宫闯关小游戏'  # 游戏名字
 
level = 0  # 关卡
 
'''绘制地图用的全局变量'''
txt_path = 'map/map1.txt'  # 地图信息文本文件路径及名称
road_color = (191, 217, 225)  # 迷宫通道的颜色
R, C = 0, 0  # 迷宫地图的总行数R、总列数C
cell_size = 20  # 一个格子的尺寸
area_sign = {}  # 记录入口和出口索引位置
mazeList = []  # 地图列表
 
'''海龟对象'''
map_t = turtle.Turtle()  # 绘制地图的海龟
map_t.speed(0)  # 设置绘图速度最快(地图绘制)
sign_t = turtle.Turtle()  # 绘制入口和出口标记的海龟
 
auto_t = turtle.Turtle()  # 自动走迷宫的海龟
auto_t.pensize(5)  # 画笔粗细(自动)
auto_t.speed(0)  # 设置绘图速度最快(手动)
auto_t.ht()  # 隐藏海龟光标
 
manual_t = turtle.Turtle()  # 手动走迷宫的海龟
manual_t.pensize(5)  # 画笔粗细(手动)
manual_t.speed(0)  # 设置绘图速度最快(手动)
manual_t.shape('turtle')  # 设置海龟光标为小海龟(手动)
manual_t.ht()  # 隐藏手动走迷宫所用的海龟光标(手动)
 
# 要探索4个方向对应索引的变化规则
direction = [
    (1, 0),  # 右
    (-1, 0),  # 左
    (0, 1),  # 上
    (0, -1)  # 下
]
 
 
def imoveto(ci, ri):
    """
    功能:根据索引位置移动海龟(不画线)
    :param ci: 列索引
    :param ri: 行索引
    :return:
    """
    auto_t.penup()  # 抬笔
    cx, cy = itoc((ci, ri))  # 将索引位置转换为坐标位置
    auto_t.goto(cx, cy)  # 移动到指定位置
    auto_t.pendown()  # 落笔
    auto_t.shape('turtle')  # 设置海龟光标的形状
    auto_t.color('red')  # 设置画笔颜色为红色
    auto_t.st()  # 显示海龟光标
 
 
def c_move_to(t, ctuple):  # 移动到指定位置
    """
    功能:根据坐标位置移动到指定位置(不画线)
    :param t: 海龟对象
    :param ctuple: 记录坐标位置的元组
    :return:
    """
    t.ht()  # 隐藏海龟光标
    t.penup()  # 抬笔
    t.goto(ctuple[0], ctuple[1])  # 移动到坐标指定的位置
    t.pendown()  # 落笔
 
 
def itoc(ituple):
    """
    将索引位置转换为实际坐标位置
    :param ituple: 行、列索引组成的元组
    :return: 实际坐标位置
    """
    ci = ituple[0]
    ri = ituple[1]
    tx = ci * cell_size - C * cell_size / 2  # 根据索引值计算每个正方形的起点(x坐标)
    ty = R * cell_size / 2 - ri * cell_size  # 根据索引值计算每个正方形的起点(y坐标)
    cx = tx + cell_size / 2  # 正方形中心的x坐标
    cy = ty - cell_size / 2  # 正方形中心的y坐标
    return (cx, cy)
 
 
def ctoi(cx, cy):
    """
    根据cx和cy求在列表中对应的索引
    :param cx: x轴坐标
    :param cy: y轴坐标
    :return: 元组,(ci,ri)
    """
    ci = ((C - 1) * cell_size / 2 + cx) / cell_size  # 计算列索引
    ri = ((R - 1) * cell_size / 2 - cy) / cell_size  # 计算行索引
    return (int(ri), int(ci))  # 返回行列索引的元组
 
 
def get_map(filename):
    """
    功能:读取保存地图的文本文件内容到列表
    :param filename: 地图文件名
    :return: 地图列表
    """
    with open(filename, 'r') as f:  # 打开文件
        fl = f.readlines()  # 读取全部行
    maze_list = []  # 保存地图的列表
    for line in fl:  # 将读取的内容以空格分割为二维列表
        line = line.strip()  # 去掉空格
        line_list = line.split(" ")  # 以空格进行分割为列表
        maze_list.append(line_list)  # 将分割后的列表添加到地图列表中
    return maze_list  # 返回地图列表
 
 
def draw_square(ci, ri, colorsign):
    """
    功能:绘制组成地图的小正方形
    :param ci: 列索引
    :param ri: 行索引
    :param colorsign: 填充颜色
    :return:
    """
    tx = ci * cell_size - C * cell_size / 2  # 根据索引值计算每个正方形的起点(x坐标)
    ty = R * cell_size / 2 - ri * cell_size  # 根据索引值计算每个正方形的起点(y坐标)
    map_t.penup()  # 抬笔
    map_t.goto(tx, ty)  # 移动到绘图起点(正方形的左上角)
    if colorsign == '1':  # 判断是否为墙(如果为墙,则随机生成填充颜色)
        r = random.randint(100, 130)  # 红色值
        g = random.randint(150, 180)  # 绿色值
        map_t.color(r, g, 200)  # 指定颜色为随机生成的颜色
    else:
        map_t.color(colorsign)  # 设置为指定的通道颜色
    map_t.pendown()  # 落笔
    map_t.begin_fill()  # 填充开始
    for i in range(4):  # 绘制正方形
        map_t.fd(cell_size)
        map_t.right(90)
    map_t.end_fill()  # 填充结束
    map_t.ht()  # 隐藏海龟光标
 
 
def draw_map(mazelist):
    """
    功能:遍历地图列表绘制迷宫地图
    :param mazelist: 保存地图数据的列表
    :return:
    """
    turtle.tracer(0)  # 隐藏动画效果
    global area_sign  # 全局变量,记录入口和出口索引位置
    for ri in range(R):  # 遍历行
        for ci in range(C):  # 遍历列
            item = mazelist[ri][ci]
            if item in ['1']:  # 判断墙
                draw_square(ci, ri, '1')  # 绘制墙
            elif item == "S":  # 判断入口
                draw_square(ci, ri, road_color)  # 绘制通道
                draw_sign(ci - 1, ri, '入口')  # 标记入口
                area_sign['entry_i'] = (ci, ri)  # 保存入口索引
            elif item == "E":  # 判断出口
                draw_square(ci, ri, road_color)  # 绘制通道
                draw_sign(ci - 1, ri, '出口')  # 标记出口
                area_sign['exit_i'] = (ci, ri)  # 保存出口索引
            else:
                draw_square(ci, ri, road_color)  # 绘制通道
    turtle.tracer(1)  # 显示动画效果
 
 
def draw_sign(ci, ri, word):
    """
    功能:绘制入口和出口标记
    :param ci: 列索引
    :param ri: 行索引
    :param word: 标记文字内容
    :return:
    """
    cx, cy = itoc((ci, ri))  # 将索引位置转换为坐标位置
    sign_t.ht()  # 隐藏海龟光标
    sign_t.penup()  # 抬笔
    sign_t.goto(cx, cy)  # 移动到标记位置
    sign_t.color('red')  # 设置画笔为红色
    sign_t.write(word, font=('黑体', 12, 'normal'))  # 绘制标记文字
 
 
def win_tip():
    """
    功能:制作过关提示
    :return:
    """
    global level
    c_move_to(manual_t, (-150, 0))
    manual_t.color('blue')
    if int(level) == 3:
        manual_t.write('\n恭喜您顺利通关!', font=('黑体', 20, 'bold'))
        turtle.onkey(turtle.bye, key='Return')  # 监听按下Enter键退出游戏
    else:
        manual_t.write('\n恭喜过关!\n按下Enter进入下一关!', font=('黑体', 20, 'bold'))
        level += 1
        manual_t.color('red')
        turtle.onkey(level_init, key='Return')  # 监听按下Enter键
 
 
def manual_move(d):
    """
    功能:手动走迷宫时通用探索并移动函数
    :param d: 向不同方面走时索引的变化规则
    :return:
    """
    dc, dr = d  # 将表示方向的元组分别赋值给两个变量dc和dr,其中dc为x轴方向,dr为y轴方向
    rici = ctoi(round(manual_t.xcor(), 1) + dc * cell_size, round(manual_t.ycor(), 1) + dr * cell_size)  # 获取行列索引
    point = mazeList[rici[0]][rici[1]]  # 获取地图列表中对应点的值
    print('移动:', rici, point)
    if point == '0':  # 通路
        manual_t.color('red')
        mazeList[rici[0]][rici[1]] = '$'  # 将当前位置标记为已探索
        manual_t.forward(cell_size)  # 向前移动
        print('00')
    elif point == '$':  # 已探索
        manual_t.color(road_color)  # 绘制和通道相同颜色的线,达到擦除痕迹的效果
        mazeList[rici[0] + dr][rici[1] - dc] = '0'  # 将当前位置的前一个点设置为未探索(目的是取消标记)
        manual_t.forward(road_color)  # 向前移动
        manual_t.color('red')
    elif point == 'E':  # 出口
        win_tip()
 
 
def up_move():  # 朝上
    manual_t.setheading(90)  # 设置海龟朝向
    manual_move(direction[2])  # 手动探索并移动
 
 
def down_move():  # 朝下
    manual_t.setheading(270)  # 设置海龟朝向
    manual_move(direction[3])  # 手动探索并移动
 
 
def left_move():  # 朝左
    manual_t.setheading(180)  # 设置海龟朝向
    manual_move(direction[1])  # 手动探索并移动
 
 
def right_move():  # 朝右
    manual_t.setheading(0)  # 设置海龟朝向
    manual_move(direction[0])  # 手动探索并移动
 
 
def manual_path():
    """
    功能:手动走迷宫
    :return:
    """
    manual_t.clear()  # 清除绘图
    auto_t.ht()  # 隐藏海龟
    auto_t.clear()  # 清除绘图
    global mazeList  # 定义全局变量
    mazeList = get_map(txt_path)  # 重新读取地图数据
    # print(area_sign['entry_i'][0],area_sign['entry_i'][1])
    c_move_to(manual_t, itoc(area_sign['entry_i']))  # 移动到入口位置
    manual_t.st()  # 显示手动走迷宫所用的海龟光标
    manual_t.width(3)  # 设置画笔粗细为3像素
    manual_t.color('red')  # 设置画笔为红色
    manual_t.getscreen().listen()  # 让海龟屏幕(TurtleScreen)获得焦点
    manual_t.getscreen().onkeyrelease(up_move, 'Up')  # 按下向上方向键
    manual_t.getscreen().onkeyrelease(down_move, 'Down')  # 按下向下方向键
    manual_t.getscreen().onkeyrelease(left_move, 'Left')  # 按下向左方向键
    manual_t.getscreen().onkeyrelease(right_move, 'Right')  # 按下向右方向键
 
 
def auto_path():
    """
    功能:查看答案(自动走迷宫)
    :return:
    """
    global mazeList  # 定义全局变量
    mazeList = get_map(txt_path)  # 重新读取地图数据
    manual_t.ht()  # 隐藏海龟
    manual_t.clear()  # 清除绘图
    auto_t.clear()  # 清除绘图
    auto_t.pensize(5)  # 设置画笔粗细
    auto_t.speed(0)  # 绘图速度
    auto_t.ht()  # 隐藏海龟光标
    find(mazeList)  # 开始探索
 
 
def find(mazeList):
    """
    功能:开始探索
    :param mazeList: 地图列表
    :return:
    """
    auto_t.clear()  # 清空帮助
    start_r, start_c = 0, 0
    for ri in range(R):
        for ci in range(C):
            item = mazeList[ri][ci]
            if item == "S":
                start_r, start_c = ri, ci
    auto_t.penup()  # 抬笔
    draw_path(start_c, start_r)
    find_next(mazeList, start_c, start_r)
 
 
def find_next(mlist, ci, ri):
    """
    功能:递归搜索判断是否为通路
    :param mlist: 地图列表
    :param ci: 列索引
    :param ri: 行索引
    :return: 布尔值,表示是否为通路
    """
    if mlist[ri][ci] == "E":
        imoveto(ci, ri)  # 移动到出口
        return True
    if not (0 <= ci < C and 0 <= ri < R):  # 判断位置是否不合法
        return False
    if mlist[ri][ci] in [&#39;1&#39;, &#39;$&#39;]:  # 判断是否为墙或者已探索过的
        return False
    mlist[ri][ci] = "$"  # 标记已探索过
    for d in direction:  # 尝试从不同方向探索是否为通路,如果发现一条通路,则不再继续探索
        dc, dr = d  # # 将索引变化规则的值分别赋值给dc和dr,其中dc为x轴方向,dr为y轴方向
        found = find_next(mlist, ci + dc, ri + dr)  # 递归调用
        if found:  # 如果是通路则绘制线路
            draw_path(ci, ri)  # 绘制线路
            return True  # 返回True,不再探索
    return False  # 当所有方向都不通时,返回False
 
 
def draw_path(ci, ri, color="green"):  # 自动绘制用
    """
    功能:根据索引位置移动海龟(画线)
    :param ci: 列索引
    :param ri: 行索引
    :param color: 画笔颜色
    :return:
    """
    auto_t.st()  # 显示海龟光标
    cx, cy = itoc((ci, ri))  # 将索引位置转换为坐标位置
    auto_t.color(color)
    auto_t.goto(cx, cy)
 
 
def level_init():
    """
    功能:关卡初始化
        游戏规则:
        按下F2键开始手动走迷宫;按下F1键查看答案
        按下↑↓←→方向键控制小海龟移动,闯关成功后,按Enter进入下一关
    :return:
    """
    manual_t.clear()  # 清除绘图
    auto_t.clear()  # 清除绘图
    turtle.clear()  # 清除绘图
    global txt_path, level, mazeList, R, C  # 定义全局变量
    if level == 1:  # 第一关的地图文件和背景
        txt_path = "map/map1.txt"
        levelbg = &#39;image/level1.png&#39;
    elif level == 2:  # 第二关的地图文件和背景
        txt_path = "map/map2.txt"
        levelbg = &#39;image/level2.png&#39;
    elif level == 3:  # 第三关的地图文件和背景
        txt_path = "map/map3.txt"
        levelbg = &#39;image/level3.png&#39;
    else:
        turtle.bye()  # 退出程序
        return
    mazeList = get_map(txt_path)  # 获取地图数据
    R, C = len(mazeList), len(mazeList[0])
    turtle.setup(width=C * cell_size + 50, height=R * cell_size + 100)  # 根据地图调整窗口尺寸
    turtle.bgpic(levelbg)  # 设置背景图片
 
    &#39;&#39;&#39;  
    # 如果想要手动绘制关卡数,可以使用下面的两行代码
    cmoveto(turtle, (1 * cellsize - C * cellsize / 2, R * cellsize / 2+10))
    turtle.write(&#39;关卡:&#39;+str(int(level)), font=(&#39;宋体&#39;, 16, &#39;normal&#39;))    
    &#39;&#39;&#39;
    turtle.ht()  # 隐藏海龟光标
    draw_map(mazeList)  # 绘制地图

Python+Turtle怎么制作海龟迷宫小游戏四、效果图

1.运行代码

Python+Turtle怎么制作海龟迷宫小游戏

2.关卡一

这是按住了F1所以才出现路线图的哦!

Python+Turtle怎么制作海龟迷宫小游戏

3.关卡二

这是按住了F2所以是自己手动在闯关哈!

Python+Turtle怎么制作海龟迷宫小游戏

4.关卡三

Python+Turtle怎么制作海龟迷宫小游戏

以上是Python和Turtle如何制作迷宫小游戏,其中角色是一只海龟?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文转载于:亿速云。如有侵权,请联系admin@php.cn删除
Python vs.C:申请和用例Python vs.C:申请和用例Apr 12, 2025 am 12:01 AM

Python适合数据科学、Web开发和自动化任务,而C 适用于系统编程、游戏开发和嵌入式系统。 Python以简洁和强大的生态系统着称,C 则以高性能和底层控制能力闻名。

2小时的Python计划:一种现实的方法2小时的Python计划:一种现实的方法Apr 11, 2025 am 12:04 AM

2小时内可以学会Python的基本编程概念和技能。1.学习变量和数据类型,2.掌握控制流(条件语句和循环),3.理解函数的定义和使用,4.通过简单示例和代码片段快速上手Python编程。

Python:探索其主要应用程序Python:探索其主要应用程序Apr 10, 2025 am 09:41 AM

Python在web开发、数据科学、机器学习、自动化和脚本编写等领域有广泛应用。1)在web开发中,Django和Flask框架简化了开发过程。2)数据科学和机器学习领域,NumPy、Pandas、Scikit-learn和TensorFlow库提供了强大支持。3)自动化和脚本编写方面,Python适用于自动化测试和系统管理等任务。

您可以在2小时内学到多少python?您可以在2小时内学到多少python?Apr 09, 2025 pm 04:33 PM

两小时内可以学到Python的基础知识。1.学习变量和数据类型,2.掌握控制结构如if语句和循环,3.了解函数的定义和使用。这些将帮助你开始编写简单的Python程序。

如何在10小时内通过项目和问题驱动的方式教计算机小白编程基础?如何在10小时内通过项目和问题驱动的方式教计算机小白编程基础?Apr 02, 2025 am 07:18 AM

如何在10小时内教计算机小白编程基础?如果你只有10个小时来教计算机小白一些编程知识,你会选择教些什么�...

如何在使用 Fiddler Everywhere 进行中间人读取时避免被浏览器检测到?如何在使用 Fiddler Everywhere 进行中间人读取时避免被浏览器检测到?Apr 02, 2025 am 07:15 AM

使用FiddlerEverywhere进行中间人读取时如何避免被检测到当你使用FiddlerEverywhere...

Python 3.6加载Pickle文件报错"__builtin__"模块未找到怎么办?Python 3.6加载Pickle文件报错"__builtin__"模块未找到怎么办?Apr 02, 2025 am 07:12 AM

Python3.6环境下加载Pickle文件报错:ModuleNotFoundError:Nomodulenamed...

如何提高jieba分词在景区评论分析中的准确性?如何提高jieba分词在景区评论分析中的准确性?Apr 02, 2025 am 07:09 AM

如何解决jieba分词在景区评论分析中的问题?当我们在进行景区评论分析时,往往会使用jieba分词工具来处理文�...

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。