0

我正在开发一个使用 Python 3.6 和 Zelle 的 graphics.py 绘制房子的简单程序。我正在使用 Notepad++ 作为编辑器。

我已经完成了作业的所有要求,但是有一个规定,如果添加风景,可以获得奖励分数。我最初想添加从我画的房子的烟囱里冒出来的烟。

我尝试创建一个点列表,看起来像这样:

    Smoke = []
    for i in range(1, 30):
        Smoke.append(Point(554 + i, i**2 / 3))
    for j in range(31, 80):
        Smoke.append(Point(554 + j, Smoke[j - 1] + 100 / j))
    for k in range(79, -1, -1)
        Smoke.append(Smoke[k])

这样做的问题是我想在附加之前更改 Smoke[k] 的 'y' 参数,所以我决定创建两个列表:

    SmokeX = []
    SmokeY = []
    for i in range (1, 30):
        SmokeX.append(Point(554 + i))
        SmokeY.append(Point(i**2 / 3))
    for j in range (31, 80):
        SmokeX.append(Point(554 + j))
        SmokeY.append(Point(SmokeY[j - 1] + 100 / j))
    for k in range (79, -1, -1):
        SmokeX.append(Point(554 + k))
        SmokeY.append(Point(SmokeY[k] + 50))

那些没有像我一样在上午 01:00 看这个的人会认识到,我的两个列表实际上毫无意义(双关语),因为它们没有两个参数。由于我无法将任一参数设置为 NULL,因此我放弃了这种方法。

最后,我试图只存储数字,而不是点,模糊地希望 Polygon() 会接受这些。从那以后我打开 graphics.py 发现 Polygon() 是一个非常严格的霸主,只会将点作为参数,而不是数字。这是我的完整 house.py 文件供参考。

    from graphics import *
    from math import *

    def main():

        #Initialization
        win = GraphWin("House", 800, 800)

        win.setBackground(color_rgb(191, 191, 191))

        #Main House
        HouseBody = Rectangle(Point(100, 300), Point(700, 700))
        HouseBody.setFill(color_rgb(96, 96, 96))

        #Roof
        HouseRoof = Polygon(Point(100, 300), Point(700, 300), Point(400, 200))
        HouseRoof.setFill(color_rgb(255, 127, 0))

        #Windows
        HouseWindowLeft = Circle(Point(200, 450), 60)
        HouseWindowLeft.setFill(color_rgb(0, 191, 255))
        HouseWindowLeftBarV = Rectangle(Point(198, 390), Point(202, 510))
        HouseWindowLeftBarV.setFill(color_rgb(0, 0, 0))
        HouseWindowLeftBarH = Rectangle(Point(140, 448), Point(260, 452))
        HouseWindowLeftBarH.setFill(color_rgb(0, 0, 0))

        HouseWindowRight = Circle(Point(600, 450), 60)
        HouseWindowRight.setFill(color_rgb(0, 191, 255))
        HouseWindowRightBarV = Rectangle(Point(598, 390), Point(602, 510))
        HouseWindowRightBarV.setFill(color_rgb(0, 0, 0))
        HouseWindowRightBarH = Rectangle(Point(540, 448), Point(660, 452))
        HouseWindowRightBarH.setFill(color_rgb(0, 0, 0))

        #Door

        HouseDoor = Rectangle(Point(350, 500), Point(450, 700))
        HouseDoor.setFill(color_rgb(255, 0, 0))
        HouseDoorKnob = Circle(Point(440, 630), 5)
        HouseDoorKnob.setFill(color_rgb(0, 0, 0))

        #Chimney

        HouseChimney = Polygon(Point(550, 250), Point (550, 200), Point(600, 200), Point(600, 267))
        HouseChimney.setFill(color_rgb(0, 127, 127))

        #Additional Scenery - Smoke

        SmokeX = []
        SmokeY = []
        for i in range (1, 30):
            SmokeX.append(554 + i)
            SmokeY.append(i**2 / 3)
        for j in range (31, 80):
            SmokeX.append(554 + j)
            SmokeY.append(SmokeY[j - 1] + 100 / j)
        for k in range (79, -1, -1):
            SmokeX.append(554 + k)
            SmokeY.append(SmokeY[k] + 50)

        HouseSmoke = Polygon(SmokeX, SmokeY)
        HouseSmoke.setFill(color_rgb(255, 255, 255))

        #Drawing to Screen
        HouseBody.draw(win)
        HouseRoof.draw(win)
        HouseWindowLeft.draw(win)
        HouseWindowLeftBarV.draw(win)
        HouseWindowLeftBarH.draw(win)
        HouseWindowRight.draw(win)
        HouseWindowRightBarV.draw(win)
        HouseWindowRightBarH.draw(win)
        HouseDoor.draw(win)
        HouseDoorKnob.draw(win)
        HouseChimney.draw(win)
        HouseSmoke.draw(win)

        win.getMouse()
        win.close()

    main()

目前我也遇到了越界索引错误,尽管我可以自己解决这个问题。我现在真的很好奇如何生成点列表[],然后将它们传递给 Polygon() 以便使用 graphics.py 绘制形状。任何输入将不胜感激!

4

1 回答 1

1

您可以这样编写 Smoke 循环,将点列表作为 Polygon() 的参数传播

Smoke = []
for i in range(1, 30):
    Smoke.append(Point(554 + i, i**2 / 3))
for j in range(29, 80):
    Smoke.append(Point(554 + j, Smoke[j - 1].getY() + 100 / j))
for k in range(79, -1, -1):
    Smoke.append(Point(554 + k, Smoke[k].getY() + 50))

HouseSmoke = Polygon(*Smoke)

您的索引问题在这里:

for i in range (1, 30):
    ...
    SmokeY.append(i**2 / 3)

这会在数组 SmokeY 中创建索引位置 0 - 28(范围是 1 到 29,但数组从 0 开始)。但是下一个子句尝试访问 SmokeY 中不存在的索引位置 30(29 也不存在):

for j in range (31, 80):
    ...
    SmokeY.append(SmokeY[j - 1] + 100 / j)

您需要更加小心地计算数组索引。

于 2017-01-27T07:28:20.943 回答