Python简单的海龟绘图程序

4
我遇到了一些问题,无法完成一个Python Turtle程序。当我尝试像这样输入x和y坐标以及函数的半径值:t.drawSnowman(x = 25,y = 25,radius = 25)时,如果我输入值,程序会表现不正常。但是,如果我省略上述参数,而是只使用t.drawSnowman(),则程序按预期工作,但我无法创建各种雪人的实例。
我真的希望得到帮助,尝试弄清楚如何输入参数并仍然使程序功能正常。
以下是我的代码:
import turtle

class MyTurtle(turtle.Turtle):
""""""


def __init__(self):
    """Turtle Constructor"""
    turtle.Turtle.__init__(self, shape="turtle")

def drawNose(self, x=0, y=0, radius = 15, circle_color = "black"):
    '''draw nose '''
    self.pendown()
    self.goto(-(radius) * (0.25),(radius * 6)+(radius * 4)+(radius))
    self.goto(0,(radius * 6)+(radius * 4)+(radius)+(radius * (0.25)))
    self.goto((radius) * (0.25),(radius * 6)+(radius * 4)+(radius))
    self.goto(0,(radius * 6)+(radius * 4)+(radius))
    self.penup()

def leftEye(self, x=0, y=0, radius = 15, circle_color = "black"):
    '''draw left eye'''
    self.pendown()
    self.circle(radius*(.25))
    self.penup()
def rightEye(self, x=0, y=0, radius = 15, circle_color = "black"):
    '''draw right eye'''
    self.pendown()
    self.circle(radius*(.25))
    self.penup()
def bottomOfHat(self, x=0, y=0, radius = 15, circle_color = "black"):
    ''' draw the long part of the hat at the bottom '''
    self.goto(0,(radius * 6)+(radius * 4)+(radius * 2))
    self.pendown()
    self.goto(-(radius),(radius * 6)+(radius * 4)+(radius * 2))
    self.goto(-(radius),(radius * 6)+(radius * 4)+(radius * 2)+(radius * (0.5)))
    self.goto(radius,(radius * 6)+(radius * 4)+(radius * 2)+(radius * (0.5)))
    self.goto(radius,(radius * 6)+(radius * 4)+(radius * 2))
    self.goto(0,(radius * 6)+(radius * 4)+(radius * 2))
    self.penup()

def topOfHat(self, x=0, y=0, radius = 15, circle_color = "black"):
    '''draw the top bigger part of the hat'''
    self.goto(radius*(.75),(radius * 6)+(radius * 4)+(radius * 2)+(radius * (0.5)))
    self.pendown()
    self.goto(radius*(.75),(radius * 6)+(radius * 4)+(radius * 2)+(radius * 2))
    self.goto(-(radius)*(.75),(radius * 6)+(radius * 4)+(radius * 2)+(radius * 2))
    self.goto(-(radius)*(.75),(radius * 6)+(radius * 4)+(radius * 2)+(radius * (0.5)))

def bottomCircle(self, x=0, y=0, radius = 15, circle_color = "black"):
    '''draws the bottom circle'''
    self.pendown()
    self.circle(radius * 3)
    self.penup()
def middleCircle(self, x=0, y=0, radius = 15, circle_color = "black"):
    '''draw the middle circle'''
    self.pendown()
    self.circle(radius * 2)
    self.penup()
def topCircle(self, x=0, y=0, radius = 15, circle_color = "black"):
    '''draw the top circle'''
    self.pendown()
    self.circle(radius)
    self.penup()
def drawSnowman(self, x=0, y=0, radius = 15, circle_color = "black"):
    self.bottomCircle()
    self.goto(0,radius * 6)
    self.middleCircle()
    self.goto(0,(radius * 6)+(radius * 4))
    self.topCircle()
    self.goto(-(radius) * (0.5),(radius * 6)+(radius * 4)+(radius))
    self.leftEye()
    self.goto((radius) * (0.5),(radius * 6)+(radius * 4)+(radius))
    self.rightEye()
    self.goto(0,(radius * 6)+(radius * 4)+(radius))
    self.drawNose()
    self.bottomOfHat()
    self.topOfHat()



t = MyTurtle()
t.hideturtle()
radius = 15
t.drawSnowman(x = 25,y = 25,radius = 25)

这是一个我使用参数t.drawsnowman(x = 25 y=25 radius = 25)时的雪人图片 捣乱的雪人

这是我没有输入任何参数时t.drawsnowman()的雪人图片 完整的雪人


2
你正在将x和y参数传递给drawSnowman,但你没有在内部使用它们。我可以看到你只使用了半径。而且你所说的绘图无法工作是什么意思? - Mihai Zamfir
你应该发布编译输出,这样我们才能看到它为什么不起作用的方式。我假设你在使用这个:https://docs.python.org/2/library/turtle.html (?) - powlo
是的,我正在使用海龟绘图,因此没有任何编译输出,因为期望的结果是一幅绘制的图片,这里是一个雪人。当我说绘制不起作用时,我的意思是当我运行程序时,在屏幕上得到雪人的不同部分。而不是三个雪球在一起,我得到了每个雪球之间20个像素的空间。 - John Anthony
你能解释一下为什么 x 和 y 参数在函数内部没有被使用吗?我不明白它们为什么没有被使用。 - John Anthony
1个回答

2
尝试逐步操作并了解您的代码实际执行情况(或使用调试器)。
- 如果您调用t.drawSnowman(),则radius将为15。 - 您调用bottomCircle(),其将绘制一个半径为radius * 3= 45的圆。 - 您在y轴上向上移动radius * 6 = 90(现在您在圆形的顶部)。 - 您调用middleCircle(),其将绘制一个半径为radius * 2 = 30的圆。 - ...
现在,看看如果您使用参数调用您的函数会发生什么:
- 如果您调用t.drawSnowman(x = 25,y = 25,radius = 25),则radius将为25。 - 您调用bottomCircle(),其将绘制一个半径为radius * 3= 45的圆。请注意,局部变量radius15,因为它是该参数的默认值,并且您没有将drawSnowman中传递给bottomCircle方法的值传递下来。 - 您在y轴上向上移动radius * 6 = 150(现在您远离圆形)。 - 您调用middleCircle(),其将绘制一个半径为radius * 2 = 30的圆。请注意,局部变量radius也是15。 - ...
因此,您的问题是传递给drawSnowmanradius值仅用于移动小海龟,而未在任何其他函数中进一步使用。

谢谢,你的回答对我完成程序非常有帮助。我一直在看绘图部分,这让我分心了,没有真正看我的代码,看看到底发生了什么。 - John Anthony

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接