>  기사  >  백엔드 개발  >  캐릭터가 거북이인 Python과 Turtle을 사용하여 미로 미니 게임을 만드는 방법은 무엇입니까?

캐릭터가 거북이인 Python과 Turtle을 사용하여 미로 미니 게임을 만드는 방법은 무엇입니까?

WBOY
WBOY앞으로
2023-05-09 12:22:083453검색

1. 소개

1. Turtle이란?

Turtle은 영어로 Turtle로 번역되는데, 저희가 소개하는 것은 이 동물이 아니라 그 이름을 딴 그리기 소프트웨어입니다.

Python 문서에 소개된 Turtle 자체는 간단하고 사용하기 쉬운 그리기 소프트웨어로, 초보자가 프로그래밍 세계에 입문하는 데 매우 적합합니다.

Turtle은 Python에 내장된 모듈입니다. 한마디로 매우 간단하고 재미있는 라이브러리입니다.

주요 작업은 다음과 같습니다. 펜을 들어 올린 후 후속 작업은 브러시를 움직이기만 하면 캔버스에 흔적이 남지 않습니다. 펜을 내려놓으면 브러시가 이동하는 한 캔버스에 흔적이 남습니다.

펜 동작에는 절대 이동, 상대 이동, 전(후진) 이동, 조향(절대 각도, 상대 각도), 원 또는 호, 점(실선 원)만 포함되므로 타원을 그리는 것이 불가능하고 어렵습니다. 함수곡선을 그리다!

2. 거북이를 가지고 노는 방법

물론 여기에서 Python 프로그래밍 환경에 들어가야 하며, 그러면 이 Python 파일에 거북이 관련 코드 작성을 시작할 수 있습니다.

Turtle은 Python 설치와 함께 제공되는 내장 모듈입니다. 가져오기 방법을 사용하여 직접 로드하는 것은 매우 간단합니다.

import Turtle 또는 from Turtle Import *

이것은 또한 거북이 모듈을 사용하기 위해 준비하는 데 사용되는 프로그램의 코드입니다.

3. 캔버스 설정

1.1 캔버스 크기 설정

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

1.2 기본 그리기 창 크기로 창을 표시하며 창은 화면 중앙에 위치합니다. 캔버스 너비(단위 픽셀); Hight - 캔버스 높이(단위 픽셀)를 나타냅니다. bg - 캔버스 배경색, 이 매개변수는 기본값으로 설정될 수 있으며 기본값은 흰색 배경입니다.

1.3 케이스

여기서: width, height&mdash ;—캔버스의 너비와 높이를 나타냅니다. 정수이면 픽셀을 나타내고, 소수이면 컴퓨터 화면의 비율을 나타냅니다.

4. 배경/캔버스 색상 설정

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

2. 거북이 브러시 설정

turtle.screensize(800, 600, "green"),表示画布大小为800×600,绿色画布。

그 중: 크기 - 브러시 두께(픽셀로 표시).

1. 거북이 그리기의 기본 방법

거북이 라이브러리 그리기 모듈을 가져온 후 그리기를 구현할 수 있습니다. 기본 작업은 직선을 앞으로(뒤로) 그리고 회전(왼쪽에서 오른쪽으로 방향 변경)하는 것입니다. 원(호) 잠깐만요.

다음은 가장 일반적으로 사용되는 명령 중 일부입니다.

1.1 브러시 속성 설정

Command

설명turtle.pensize(width)은 브러시의 너비(즉, 두께)를 설정하는 데 사용됩니다. , 더 두꺼워짐turtle .pencolor(color)은 브러시의 색상을 설정하는 데 사용됩니다. 색상 매개변수는 "녹색", "빨간색" 또는 RGB 삼중선 과 같은 문자열일 수 있습니다. Turtle.shape(shape) 사용 브러시의 모양을 설정합니다. 모양 매개변수는 문자열이며 주로 "거북이" 거북이 모양, "사각형" 사각형 모양 등을 포함합니다. turtle.speed(speed )은 브러시의 이동 속도를 설정하는 데 사용됩니다. 속도 매개변수는 "fast", "slow" 등과 같은 문자열이거나 0과 10 사이의 정수일 수 있습니다
1.2 브러시 그리기 명령

Command

Explanationturtle . fd(dis)dist 픽셀 길이를 현재 브러시 방향으로 앞으로 이동turtle.bk(dist)dist 픽셀 길이를 현재 브러시의 반대 방향으로 이동turtle.right(degree )along 현재 브러시 방향을 오른쪽으로 돌립니다°turtle.left(degree)현재 브러시 방향을 따라 왼쪽으로 도°turtle.down()브러시를 아래로 놓습니다. 그리고 그리기 시작 Turtle.up()펜을 들고 그래픽을 그리지 않고 이동하세요turtle.circle()중심을 의미하는 양(음수) 반경의 원을 그립니다. 원이 브러시의 왼쪽(오른쪽)에 있습니다 setx( )현재 x축을 지정된 위치로 이동sety( )현재 y축을 지정된 위치로 이동 setheading(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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제