Tagebuch-Eintrag #26
Python-Monster-Game optimiert
Es war eine arbeitsreiche Woche, so dass ich nicht viel dazu gekommen bin mich intensiv mit Python zu beschäftigen.
Dennoch habe ich mir Gedanken über das Python-Monster-Game gemacht und mir kam die Idee, dass es doch besser ist die Lebenspunkte des Spielers farblich darzustellen – so wie man es bei Spielen im Allgemeinen kennt.
Dabei richte ich mich an den bekannten Ampelfarben:
- Grün für gute Gesundheit
- Gelb für mittlere Gesundheit
- Rot für wenig Gesundheit
Textfarben im Terminal
Die Idee war da. Allerdings wusste ich natürlich noch nicht, wie ich das umsetzen sollte. Also schnell mal Google gefragt und natürlich war die Frage nicht neu und viele hatten auch danach gesucht.
Und natürlich gibt es dafür Lösungen.
Colorama und Termcolor
Ich habe Colorama und Termcolor verwendet.
Colorama war bei meiner Python 3.8.0 Installation bereits in der Version 0.4.1 installiert. Und zugleich kam auch der Hinweis, dass es für pip auch eine aktuellere Version gibt und wie diese installiert werden kann.

python -m pip install --upgrade pip
Nach der Aktualisierung habe ich dann die aktuellste Version von Colorama 0.4.3 installiert. Dies kann einfach über das Terminal mit dem folgenden Befehl durchgeführt werden:
pip install colorama==0.4.3

Danach wird die Version 0.4.1 entfernt und die neue Version installiert.
Termcolor musste ich komplett installieren, weil es nicht vorinstalliert war. Der Befehlt dazu lautet:
pip install termcolor
Nach der Installation musste ich diese Module nur noch in meinem Python-Monster-Game importieren um diese anzuwenden. Glücklicherweise ist alles gut beschrieben bei Colorama.
# Colorama importieren
from colorama import init
# Termcolor importieren
from termcolor import colored
# Colorama initialisieren unter Windows
init()
Um einen Text in einer Farbe auszugeben, muss es in der Funktion colored geschrieben werden. Auch Hintergrundfarbe ist möglich. Somit wird es etwas bunter 😉
print(colored("Dieser Text ist Blau", "blue"))
print(colored("Dieser Text ist Grün", "green"))
print(colored("Dieser Text ist Gelb mit rotem Hintergrund", "yellow", "on_red"))
print("Dieser Text ist normal")

Hauptprogramm anpassen
Jetzt muss ich nun mein Python-Monster-Game anpassen.
Ich habe mir vorgenommen, wenn die Gesundheit mehr als 70 ist, soll die Zahl grün sein. Ist die Gesundheit 69 bis 35, soll die Zahl gelb sein und darunter rot.
Am einfachsten realisiere ich das mit if-elif-else-Abfrage und mein Code dazu sieht so aus:
if player["health"] >= 70:
print(player["name"], "hat nur noch", colored(player["health"], "green"), "Leben")
elif player["health"] <= 69 and player["health"] >= 35:
print(player["name"], "hat nur noch", colored(player["health"], "yellow"), "Leben")
else:
print(player["name"], "hat nur noch", colored(player["health"], "red"), "Leben")
Diesen Code habe ich an drei Stellen im Hauptprogramm eingefügt. Einmal bei Choise 1, wenn der Spieler angegriffen wurde. Dann bei Choise 2, wenn der Spieler sich heilt und das Monster den Spieler angegriffen hat.

