蓝桥杯Python初级组测试题之Turtle画图

蓝桥杯Python初级测试题之Turtle画图

写这个主要是为了辅助和讲解过蓝桥杯的初级测试,难度并不高,重点在于解析过程。

  1. 画圆形和以及菱形阵列
    蓝桥杯Python初级组测试题之Turtle画图_第1张图片
    思路:
    第1步: 设置整体参数,如循环画菱形的次数为n=12,每次旋转的角度angle
    第2步: 设置画笔颜色为红,画半径120圆
    第3步: 回到圆心,按照n做循环,
    第4步: 设置画笔为绿色,填充为黄色,拆分画菱形的步骤进行循环
    第4步菱形步骤拆解,这个很重要,因为是12个循环步骤,主要每次出发相对的方向是一致的,那么操作就只用写好0°的就可以了。
    蓝桥杯Python初级组测试题之Turtle画图_第2张图片
import turtle as t
# 第1步: 设置绘制次数以及每次旋转角度,题目要求隐藏画笔
times = 12
angle = 360 / times
t.hideturtle()
# 第2步: 设置画笔颜色为红,画半径120圆,先移动120距离方便画圆
t.pencolor("red")
t.penup()
t.goto(0, -120)
t.pendown()
t.circle(120)
# 第3步: 回到圆心,按照n做循环,设置线条颜色为黑色,填充颜色为黄色
t.penup()
t.home()
t.color("black", "yellow")
# 第4步: 拆分画菱形的步骤进行循环
for i in range(times):
    # 次增加1个分割角度angle
    t.seth(angle * i)
    t.penup()
    t.forward(120)
    t.pendown()
    # 绘制菱形,左转30,走80,右转60,走80,再右转120,走80,再右转60,走80,回到起点
    # 以上可以在0°时,用笔试画一下
    t.begin_fill()
    t.left(30)
    t.forward(80)
    t.right(60)
    t.forward(80)
    t.right(120)
    t.forward(80)
    t.right(60)
    t.forward(80)
    t.end_fill()
    # 回原点
    t.penup()
    t.home()
#结束绘图
t.done
  1. 画二叉树
    蓝桥杯Python初级组测试题之Turtle画图_第3张图片
    动作分解: 每次分叉都是原来的一支分为两支,看上去是一个递归动作,角度看差不多,先按60°作为初始,题目也不明确要求角度
    思路:1.设计一个递归的分叉函数,起始点都在中心往平分方向,往左走到分叉点记录坐标和朝向x,y,heading为一个数组pos1,增加到坐标点数组中;再回到起始点往右走到分差点记录坐标和朝向x,y,heading为一个数组pos2,每一层都从哪输入的数组参数中提取坐标和朝向作为新的起始点完成一次画二叉树的操作。逻辑比较清晰,但是写起来比较麻烦。
    用到的三个取分叉点位置和方向的关键函数:
    turtle.xcor() 返回海龟的 x 坐标
    turtle.ycor() 返回海龟的 y 坐标
    turtle.heading() 返回海龟的朝向
    用到的三个设置分叉点位置和方向的关键函数:
    turtle.setx(x) 参数x – 一个数值 (整型或浮点型) 设置海龟的横坐标为 x,纵坐标保持不变。
    turtle.sety(y) 参数y – 一个数值 (整型或浮点型) 设置海龟的纵坐标为 y,横坐标保持不变。
    turtle.seth(to_angle)参数to_angle – 一个数值 (整型或浮点型) 设置海龟的朝向为 to_angle
    蓝桥杯Python初级组测试题之Turtle画图_第4张图片
import turtle as t

# 定义初始边长和角度
leng = 60
angle = 60
# 初始化角度向上
t.seth(90)

# 定义一个子函数,从输入的数组[[X,Y,heading]]提取多个点坐标和方向用于画二叉树
# 同时把二叉树的两个树杈点和方向存到数组里
def draw_ercha(l1, list_posx=[[]]):
    # 如果输入点数组为空,则结束函数返回空数组
    if len(list_posx) == 0:
        return list_posx
    list_posx2 = []
    for ls in list_posx:
        x = ls[0]
        y = ls[1]
        ang = ls[2]
        t.setx(x)
        t.sety(y)
        t.seth(ang)
        t.pendown()
        t.left(angle / 2)
        t.forward(l1)
        # 存储左上角点坐标和方向
        pos1 = [t.xcor(), t.ycor(), t.heading()]
        t.penup()
        t.forward(l1 * -1)
        t.pendown()
        t.right(angle)
        t.forward(l1)
        # 存储右上角点坐标和方向
        pos2 = [t.xcor(), t.ycor(), t.heading()]
        t.penup()
        # 回到起始点
        t.forward(l1 * -1)
        t.left(angle / 2)
        list_posx2.append(pos1)
        list_posx2.append(pos2)
    return list_posx2


# 用一个点数组记录每次画叉的起点
# 第一次起点为0,0且只有1个点,分叉次数为4
times = 4
run = 1
list_pos = [[0, 0, 90]]
# 画第一个二叉树,返回数顶部的两个点位置和方向
list_pos = draw_ercha(leng, list_pos)
while len(list_pos) > 0 and run < times:
    # 每层分支长度减6
    leng -= 6
    list_pos = draw_ercha(leng, list_pos)
    run += 1

画出的效果如下,与题目要求类似:
蓝桥杯Python初级组测试题之Turtle画图_第5张图片

你可能感兴趣的:(蓝桥杯Python,python,蓝桥杯)