2016-12-07 233 views
-2

我目前正在完成大學作業。我們在第一學期一直在使用John Zelle的graphics.py模塊。需要重構此功能的幫助

任務是構造兩種不同的圖案,然後將它們放置在特定設計中,根據窗口是否爲500 x 500, 700 x 700 or 900 x 900像素自動調整。

我已經完成了任務,但是,我的代碼的一大部分效率很低,很長,因此這並不理想。

下面是長且效率低下的代碼:

def DrawPattern(width,size,win,colour): 

    if size == 5: 
     for x in range(0,width,100): 
      drawCircleExpanse(win,x,400,colour) 
     for j in range(100,400,100): 
      drawCircleExpanse(win,j,300,colour) 
     drawCircleExpanse(win,200,200,colour) 
     for j in range(100,400,100): 
      drawCircleExpanse(win,j,100,colour) 
     for x in range(0,width,100): 
      drawCircleExpanse(win,x,0,colour) 
    if size == 7: 
     for x in range(0,width,100): 
      drawCircleExpanse(win,x,width-100,colour) 
     for j in range(100,width-100,100): 
      drawCircleExpanse(win,j,width-200,colour) 
     for i in range(200,width-200,100): 
      drawCircleExpanse(win,i,width-300,colour)   
     drawCircleExpanse(win,300,300,colour) 
     for j in range(100,width-100,100): 
      drawCircleExpanse(win,j,100,colour) 
     for x in range(0,width,100): 
      drawCircleExpanse(win,x,0,colour) 
     for i in range(200,width-200,100): 
      drawCircleExpanse(win,i,width-500,colour) 
    if size == 9: 
     for x in range(0,width,100): 
      drawCircleExpanse(win,x,width-100,colour) 
     for j in range(100,width-100,100): 
      drawCircleExpanse(win,j,width-200,colour) 
     for i in range(200,width-200,100): 
      drawCircleExpanse(win,i,width-300,colour) 
     for y in range(300,width-300,100): 
      drawCircleExpanse(win,y,width-400,colour) 
     drawCircleExpanse(win,400,400,colour) 
     for j in range(100,width-100,100): 
      drawCircleExpanse(win,j,100,colour) 
     for x in range(0,width,100): 
      drawCircleExpanse(win,x,0,colour) 
     for i in range(200,width-200,100): 
      drawCircleExpanse(win,i,width-700,colour) 
     for y in range(300,width-300,100): 
      drawCircleExpanse(win,y,width-600,colour) 

size變量取用戶的輸入;例如5, 7 or 9。這轉換爲500 x 500, 700 x 700 or 900 x 900。與colour類似,它只會將顏色更改爲用戶選擇的顏色之一。

此代碼,將產生以下的圖案,與所述尺寸5其轉換爲500 x 500

Pattern

drawCircleExpanse功能,它構造圖案本身,包含以下代碼:

def drawCircleExpanse(win,x,y,colour): 
    rad = 50 
    for c in range(10): 
     circle = Circle(Point(50+x,(50+(c * 10)/2)+y), rad) 
     circle.setOutline(colour) 
     circle.draw(win) 
     rad -= 5 

如果有人能夠幫助縮短我的大量代碼塊,我將不勝感激。

+3

我不確定這種類型的問題是關於這裏的主題。我以前從來沒有問過這個SE,但是也許codereview SE是問這樣一個問題的好地方?在發佈之前,我會仔細檢查那裏的主題指南,但感覺這可能更適合那裏。 – Lexi

回答

1

我同意,這可能是對代碼審查更適合,但有兩個想法,可以幫助你:

  • 對於size每個值,行數(循環)之前和中心後-element drawCircleExpansefloor(size/2)。既然你可以計算行數,你可以使用另一個循環來嵌套行循環。在中心元素draw...調用之前和之後使用嵌套循環意味着您可以完全擺脫if陳述。
  • 爲了使代碼更容易閱讀,我實際上將100的因子移動到drawCircleExpanse,以便drawCircleExpanse的座標位於虛擬網格上而不是屏幕像素上。如果需要,本地化網格到像素的轉換還可以讓您更靈活地在以後更改該轉換。
0

你爲什麼不讓計算機爲你做數學?對於size == 5,這是在重構第一遍:

x_list = range(0, 500, 100) + \ 
     range(100, 400, 100) + \ 
     [200] + \ 
     range(100, 400, 100) + \ 
     range(0, 500, 100) 

y_list = [400] * 5 + \ 
     [300] * 3 + \ 
     [200] + \ 
     [100] * 3 + \ 
     [0] * 5 

def drawCircleExpanse(win, x, y, colour): 
    print "%3d, %3d" % (x, y) 

win = None 
colour = None 
for x, y in zip(x_list, y_list): 
    drawCircleExpanse(win, x, y, colour) 

輸出

0, 400 
100, 400 
200, 400 
300, 400 
400, 400 
100, 300 
200, 300 
300, 300 
200, 200 
100, 100 
200, 100 
300, 100 
    0, 0 
100, 0 
200, 0 
300, 0 
400, 0 

您應該能夠通過使用size創建x_listy_list進一步重構這個。

0

如果有人能幫助縮短我的 大量代碼塊,我將不勝感激。

這是足夠短:

from graphics import * 

RADIUS = 50 
NUMBER_CIRCLES = 10 
DECREMENT = RADIUS // NUMBER_CIRCLES 

def drawCircleExpanse(win, x, y, colour): 
    for radius in range(RADIUS, 0, -DECREMENT): 
     circle = Circle(Point(RADIUS + x, (2 * RADIUS - radius) + y), radius) 
     circle.setOutline(colour) 
     circle.draw(win) 

def DrawPattern(width, size, win, colour): 
    for y in range(size, 0, -2): # 5 3 1 
     for x in range(width // 2 - y * RADIUS, width // 2 + y * RADIUS, RADIUS * 2): 
      drawCircleExpanse(win, x, width // 2 - y * RADIUS, colour) 
      if y > 1: 
       drawCircleExpanse(win, x, width // 2 + (y - 2) * RADIUS, colour) 

win = GraphWin("Optimize Drawing", 700, 700) 

DrawPattern(700, 7, win, "red") 

win.getMouse() 

win.close() 

我想你使它遠遠超過必要更加複雜。以上也應該適用於'3'(和300)以及可能超過5的其他值。7 & 9.我留給你的輕微窗口邊界(鉻)寬度有一點問題。

enter image description here