Als ich mit dem Code fertig war, dachte ich „verdammt“. Ich kann es doch als Funktion schreiben und dann immer nur die Funktion ausgeben. Für den Fall, dass ich die Farben oder Lebenspunkt der Farben ändern will, muss ich es nur einmal ändern.
Also dann, gesagt, getan. Und das ist nun die Funktion dafür, welches ich nach dem Import von colorama und termcolor definieren.:
def players_health():
# Lebenspunkt farblich ausgegben - Darauf eine Funktion basteln
if player["health"] >= 70:
print(player["name"], "hat nur noch", colored(player["health"], "green"), "Leben")
elif player["health"] <= 69 and player["health"] >= 35:
print(player["name"], "hat nur noch", colored(player["health"], "yellow"), "Leben")
else:
print(player["name"], "hat nur noch", colored(player["health"], "red"), "Leben")
Anschließend muss ich nur noch die Funktion im Hauptprogramm an den passenden Stellen mit players_health() ausgeben. Der komplette Code mit diesen kleinen Details sieht nun so aus:
import random
# Colorama und Termcolor Modul importieren
from colorama import init
from termcolor import colored
# init() - Use Colorama to make Termcolor work on Windows too
init()
def divider():
print("---" * 8)
def monster_attack_range(attack_min, attack_max):
return random.randint(attack_min, attack_max)
def players_health():
# Lebenspunkt farblich ausgegben - Darauf eine Funktion basteln
if player["health"] >= 70:
print(player["name"], "hat nur noch", colored(player["health"], "green"), "Leben")
elif player["health"] <= 69 and player["health"] >= 35:
print(player["name"], "hat nur noch", colored(player["health"], "yellow"), "Leben")
else:
print(player["name"], "hat nur noch", colored(player["health"], "red"), "Leben")
def save_result():
player_result = {"name": player["name"], "rounds": counter, "health": player["health"]}
game_result_list.append(player_result)
# Ergebnisse werden in der Datei scoreboard.txt gespeichert.
scoreboard_file = open("scoreboard.txt", "a")
scoreboard_file.write(str(player_result))
scoreboard_file.write("\n")
scoreboard_file.close()
# Spielergebnisse werdem am Ende dieser Liste hinzugefügt.
game_result_list = []
game_running = True
while game_running == True:
# Grundeinstellungen für Spieler und Monster
# Charaktere mit Eigenschaften als Dictionaries erstellen
player = {"name": "Player One", "attack":13, "heal": 12, "health": 100}
monster = {"name": "Zombie", "attack_min": 10, "attack_max": 20, "health": 100}
# Spieler kann seinen Namen eingeben
player["name"] = input("Spieler-Name eingeben: ")
counter = 0
next_round = True
# Runde startet
while next_round == True:
# Spieler wählt die Aktion
print("Was möchtest du tun?")
print("1) Angreifen")
print("2) Heilen")
print("3) Spiel beenden")
print("4) Ergebnisse")
option = input("Zahl eingeben: ")
print("===" * 8)
try:
# Aktionen nach Auswahl
choice = int(option)
if choice == 1:
print("---", player["name"].upper(), "ist am Zug ---".upper())
print(player["name"], "greift an und zieht", monster["health"], "von", monster["name"], "ab")
monster["health"] = monster["health"] - player["attack"]
print(monster["name"], "hat nur noch", monster["health"], "Leben")
print("---", monster["name"].upper(), "ist am Zug ---".upper())
print(monster["name"], "greift an und zieht", player["health"], "von", player["name"], "ab")
player["health"] = player["health"] - monster_attack_range(monster["attack_min"], monster["attack_max"])
# Lebenspunkt farblich ausgegben
players_health()
# Trenner
divider()
# Erfassen der Spielzüge
counter = counter + 1
print("### Spielzug: ", counter)
divider()
elif choice == 2:
print("---", player["name"].upper(), "ist am Zug ---".upper())
print(player["name"], "heilt sich.")
player["health"] = player["health"] + player ["heal"]
# Lebenspunkt farblich ausgegben
players_health()
print("---", monster["name"].upper(), "ist am Zug ---".upper())
print(monster["name"], "greift an:")
player["health"] = player["health"] - monster_attack_range(monster["attack_min"], monster["attack_max"])
# Lebenspunkt farblich ausgegben
players_health()
# Trenner
divider()
# Erfassen der Spielzüge
counter = counter + 1
print("### Spielzug: ", counter)
divider()
elif choice == 3:
next_round = False
print("Spiel vorzeitig von", player["name"], "beendet.")
elif choice == 4:
# Ich habe für Ausgabe der Ergebnisse eine if-Abfrage eingebaut.
if not game_result_list:
print("Keine Ergebnisse vorhanden.")
divider()
else:
print("Ergebnisse der bisherigen Spiele.")
game_number = 0
for result in game_result_list:
game_number += 1
# print ("Spiel #", "{:03d}".format(game_number) + ":", "Spieler:", result["name"], "|", "Gesundheit:", result["health"], "|", "Spielzüge:", result["rounds"])
print ("Spiel #" + f"{game_number:04d}" + ":", "Spieler:", result["name"], "|", "Gesundheit:", result["health"], "|", "Spielzüge:", result["rounds"])
divider()
# Ergebnisse aus der Datei scoreboards.txt laden
scoreboard_file = open("scoreboard.txt", "r")
for score in scoreboard_file.readlines():
print("#", score)
scoreboard_file.close()
except:
print("Ungültige Eingabe. Bitte wiederholen")
continue
# Spiel beenden, wenn Spieler oder Monster kein Leben mehr haben
if monster["health"] <= 0:
print(player["name"].upper(), "hat", monster["name"], "besiegt und das Spiel gewonnnen.")
print("Spielzüge: ", counter)
save_result()
next_round = False
elif player["health"] <= 0:
print(monster["name"].upper(), "hat", player["name"], "besiegt und das Spiel gewonnen.")
print("Spielzüge: ", counter)
# Um die Ergebnisse abzuspeicher und in meiner game_result_list hinzuzufügen,
# habe ich eine Funktion dafür gebaut.
save_result()
next_round = False
So macht das Spiel ein bisschen mehr Spaß und daraus ergeben sich viele Möglichkeiten eine Ausgabe vom Programmcode visuell besser zu erfassen. Den Trenner für die Spielzüge (Funktion divider) kann ich z.B. auch farblich hervorheben 😉 Zum Vergleich ist der Code von der ersten Version im vorherigen Tagebuch-Eintrag zu finden: Tagebuch-Eintrag #25 | Python-Monster-Game