2017-01-24 1 views
0

私は、Python 3.6とZelleのgraphics.pyを使って家を描く簡単なプログラムに取り組んでいます。 私はエディタとしてNotepad ++を使用しています。Polygon()の引数としてgraphics.pyのListを渡すにはどうしたらいいですか?

私は自分の任務に関するすべての要件を満たしましたが、景色を追加するとボーナスマークを獲得できるという規定があります。私は当初、私が描いた家の煙突から出てくる煙を加えたいと思っていました。

私はこのような何かを見ている、ポイントのリストを作成してみました:

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]) 

これに伴う問題は、私はそう、それを追加する前に、煙の「Y」パラメータ[k]を変更したいということです私がしたように1時00 AMでこれを見ていない方は、「彼らはドンので、私の二つのリストは、(しゃれが意図した)文字通り無意味であることを認識しているだろう

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)) 

:私は2つのリストを作成することにしました2つのパラメータがあります。いずれのパラメータもNULLに設定できないので、私はこのアプローチを断念しました。

最後に、私はPolygon()がこれらを受け入れることを曖昧な希望で、Pointの代わりにちょうど番号を格納しようとしました。以来、私はgraphics.pyを開いて、Polygon()が非常に厳密な大域であることを発見し、Numberでなく、引数としてPointだけを取ります。これは参照用の完全な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() 

現在、私はおそらく自分でそれを解決することはできますが、範囲外のインデックスエラーも発生しています。私は、ポイントのリスト[]をどのように生成し、次にそれらをpolygg()に渡してgraphics.pyを使ってシェイプを描くことができるのか本当に興味があります。どんな入力をいただければ幸いですか?

答えて

1

あなたはポリゴン(引数としてのポイントのリストを広げ、あなたの煙のループをこのように書くことができます)

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) 

これは、インデックスの場所0を作成し、配列SmokeYで28(範囲は1〜29ですが、配列は0から始まります)。しかし、次の句が存在しないスモーキーでインデックス位置30にアクセスしようとします(また29を行います):

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

あなたの配列インデックスを占め、より注意する必要があります。

関連する問題