Tagebuch-Eintrag #25
Python-Monster-Game
Nach wie vor dreht sich bei mir viel um Python. Nach dem ich meinem Schreibtisch aufgeräumt und Dokumente in die neuen Ablagen gepackt hatte, sah mein Schreibtisch nun viel ordentlicher aus – und einen Tage später sieht es immer noch so ordentlich aus – war nicht immer so 😉
Ein ordentlicher Arbeitsplatz/Schreibtisch ist auch nicht ganz unwichtig.
Nun zum Python. Ich durchstöberte am Freitag Youtube zum Thema Python und fand das Tutortial Python Tutorial for Beginners – Crash Course 2019 | Build a Game with Python. Ich habe es mir dann übers Wochenende komplett angeschaut und hatte den Eindruck, dass es überwiegend die Funktionen von Python einsetzt, was ich bisher gelernt habe. Also nahm ich mir für den Sonntag vor es nachzubauen – möglichst ohne viel nachzugucken. Natürlich geht es noch nicht komplett auswendig. Es braucht noch seine Zeit.
Mein Monster Game
Wie dem auch sei. Das Monster Game verwendet while-Schleifen, for-Schleifen, if-else-Answeisungungen, Listen, Dictionaries und Funktionen. Genau das richtige für mich jetzt das erlernte zu kombinieren.
Aber ich wollte auch nicht den Code aus dem Tutorial abtippen. Das ist nicht meine Art und ich glaube, dass der Lerneffekt für mich sehr gering ist. Also schrieb ich meinen eigenen Code – auch wenn diese zum Teil identisch ist – im großen habe ich viel selbst geschrieben und meinen eigenen Stil – sofern ich das schon haben sollte – eingebracht.
Mein vollständiger Code zum Monster Game:
# Charaktere mit Eigenschaften als Dictionaries erstellen
import random
def divider():
print("---" * 8)
def monster_attack_range(attack_min, attack_max):
return random.randint(attack_min, attack_max)
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
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"])
print(player["name"], "hat nur noch", player["health"], "Leben")
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"]
print("Neue Gesundheit: " + str(player["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"])
print(player["name"], "hat nur noch", player["health"], "Leben")
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 #" + 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
Als Vergleich ist hier der Code aus dem Tutorial vom Github des Autors: game.py
Mir ging es in erster Linie darum ein funktionierendes Programm zu schreiben und nicht, dass der Programm-Code so kurz wie möglich sein soll. Ich denke, dass ich dafür noch nicht die notwendige Erfahrung und/oder Wissen zu Python habe.
Neue Funktionen im Monster Game
Dennoch habe ich in meinem Programm-Code kleine Funktionen integriert, die es im Original nicht gibt – was auch kein Vorwurf ist an das Tutorial.
Ich wollte mit meinem Monster Game nicht nur das bisherige Wissen anwenden, sondern auch neue Funktionen (kennen) lernen.
Ich habe zum Beispiel einen try / except Abfrage eingebaut, welches prüft ob die eingegebenen Optionen auch wirklich eine Zahl ist. Siehe Zeile 36 und 88. Außerdem noch f-String verwendet – wenn auch an anderer Stellt, als im ursprünglichen Tutorial. Ich habe es für vorangestellte Nullen (0) für Spiel-Nummer verwendet. Siehe Zeile 80.
Für die Ausgabe der Ergebnisse (Option 4) habe ich die Daten aus dem Dictionary aufgesplittet und einzeln in einem Satz ausgegeben.

Datei schreiben und lesen
Ebenfalls zu den Spielergebnissen habe ich neu gelernt, wie ich Daten in einer externen Datei schreibe und wieder auslese. Der Hintergrund ist, dass beim ursprünglichen Spiel, die Ergebnisse gelöscht werden, sobald das Programm beendet wird.
Das Schreiben der Datei wird in der Funktion save_result() ausgeführt und immer am Ende das neue Ergebnis hinzugefügt. Zeile 11 bis 14. Und ausgelesen werden die Daten aus der Datei in den Zeilen 83 bis 86.
Mit der Speicherung der Ergebnisse in einer externen Datei, können alle bisherigen Ergebnisse angezeigt werden.

Das Problem ist aktuell noch, dass die Dictionaries in der externen Datei einfach als String ausgeben werden. Das muss ich mir noch näher anschauen, wie ich die Ausgabe wie aus dem Programm hinbekomme.
Ich werde später einen separaten Tagebuch-Eintrag für Dateien lesen und schreiben machen. Wenn ich das obige Problem gelöst habe.
Alles in allem habe ich vielleicht 3 oder 4 Stunden daran gesessen und 4 große Tassen Kaffee getrunken. Just in diesem Moment, trinke ich meine 5. Tasse Kaffee.
Alles in Allem bin ich wieder etwas voran gekommen.
Ende für Heute.