👋 同学们好!
新的一年,你想不想用代码给自己画一份好运气?
今天我们要用 Python 的 Turtle(海龟库) 来画一幅非常有寓意的画——“马上有钱”。
我们会先画一匹红色的骏马,然后在马背上放一枚大铜钱。这不仅好玩,还能学到很多编程技巧,特别是如何画出同心圆!
就像美术课一样,我们先要准备好工具。在 Python 里,我们需要设置屏幕(画纸)和画笔(海龟)。
import turtle as t
# --- 1. 配置常量 (像调色盘一样,方便以后修改) ---
PEN_COLOR = "#8B1A1A" # 深红色,代表喜庆
PEN_SIZE = 20 # 笔触粗细
SCREEN_SIZE = (800, 600)
TITLE = "马年大吉"
def setup_turtle():
"""初始化屏幕和画笔"""
screen = t.Screen()
screen.title(TITLE)
screen.bgcolor("white") # 背景是白色的
screen.setup(width=SCREEN_SIZE[0], height=SCREEN_SIZE[1])
t.shape("blank") # 隐藏海龟形状,画得更快
t.pencolor(PEN_COLOR) # 设置笔的颜色
t.pensize(PEN_SIZE) # 设置笔的粗细
return screen
# 启动设置
screen = setup_turtle()
这匹马是用线条拼出来的,看起来像乐高积木拼的一样,很有设计感。
🧠 思考一下:
海龟画画只有两个基本动作,像走迷宫一样:
fd / forward)rt / right 或 lt / left)我们需要指挥海龟先调整方向(头朝下),然后一步步画出马的轮廓。
def draw_horse(t):
"""绘制马的图案"""
# 1. 初始方向调整:面朝南(下)
t.right(90)
# 2. 绘制头部和颈部
t.fd(65)
t.rt(90)
t.fd(40)
t.rt(90)
t.fd(110)
t.rt(90)
t.fd(85)
t.rt(90)
# 3. 绘制身体左侧
t.fd(145)
t.rt(90)
t.fd(125)
t.lt(90)
# 4. 绘制前腿
t.fd(90)
t.lt(90)
t.fd(40)
t.lt(90)
t.fd(50)
t.rt(90)
# 5. 绘制腹部
t.fd(210)
t.rt(90)
# 6. 绘制后腿
t.fd(80)
t.lt(90)
t.fd(40)
t.lt(90)
t.fd(120)
t.rt(90)
# 7. 绘制尾部
t.fd(80)
这是本节课最难也最有趣的地方!铜钱是由 4 层图形 套在一起组成的。
当我们使用 t.circle(半径) 画圆时,海龟是从圆的最底部开始画的。
如果我们只是把半径变小,画出来的圆会像“糖葫芦”一样串在底下,而不是包在里面。
为了让小圆在大圆的正中心,每画完一层,海龟必须抬笔向上走一段距离。
请看下面的图,这就是海龟移动的路线:
(圆心 Center)
+
/ \
/ + \ <-- 第2层:小圆 (半径 r2)
| / \ |
| | O | |
| | | |
| \ / |
\ + / <-- A点:画完第2层圆,海龟停在这里
\ ^ /
\ | / <-- ⬆️ 关键一步:抬笔向上走 (r1 - r2) 的距离!
---------(X)---------
(B点:画大圆时的起始点)
公式:向上移动距离 = 上一层半径 - 下一层半径
def draw_coin(r1):
"""
绘制单个铜钱
参数 r1: 铜钱最外层大圆的半径
"""
# 1. 保存当前的画笔设置(好习惯)
original_size = t.pensize()
original_color = t.pencolor()
t.pencolor("#5f3929") # 描边颜色:深棕色
# 2. 计算每一层的半径(按比例缩小)
# 就像切蛋糕一样,按比例分
size = r1 / 30
r2 = r1 * (5 / 6)
r3 = r1 * (3 / 6)
r4 = r1 * (2 / 6)
t.pensize(size)
# --- 第1层:大圆 (外壳) ---
t.fillcolor("#f07a45") # 橙色
t.begin_fill()
t.circle(r1)
t.end_fill()
# --- 关键动作:向上移动 ---
t.penup() # 抬笔,不要画出线
t.setheading(90) # 1. 面朝上
t.forward(r1 - r2) # 2. 走半径的差值!
t.setheading(0) # 3. 恢复面朝右(画圆的标准姿势)
t.pendown() # 落笔
# --- 第2层:内圆 (金边) ---
t.fillcolor("#f8b23d") # 金黄色
t.begin_fill()
t.circle(r2)
t.end_fill()
# --- 第3层:外方孔 ---
# 再次向上移动
t.penup()
t.setheading(90)
t.forward(r2 - r3)
t.setheading(0)
t.pendown()
t.fillcolor("#f07a45")
t.begin_fill()
# 🌟 魔法:steps=4 让圆形变成正方形!
t.circle(r3, steps=4)
t.end_fill()
# --- 第4层:内方孔 ---
t.penup()
t.setheading(90)
t.forward(r3 - r4)
t.setheading(0)
t.pendown()
t.fillcolor("white")
t.begin_fill()
t.circle(r4, steps=4)
t.end_fill()
# 还原画笔设置
t.pensize(original_size)
t.pencolor(original_color)
如果我们画完马直接画铜钱,铜钱会连在马尾巴上。我们需要用“瞬移大法”!
goto(x, y):让海龟直接飞到指定的坐标。penup(),否则会画出一条丑丑的线。# 1. 移动海龟到左边,准备画马
t.penup()
t.goto(-100, 100)
t.pendown()
# 2. 画马
draw_horse(t)
# 3. 瞬移!去画铜钱
# 我们计算过了,(30, -10) 这个位置刚好在马背上
t.penup()
t.goto(30, -10)
t.setheading(0) # 重要!把头转正,否则圆会画歪
t.pendown()
# 4. 召唤铜钱函数
draw_coin(60)
最后,签上你的大名,写上祝福!
t.penup()
t.home() # 回家(回到原点 0,0)
t.goto(0, -180) # 走到下方,避免挡住马
t.pendown()
t.pencolor("black")
# font 参数的意思是:(字体名称, 字体大小, 字体粗细)
t.write("马上有钱-谭老师", align="center", font=("隶书", 30, "bold"))
t.hideturtle() # 把海龟藏起来,大功告成!
t.done()
恭喜你完成了作品!现在你是小小程序员了,试试能不能完成这些挑战:
PEN_COLOR 或者颜色代码进行修改)。goto 坐标,在马背上画一串(比如3个)叠在一起的铜钱吗?加油!期待你的创意作品! 🐴💰