2016-12-09 6 views
-4

私は以下のコードを持っており、それをもっと短くしようとしています。 whileループとforループを使ってみましたが、動作させることはできません。私もここでStackoverflowを検索し、列挙とサイクルループを見つけましたが、エラーを取得し続けるか、一般的に私がやっていることを知らない。これを短縮する方法はありますか?コードをループを使って短くすることはできますか?

私はpygame互換バージョンとidlexでpython 3.2を歌います。

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

辞書のリストを作成することで短縮できます。リストには、プレイヤー1が最初にリストにあり、プレーヤー4が最後にいるプレイヤーが含まれています。各プレイヤーは、クラス、獲物、壮大な獲物と捕食者を持つ辞書として定義されています。

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

にさらに短縮することができますしかし、それははるかにそれをプッシュするかもしれません。コードを複数の行にまたがって読み込み可能な方が良いでしょう。

関連する問題