当前位置:首页>python>Python 趣味编程:绘制“马上有钱”

Python 趣味编程:绘制“马上有钱”

  • 2026-09-25 21:49:10
Python 趣味编程:绘制“马上有钱”

🐴 Python 趣味编程:绘制“马上有钱”

👋 同学们好!

新的一年,你想不想用代码给自己画一份好运气?
今天我们要用 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()

🐴 第二步:画一匹“像素马”

这匹马是用线条拼出来的,看起来像乐高积木拼的一样,很有设计感。

🧠 思考一下:
海龟画画只有两个基本动作,像走迷宫一样:

1
直走 (fd / forward)
2
转弯 (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()

🌟 课后小挑战 (Challenge)

恭喜你完成了作品!现在你是小小程序员了,试试能不能完成这些挑战:

1
变色龙: 你能把马变成蓝色的,把铜钱变成绿色的吗?(提示:找到定义的常量 PEN_COLOR 或者颜色代码进行修改)。
2
多金多福: 现在的马背上只有一个铜钱,你能通过修改 goto 坐标,在马背上画一串(比如3个)叠在一起的铜钱吗?

加油!期待你的创意作品! 🐴💰

最新文章

随机文章