用 Python 海龟中的平行线制成的钻石

Diamond made out of pararel lines in Python Turtle

我必须制作一颗钻石,它必须具有用户想要的完全相同的线条数。我被卡住了,我已经想了很长时间,但没有得到任何地方。我的钻石需要像图片中那样:

如果打印为文本,请尝试使用 for 循环、'_' 字符和空格

编辑: 这是一些伪代码,

For i in range(totalLines/2):
   For j in range(totalLines/2 - i):
       Print(" ")
   For j in range(i):
       Print("_")

For i in range(totalLines/2):
   For j in range(totalLines/2 - i):
       Print("_")
   For j in range(i):
       Print(" ")

这应该也有效:

nl = 5

for line in range(nl):
    if line < nl/2:      
        spc = (int(nl/2-line))*' '
        dsh = (line*2+1)*'_'
        print(spc, dsh)
    else:
        spc = (int(line-nl/2+1))*' '
        dsh = ((nl-line)*2-1)*'_'
        print(spc, dsh)

它将产生:

   _
  ___
 _____
  ___
   _

标题说需要在Python Turtle中完成。但是哦,好吧。我找到了满足我要求的代码,唯一的问题是上半部分和下半部分之间存在间隙。
这是我的代码:

import turtle

clyde = turtle.Turtle()
P.S.: I speak spanish, but you should understand my code easily.

while True:
    try:
        lineas = int(raw_input('Cuantas lineas quieres que tenga tu rombo?(Numero Impar): '))
        assert lineas > 2 and lineas < 646 and lineas % 2 != 0
        break
    except AssertionError:
        if lineas > 646 or lineas < 2:
            print "El numero de lineas debe ser entre de 3 a 645."
            print
        else:
            print 'El numero deber ser un impar positivo.'
            print
    except:
        print 'Ingresa un numero valido'
        print

if lineas <= 21:
    clyde.speed(8)
elif lineas <= 41:
    clyde.speed(5)
else:
    clyde.speed(0)

canvas = 200

if lineas > canvas:
    canvas = lineas + 1

def trasPunta(punta):
    clyde.pu()
    clyde.goto(0, punta)
    clyde.pd()
    clyde.fd(1)
    clyde.pu()
    clyde.back(1)
def drawLine(inc):
    clyde.pd()
    clyde.fd(inc * (canvas / float(lineas)))
    clyde.pu()
    clyde.bk(inc * (canvas / float(lineas)))

trasPunta(canvas / 2.0)
a = 2
for i in range(lineas / 2):

    clyde.right(90)
    clyde.fd(canvas / float(lineas))
    clyde.right(90)
    clyde.fd(canvas / float(lineas))
    clyde.right(180)

    drawLine(a)
    a += 2

trasPunta((-canvas / 2.0) + (canvas / float(lineas)))
b = 2
for i in range((lineas / 2) - 1):

    clyde.left(90)
    clyde.fd(canvas / float(lineas))
    clyde.left(90)
    clyde.fd(canvas / float(lineas))
    clyde.left(180)

    drawLine(b)
    b += 2

虽然你已经接受了自己的解法,但是看着画画还是很痛苦的。您总是从左向右工作并将问题分成两个独立的部分,从而使您的思维出现偏差。让我们在双向思考的同时画出一个解决问题的单一形状:

import turtle

lines = int(raw_input('How many lines do you wish your diamond to have? (Odd number only): '))

half = lines // 2
canvas = max(200, lines + 1)
shrinkage = canvas / float(lines)

clyde = turtle.Turtle()
clyde.speed('fastest')  # because I have no patience

clyde.forward(canvas)
clyde.penup()
clyde.left(90)
clyde.forward(shrinkage)
clyde.left(90)

for i in range(1, half + 1):

    clyde.forward(shrinkage)

    for j in range(2):
        clyde.pendown()
        clyde.forward(canvas - i * shrinkage * 2)  # visible horizontal lines
        clyde.penup()
        clyde.left(90)
        clyde.forward(((i * 2) + j) * shrinkage)  # invisible vertical lines
        clyde.left(90)

clyde.hideturtle()

turtle.mainloop()

在此示例中,我有意省略了您的输入错误检查以及您将端点强制转换为单个像素。您可以稍后再添加:

先看看你的解决方案是如何绘制的,然后再看这个。请注意,浪费的动作更少了。它从左到右和从右到左绘制。它将图案绘制为一系列越来越窄和越来越高的矩形:

但让关键行不可见。如果你用鼠标跟随它,你可以看到它实际上是一个螺旋线。