2016-12-09 134 views
-4

我有下面的代碼,並試圖縮短它。我試過使用while和for循環,但不能使它工作。我也在這裏搜索了Stackoverflow,發現了枚舉和循環循環,但不斷髮現錯誤或者一般不知道我在做什麼。有什麼方法可以縮短這個嗎?我可以使用循環縮短我的代碼嗎?

我唱python 3.2 pygame兼容版本和idlex。

players = [npc1,npc2,npc3,human] # these are classes 

# sets new order of players after being mixed 
first_player = players[0] 
second_player = players[1] 
third_player = players[2] 
fourth_player = players[3] 

# sets players prey...goes one ahead in the index, wrap around at end 
first_players_prey = players[1] 
second_players_prey = players[2] 
third_players_prey = players[3] 
fourth_players_prey = players[0] 

# sets players predator, goes back one in the index, wrap around 
first_players_predator = players[3] 
second_players_predator = players[0] 
third_players_predator = players[1] 
fourth_players_predator = players[2] 

# sets players grand prey/predator while only 4 players, goes 2 ahead/back in index, wrap around 
first_players_grand_prey_predator = players[2] 
second_players_grand_prey_predator = players[3] 
third_players_grand_prey_predator = players[0] 
fourth_players_grand_prey_predator = players[1] 
+1

當你創建16個單獨的變量時,沒有可靠的方法可以循環縮短代碼。 –

回答

0

儘管非常規,exec函數可以用來完成你以後的事情。 (我還不太擅長Python,可能有更好的方法)我在我寫的一個類中使用了類似的方法。列表可以保存first的值,但可以保存到fourth,然後是不同角色的名稱。這可以用來在幾行內重新創建你的代碼。

numbers = ['first', 'second', 'third', 'fourth'] 
roles = ['', '_prey', '_predator', '_grand_prey_predator'] 
values = [0, 1, 2, 3] 

for i in range(4): 
    for j in range(4): 
     exec(numbers[j] + '_player' + roles[i] + ' = players[' + str(values[j]) + ']') 
    values = values[1:4] + values[:1] 

我希望這能回答你的問題。

+0

我無法得到這項工作或不明白它....感謝反正 –

+0

如果你創建一個新的python文件,粘貼這個代碼並更改exec打印你會看到它是如何工作的 –

+1

請記住,使用' exec'是_ [「比簡單地調用常規Python代碼慢得多」,並強烈要求你永遠不要使用它)(https://late.am/post/2012/04/30/the-exec-statement-and-a -python-mystery.html)_。如果它曾經執行過來自用戶的輸入,它也可能是危險的。解釋器不會檢測到名稱,因此所有代碼都必須在整個程序中記住,而不需要自動完成。該函數應該用作最後的手段,並且_ [「您應該總是首先查看替代方法」](http://stackoverflow.com/a/701813/6486738)_。 –

0

您可以通過創建詞典列表來縮短它。該列表包含玩家第一名在列表中的玩家,第四名玩家爲最後一名玩家。每個玩家被定義爲一個字典,其類別,獵物,大獵物和捕食者。

classes = ['npc1', 'npc2', 'npc3', 'human'] # These are classes 
players = [] 
for i in range(4): 
    players.append(
     { 
      'class': classes[i], 
      'prey': classes[(i + 1) % 4], 
      'grand prey': classes[(i + 2) % 4], 
      'predator': classes[(i + 3) % 4] 
     } 
    ) 

這甚至可以進一步縮短到兩路

classes = ['npc1', 'npc2', 'npc3', 'human'] # these are classes 
players = [{'class': classes[i], 'prey': classes[(i + 1) % 4], 'grand prey': classes[(i + 2) % 4], 'predator': classes[(i + 3) % 4]} for i in range(4)] 

但可能是將其推至遠。最好是將代碼延伸到多行,並且可讀性比反之亦然。