Python 简单的海龟程序

4 投票
1 回答
3420 浏览
提问于 2025-04-18 00:38

我在完成一个Python海龟绘图程序时遇到了一些麻烦。当我尝试输入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() 正确的雪人

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 的圆。注意,这里的局部变量 radius 仍然是 15,因为这是这个参数的默认值,而你没有把传给 drawSnowman 的值传递给 bottomCircle 方法。
  • 你在 y 轴上移动 radius * 6 = 150(这时你已经远离圆了)。
  • 你调用 middleCircle(),这个函数会画一个半径为 radius * 2 = 30 的圆。注意,这里的局部变量 radius 也是 15
  • ...

所以,你的问题在于你传入了一个 radius 的值,但这个值只在 drawSnowman 中用来移动乌龟,而在其他函数中并没有继续使用这个值。

撰写回答