缩短房子的Python海龟程序



下面是我画黄色房子的程序。我想不出一种方法来创建for循环以保持海龟程序简短。有没有人知道如何为下面的程序创建循环?

import turtle
import math
def yellowHouse () :
wn=turtle.Screen()
wn.title("Yellow House")
wn.bgcolor("Blue")
#sideLength = 200
house=turtle.Turtle()
Diagonal_length= 0.5*math.sqrt(2 *(200 ** 2 ))
house.pensize(5)
house.speed(4.6)
house.color("Yellow")
house.left(90)
house.forward(200)
house.right (135)
house.forward(Diagonal_length)
house.right(90)
house.forward(Diagonal_length)
house.left(135)
house.forward(200)
house.left(135)
house.forward(Diagonal_length)
house.right(90)
house.forward(Diagonal_length)
house.left(135)
house.forward(200)
house.right(135)
house.forward(Diagonal_length)
house.right(90)
house.forward(Diagonal_length)
house.right(45)
house.forward(200)
house.left(90)
wn.mainloop()
yellowHouse ()

由于您正在用重复的一种形状建造房屋,因此我选择在绘图上盖

from turtle import Turtle, Screen
def yellowHouse(side_length):
wn.register_shape("brick", ((0, 0), (-0.5, -0.5), (0.5, -0.5)))
house = Turtle('brick', visible=False)
house.shapesize(stretch_wid=side_length, outline=5)
house.color("yellow", wn.bgcolor())
house.penup()
for angle in range(360, 0, -90):
house.setheading(angle)
house.stamp()
house.forward(side_length)
house.stamp()
wn = Screen()
wn.title("Yellow House")
wn.bgcolor("blue")
yellowHouse(200)
wn.exitonclick()

此解决方案在屏幕中央打印房屋。你通过你想要的房子的大小。 (而且代码减少了大约 1/3。

创建循环是缩短程序代码的好方法,在您的示例中,您可以通过多种方式实现这一点:

方法 1

使用环画正方形,然后画对角线交叉线和顶部

import turtle
def yellowHouse() :
wn=turtle.Screen()
wn.title("Yellow House")
wn.bgcolor("Blue")
house=turtle.Turtle()
house.pensize(5)
house.speed(4.6)
house.color("Yellow")
side = 200
diag = (2*(side**2))**0.5
ang = 90
for i in range(4):
house.fd(side)
house.lt(ang)
house.lt(ang/2)
moves = [(diag,ang),(diag/2,ang),(diag/2,ang),(diag,ang)]
for (move,turn) in moves:
house.fd(move)
house.lt(turn)
wn.mainloop()
yellowHouse()

方法 2

使用循环浏览步骤数组绘制整个形状

import turtle
def yellowHouse() :
wn=turtle.Screen()
wn.title("Yellow House")
wn.bgcolor("Blue")
house=turtle.Turtle()
house.pensize(5)
house.speed(4.6)
house.color("Yellow")
side = 200
diag = (2*(side**2))**0.5
ang = 90
moves = [(side,ang),(side,ang),(side,ang),(side,ang),
(0,ang/2),(diag,ang),(diag/2,ang),(diag/2,ang),(diag,ang)]
for (move,turn) in moves:
house.fd(move)
house.lt(turn)
wn.mainloop()
yellowHouse()

请注意,我们不需要导入数学,因为我们只需要sqrt()来计算平方根,我们可以使用**指数运算符实现sqrt(x)x**0.5

这是你用forloop的代码,你只需要维护事件和事件值索引。

import turtle
import math
def yellowHouse() :
wn=turtle.Screen()
wn.title("Yellow House")
wn.bgcolor("Blue")
#sideLength = 200
house=turtle.Turtle()
Diagonal_length= 0.5*math.sqrt(2 *(200 ** 2 ))
event = ["pensize","speed","color","left","forward","right","forward","right","forward","left","forward","left","forward","right","forward","left","forward","right","forward","right","forward","right","forward","left"]
event_val = [5,4.6,"Yellow",90,200,135,Diagonal_length,90,Diagonal_length,135,200,135,Diagonal_length,90,Diagonal_length,135,200,135,Diagonal_length,90,Diagonal_length,45,200,90]
event_zip = zip(event, event_val)
for i,j in event_zip:
if type(j).__name__ == "str":
eval("house.{}('{}')".format(i,j))
else:
eval("house.{}({})".format(i,j))
yellowHouse()

最新更新