用土语写信

2024-04-20 00:14:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚开始学Python龟。 我试图写我的名字“Idan”(大写字母),但我被困在“D”。

到目前为止这是我的代码:

import turtle

t = turtle.Turtle()

t.up()
t.backward(400)
t.left(90)
t.down()
t.forward(250)
t.right(90)
t.forward(62.5)
t.backward(62.5 * 2)
t.forward(62.5)
t.right(90)
t.forward(250)
t.right(90)
t.forward(62.5)
t.backward(62.5 * 2)
t.up()
t.backward(100)
t.right(90)
t.down()
t.forward(250)
for x in range(180):
    t.forward(1)
    t.right(1)

但当我运行它给我一个小半圆。

有没有办法让它做一个半圆形,这样会产生一个“D”


Tags: 代码inimportrightfor大写字母名字left
3条回答

你的主要问题是,你的半圆是从海龟面朝上开始的,而不是从右边开始。在for循环之前添加一个t.right(90)调用,您将更接近您想要的内容(您将得到类似P的内容)。

之后,您需要调整循环内的forward调用,以使循环达到您想要的大小(或者按照注释中建议的martineau,使用t.circle而不是您自己的循环)。您可能需要进行一些计算来确定正确的距离(例如,将所需直径乘以math.pi得到周长,然后除以用于构造周长的段数)。

不是完美的,由尝试和错误造成,但它写下了名字:

import turtle
turtle.setup(900,400)
wn = turtle.Screen()
wn.title("Turtle writing my name: IDAN")
wn.bgcolor("lightgreen")
turtle.width(30)
# turtle.pensize(30)

t = turtle.Turtle()
t.up()
t.backward(360)
t.left(90)
t.backward(80)
t.down()
t.forward(250)
t.right(90)
t.forward(62.5)
t.backward(62.5 * 2)
t.forward(62.5)
t.right(90)
t.forward(250)
t.right(90)
t.forward(62.5)
t.backward(62.5 * 2)
t.up()
t.backward(100)
t.right(90)
t.down()
t.forward(250)
t.right(90)
for x in range(180):

. t.forward(2.2) # adjust HERE to get different size of circle

    t.right(1)
t.up()
t.right(90)
t.forward(230)
t.right(90)
t.forward(4*62.5)
t.right(65)
t.down()
t.forward(250)
t.right(180)
t.forward(275)
t.left(135)
t.forward(250)
t.right(180)
t.forward(120)
t.right(70)
t.forward(110)
t.right(90)
t.up()
t.forward(115)
t.left(90)
t.forward(1.5*62.5)
t.left(90)
t.down()
t.forward(250)
t.right(145)
t.forward(320)
t.left(145)
t.forward(250)

wn.mainloop()

在解决这样的问题时,我建议如下:

  • 如果需要的话,在纸上仔细计划你的方块字体。这个 设计越简单,编写代码就越容易。

  • 在代码中逻辑地分离字母——如果不是函数的话 在这一点上,至少分成单独的注释块。

  • 让每个字母以乌龟指向同一方向开始 并根据需要进行调整,不要指望前一个 信。

  • 使用虚拟坐标系简化绘图逻辑和 允许字母出现在不同大小的窗口中。如果没有 函数类似于setworldcoordinates(),然后简单地通过乘法器 高度和宽度。

  • 在你的设计中假设你想在以后添加更多的字母。

  • 想想如果你想拼“DIAN”会发生什么-- 您需要更改多少代码,以及如何将其保留为 最少。

我下面的示例使用了您可能还没有学习过的功能,并不是要作为解决方案供您使用——而是要说明上面的想法。一、 e.尝试更改窗口大小、边框大小、宽度和高度、重新排列删除项等,并查看结果如何更改但仍然有效:

from turtle import Turtle, Screen

NAME = "IDAN"

BORDER = 1
BOX_WIDTH, BOX_HEIGHT = 6, 10  # letter bounding box
WIDTH, HEIGHT = BOX_WIDTH - BORDER * 2, BOX_HEIGHT - BORDER * 2  # letter size

def letter_A(turtle):
    turtle.forward(HEIGHT / 2)
    for _ in range(3):
        turtle.forward(HEIGHT / 2)
        turtle.right(90)
        turtle.forward(WIDTH)
        turtle.right(90)
    turtle.forward(HEIGHT)

def letter_D(turtle):
    turtle.forward(HEIGHT)
    turtle.right(90)
    turtle.circle(-HEIGHT / 2, 180, 30)

def letter_I(turtle):
    turtle.right(90)
    turtle.forward(WIDTH)
    turtle.backward(WIDTH / 2)
    turtle.left(90)
    turtle.forward(HEIGHT)
    turtle.right(90)
    turtle.backward(WIDTH / 2)
    turtle.forward(WIDTH)

def letter_N(turtle):
    turtle.forward(HEIGHT)
    turtle.goto(turtle.xcor() + WIDTH, BORDER)
    turtle.forward(HEIGHT)

LETTERS = {'A': letter_A, 'D': letter_D, 'I': letter_I, 'N': letter_N}

wn = Screen()
wn.setup(800, 400)  # arbitrary
wn.title("Turtle writing my name: {}".format(NAME))
wn.setworldcoordinates(0, 0, BOX_WIDTH * len(NAME), BOX_HEIGHT)

marker = Turtle()

for counter, letter in enumerate(NAME):
    marker.penup()
    marker.goto(counter * BOX_WIDTH + BORDER, BORDER)
    marker.setheading(90)

    if letter in LETTERS:
        marker.pendown()
        LETTERS[letter](marker)

marker.hideturtle()

wn.mainloop()

输出

enter image description here

相关问题 更多 >