2017-06-01 21 views
0

這是我現在擁有的。簡而言之,它的目的是一個更大的程序的一部分,將僞代碼變成遊戲板。Python 3.6 - 我需要IDEAS來優化這段代碼,並使其更清潔

FIRST_LAYER_CODE = [] # This is where the psuedocode goes. 

def irrelevant_name(tilesMade, xCoordinate, yCoordinate): 
    # There is some other stuff in this function, but it is not relevant to the question. 
    elif FIRST_LAYER_CODE[tilesMade][0:3] == "BLC": 
     for i in range(2): 
      for j in [0, (1/3), (2/3)]: 
       Rectangle(Point(xCoordinate + j, yCoordinate + j), Point(xCoordinate + j + (1/3) + (i * (1 - (j + (1/3)))), yCoordinate + 1 - (i * ((2/3) - j)))).draw(window) 
    elif FIRST_LAYER_CODE[tilesMade][0:3] == "BRC": 
     for i in range(2): 
      for j in [1, (2/3), (1/3)]: 
       Rectangle(Point(xCoordinate + j, yCoordinate + 1 - j), Point(xCoordinate + j - (1/3) - (i * (j - (1/3))), yCoordinate + 1 - (i * (j - (1/3))))).draw(window) 
    elif FIRST_LAYER_CODE[tilesMade][0:3] == "TLC": 
     for i in range(2): 
      for j in [0, (1/3), (2/3)]: 
       Rectangle(Point(xCoordinate + j, yCoordinate + 1 - j), Point(xCoordinate + j + (1/3) + (i * (1 - (j + (1/3)))), yCoordinate + (i * ((2/3) - j)))).draw(window) 
    elif FIRST_LAYER_CODE[tilesMade][0:3] == "TRC": 
     for i in range(2): 
      for j in [1, (2/3), (1/3)]: 
       Rectangle(Point(xCoordinate + j, yCoordinate + j), Point(xCoordinate + j - (1/3) - (i * (j - (1/3))), yCoordinate + (i * (j - (1/3))))).draw(window) 

此代碼按預期工作,但我總是看到人們有更多的時尚代碼,更重要的是更好的優化代碼。我可以做些什麼來簡化這段代碼?我不問你給我任何代碼!我只是想要優化這個代碼,因爲我是新編程! (帽子並不是一個意思,但我不想讓別人說我只是在問代碼。)

現在我知道我得到的第一個建議是for循環看起來是重複的,而我應該創建一個新的函數,其中包含for循環並創建矩形,但問題在於使每個循環的新矩形不同的部分,並且我不能通過諸如(1 - j)的參數,因爲j不會尚未申報。

我一直在想這個問題,而且一無所獲。我只需要創意,當然還有謝謝!您複製FIRST_LAYER_CODE[tilesMade][0:3]這裏

回答

2

主要是刪除重複

  1. 。你可以在這裏創建一個局部變量

  2. 由於你總是想要for i in range(2),所以你重構了一個關卡並在循環體內執行ifs。

  3. 下一件重複的東西是for j in [0, (1/3), (2/3)]: ... Rectangle(Point(xCoordinate + j, yCoordinate + ...的東西。這些行中唯一真正改變的是第一個列表項(0表示「BLC」,1表示「BRC」等)以及您從座標中添加/減去的東西。而不是重複每個塊的for j in (...Rectangle(Point..)東西,只需修改隨後使用的局部變量。

    def irrelevant(): 
        letters = FIRST_LAYER_CODE[tilesMade][0:3] == "BLC" 
        offsets = [] 
        if letters == "BLC" 
         offsets = [0, 1/3, 2/3, 0,0, 1/3, -1, ...] 
        elif letters = "BRC" 
         offsets = [1, 2/3, 1/3, 1, ...] 
        for i in range(2): 
         for j in [offsets[0], offsets[1], offsets[2]]: 
          Rectangle(Point(x + offsets[3])...draw() 
    

    offsets是添加數字/乘以你在Point數學和你for j循環使用。

    你可以採取的事實1 - j = 1 + (-1)*j1 + j = 1 + (1)*j基本上總是做加法的優勢只使用1或-1作爲的「J倍增器」。

    雖然這會很快難以跟蹤,所以您可能希望使用命名項目詞典來保持偏移值清晰。

    offsets = { 'topleft': 1, .... } 
    ... 
    
  4. 變本加厲,您可以定義基於3個字母鍵和商店的字典裏偏移值。

    offsets = {'BLC': { 'topleft': 1, ... }, 'BRC': } 
    

    這可以讓你避免ifs,而只是做一個字典查找。有了這個方法,你的方法大概需要3行加上你需要代表的「控制」數據(offsets)。

希望我已經給你留下了很多想法,希望這是有幫助和明確的。

+0

這確實是一個很好的迴應。非常感謝你,我正在努力實現這一目標。 –