2016-12-09 5 views
-4

Ich habe den folgenden Code und versuche, es kürzer zu machen. Ich habe versucht, while und for-Schleifen zu verwenden, aber es kann nicht funktionieren. Ich habe auch hier bei Stackoverflow gesucht und gefundene Aufzählungs- und Zyklusschleifen gefunden, bekomme aber immer Fehler oder weiß überhaupt nicht, was ich mache. Gibt es Möglichkeiten, dies zu verkürzen?Kann ich meinen Code mithilfe von Loops kürzer machen?

Ich sing Python 3.2 mit Pygame-kompatible Version und 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

Da Sie 16 einzelne Variablen erstellen, gibt es keine zuverlässige Möglichkeit, die Schleife zu kürzen, um den Code zu verkürzen. –

Antwort

0

Obwohl unkonventionell, kann die exec-Funktion verwendet werden, um das zu erreichen, wonach Sie suchen. (Ich bin noch nicht so gut in Python, es gibt wahrscheinlich einen besseren Weg) Ich habe einen ähnlichen Ansatz in einer Klasse, die ich geschrieben habe, verwendet. Eine Liste kann die Werte von first bis und dann die Namen der verschiedenen Rollen enthalten. Dies kann verwendet werden, um dann Ihren Code in nur wenigen Zeilen neu zu erstellen.

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] 

Ich hoffe, das beantwortet Ihre Frage.

+0

Ich konnte diese Arbeit nicht bekommen oder verstehe es nicht .... danke trotzdem –

+0

Wenn Sie eine neue Python-Datei erstellen, fügen Sie diesen Code ein und ändern Sie exec, um zu drucken, Sie sehen, wie es funktioniert –

+1

Denken Sie daran, dass die ' exec ist _ ["bedeutend langsamer als einfach normalen Python-Code aufzurufen" und es wird dringend empfohlen, es nie zu benutzen] (https://late.am/post/2012/04/30/the-exec-statement-and-a -python-mystery.html) _. Es könnte auch gefährlich sein zu verwenden, wenn es jemals Eingaben von einem Benutzer ausführen würde. Der Interpreter erkennt die Namen auch nicht, daher muss der gesamte Code im gesamten Programm ohne Hilfe der automatischen Vervollständigung gespeichert werden. Die Funktion sollte als letzter Ausweg und _ ["Sie sollten immer zuerst nach Alternativen suchen"] (http://stackoverflow.com/a/701813/6486738) _ verwendet werden. –

0

Sie könnten es verkürzen, indem Sie eine Liste von Wörterbüchern erstellen. Die Liste enthält die Spieler, bei denen Spieler Eins in der Liste zuerst und Spieler Vier zuletzt ist. Jeder Spieler ist definiert als ein Wörterbuch mit seiner Klasse, seiner Beute, seiner großen Beute und seinem Räuber.

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

Dies kann noch weiter in zwei Linien

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

Aber das könnte es zu weit treiben verkürzt werden. Es ist besser, Code zu haben, der sich über mehrere Zeilen erstreckt und lesbar ist als umgekehrt.