Bamba hat geschrieben:Also hier noch mal der Code:
Da fehlt wie schon jemand bemerkt hat die `menue()`-Funktion. Ich sehe auch gar nicht wie das als Programm überhaupt irgendetwas macht weil der Teil in der ``if __name__ ...`` Abfrage nur die beiden Listen mit Kämpfern erstellt.
Code: Alles auswählen
def nSoldatLevel1():
k=Fighter(3,1)
Liste1.append(k)
print Liste1
menue()
Hier fehlt vollkommen die Information wo `Liste1` herkommt. Damit das hier funktioniert muss die irgendwo auf Modulebene mal definiert worden sein. Das ist aber furchtbar unübersichtlich, darum macht man so etwas nicht. Auf Modulebene sollten soweit wie möglich nur Konstanten definiert werden. Alles andere sollte in spezifischeren Namensräumen stecken und Werte sollten Funktionen über Argumente betreten und als Rückgabewerte verlassen. Dann lässt sich ein Programm viel einfacher nachvollziehen und verstehen.
Wenn man mal den Aufruf von `menue()` weglässt, dann kann man den Aufruf dieser Funktion auch einfach durch ein ``Liste1.append(Fighter(3, 1))`` ersetzen. Das ist ein bischen zu einfach um extra einen Namen dafür zu vergeben. IMHO.
Code: Alles auswählen
def verteilen():
print len(Liste1),"Kaempfer stehen zur Verfuegung"
Wahl=input("Wahl: ")
team_b.extend(Liste1[0:Wahl])
Hier auch wieder: `Liste1` und `team_b` sollten als Argumente in die Funktion kommen. Dann lässt sich diese Funktion auch für beide Teams verwenden.
Wie man die dann aus `Liste1` löscht solltest Du aber eigentlich schon selbst können.
Code: Alles auswählen
def filter_dead_fighters(fighters):
return [fighter for fighter in fighters if not fighter.is_dead()]
def fight(team_a, team_b):
for fighter_a, fighter_b in zip(team_a, team_b):
fighter_a.life -= fighter_b.damage
fighter_b.life -= fighter_a.damage
return map(filter_dead_fighters, (team_a, team_b))
def main():
while team_a and team_b:
print 'A:', team_a
print 'B:', team_b
print '-' * 20
team_a, team_b = fight(team_a, team_b)
if team_a:
winner_name = 'A'
winner_team = team_a
else:
winner_name = 'B'
winner_team = team_b
print 'Winner is %s: %r' % (winner_name, winner_team)
if __name__ == '__main__':
global team_a
team_a = [Fighter(life, damage)
for (life, damage) in ((2,1), (3, 1), (3, 1))]
global team_b
team_b = [Fighter(life, damage)
for (life, damage) in ((3,1), (4, 1), (4, 1))]
Das ``global``, dessen blosse Existenz Du am besten sofort komplett vergisst, hat an dieser Stelle keine Wirkung. Das macht nur innerhalb von Funktionen Sinn.
Zu der Namensgebung: Ich ging beim ersten Versuch ja davon aus, das in `fight()` der komplette Kampf bis zum bitteren Ende abgewickelt wird. Von den jetzt implementierten Kampfregeln wäre der Name `fight()` für die `main()` passender und die alte `fight()` würde eher `round()` heissen.