Python 简单的海龟程序
我在完成一个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
中用来移动乌龟,而在其他函数中并没有继续使用这个值。