Mein erstes Spiel

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Moon
User
Beiträge: 33
Registriert: Mittwoch 20. Dezember 2017, 15:21

Mein erstes Spiel

Beitragvon Moon » Samstag 13. Januar 2018, 13:34

Hey,

ich habe mal Schere Stein Papier programmiert. Wie findet ihr denn den Code dazu? Habt ihr für mich noch Verbesserungsvorschläge?

Mein Code:
  1. # 1. Spiel: Schere Stein Papier
  2. # Wir benötigen die Bibliothek random . Diese muss zuerst importiert werden
  3.  
  4. import random
  5.  
  6. # 2. Spielanzeige
  7. print("Spiel1: Schere | Stein | Papier\n\n")
  8.  
  9. # 3. Figuren festlegen als liste
  10. spielfiguren = ("Schere", "Stein", "Papier")
  11.             #index = 0, 1, 2
  12.  
  13. #4. playing_game als Boolean auf True setzen
  14. playing_game = True
  15.  
  16. # 5. while schleife welche solange playing_game true ist das Spiel ausführt
  17. while playing_game:
  18.    
  19.     figur = 0
  20.  
  21.     #6. Playerfigur dem User auswählen lassen
  22.     while figur not in (1,2,3):
  23.         print("Wählen Sie bitte eine der folgenden Figuren aus:")
  24.         figur = int(input("[1] Schere | [2] Stein | [3] Papier"))
  25.  
  26.     # 7. Spielfiguren haben den Index 0 = Schere, 1 = Stein, 2 = Papier. Aus diesem Grund muss von der Eingabe 1 abgezogen werden, da sonst 1 Stein wäre, ...
  27.     player_figur = spielfiguren[figur-1]
  28.  
  29.     # 8. Computerfigur festlegen. Dies erfolgt durch random und der function randint. Die function randint gibt einen zufälligen Integer zurück.
  30.     #   Computer kann nur Figuren auswählen welche den index 0-2 haben.
  31.     # Hier wird eine zufällige Ganzzahl zwischen 0 und 2 ausgewählt
  32.     computer_figur = spielfiguren[random.randint(0,2)]
  33.  
  34.     #****Spiellogik***
  35.  
  36.     # 9. Überprüfen ob der player die selbe Zahl wie der Computer ausgewählt hat, wenn ja Ausgabe, dass dies der Fall ist
  37.     if player_figur == computer_figur:
  38.         print("Sie haben die gleiche Figur wie der Computer ausgewählt. Bitte wählen sie nochmals eine Figur aus. Vielen Dank.")
  39.     else:
  40.  
  41.         # 10. Gewinner festlegen
  42.         # da wir nur 3 Figuren haben und schon 2 zur Überprüfung verwenden, benötigen wir nurnoch ein else, da nurnoch 1ne Figur zur Überprüfung vorhanden ist
  43.  
  44.         if player_figur == "Schere":
  45.             if computer_figur == "Stein":
  46.                 print("Sie haben diese Runde leider verloren. Sie wählten die Figur {} und der Computer die Figur {}".format(player_figur, computer_figur))
  47.             else:
  48.                 print("Sie haben diese Runde gewonnen. Sie wählten die Figur {} und der Computer die Figur {}".format(player_figur, computer_figur))
  49.  
  50.         if player_figur == "Stein":
  51.             if computer_figur == "Schere":
  52.                 print("Sie haben diese Runde gewonnen. Sie wählten die Figur {} und der Computer die Figur {}".format(player_figur, computer_figur))
  53.             else:
  54.                 print("Sie haben diese Runde leider verloren. Sie wählten die Figur {} und der Computer die Figur {}".format(player_figur, computer_figur))
  55.        
  56.         if player_figur == "Papier":
  57.             if computer_figur == "Schere":
  58.                 print("Sie haben diese Runde leider verloren. Sie wählten die Figur {} und der Computer die Figur {}".format(player_figur, computer_figur))
  59.             else:
  60.                 print("Sie haben diese Runde gewonnen. Sie wählten die Figur {} und der Computer die Figur {}".format(player_figur, computer_figur))
  61.            
  62.  
  63.         #11. Spiel ist fertig. Nachfragen ob der User nochmal spielen möchte oder nicht
  64.         play_again = ""
  65.         while play_again not in ("yes", "no"):
  66.             play_again = input("Möchten sie das Spiel wiederholen? [y]yes [n]no")
  67.  
  68.         #12. Überprüfung ob play_again no beinhaltet, wenn ja die variable playing_game auf False setzen
  69.         if play_again == "no":
  70.             playing_game = False    
Benutzeravatar
pixewakb
User
Beiträge: 868
Registriert: Sonntag 24. April 2011, 19:43

Re: Mein erstes Spiel

Beitragvon pixewakb » Samstag 13. Januar 2018, 14:27

Ohne es zu testen, glaube ich nicht, dass das Spiel viel Freude macht, weil du andere Eingaben haben willst, als du prüfst. Ferner sollte mehr in Funktionen ausgelagert werden und könnte dann m. E. auch gestrafft werden.
Sirius3
User
Beiträge: 6884
Registriert: Sonntag 21. Oktober 2012, 17:20

Re: Mein erstes Spiel

Beitragvon Sirius3 » Samstag 13. Januar 2018, 16:59

@Moon: alle Kommentare kommentieren nur das offensichtliche. Kommentare sollten beschreiben, warum etwas gemacht wird, nicht was. »spielfiguren« ist eigentliche eine Liste, von gleichartigen Elementen. Die while-Schleife sollte eine while-True-Schleife sein, die man einfach per »break« verlassen kann. Auch die innere while-Schleife ist eine while-True-Schleife, weil die Abbruchbedingung erst am Ende und nicht am Anfang geprüft werden sollte. Für computer_figur nimmt man ab besten »random.choice«. Für die Gewinnerprüfung hast Du dreimal den selben Code, das sollte in eine if-Abfrage zusammengefasst werden.

Und was pixewakb schon geschrieben hatte, solltest Du alles in ein paar Funktionen aufteilen, zumindest sollte alles in Funktionen stehen.
Benutzeravatar
noisefloor
User
Beiträge: 2143
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: Görgeshausen
Kontaktdaten:

Re: Mein erstes Spiel

Beitragvon noisefloor » Samstag 13. Januar 2018, 17:01

Hallo,

Du solltest ein paar Funktionen einbauen (z.B. für die Auswertung des Ergebnisses pro Runde), nicht alles als linearen Code runter schreiben.
Dann brauchst du auch keine 4 Ebenen für die Einrückung.

`spielfiguren` ist eine Konstante und sollte von daher GROSS geschrieben werden. Als Datenstruktur würde sich ein Dict oder ein NamedTuple anbieten.

Um zufällig ein Element aus einer Liste oder eine Tuple zu wählen gibt es `random.choice()`

""Sie haben die gleiche Figur wie der Computer ausgewählt. Bitte wählen sie nochmals eine Figur aus. Vielen Dank." - Warum? Warum muss der Mensch wählen und nicht der Computer? Abgesehen davon gibt es auch bei Stein, Schere, Papier ein unentschieden...

Die Variablennamen und die Frage nochmal ist ziemlich denglisch... entweder alles auf deutsch oder alles auf Englisch - aber nicht mischen.

Gruß, noisefloor
Benutzeravatar
kbr
User
Beiträge: 758
Registriert: Mittwoch 15. Oktober 2008, 09:27
Wohnort: Düsseldorf

Re: Mein erstes Spiel

Beitragvon kbr » Samstag 13. Januar 2018, 17:38

Habe tatsächlich noch nie Schere, Stein, Papier geschrieben – also hier mein Erstlingswerk 8)

@Moon: auch an diesem Code mag es noch Dinge zu verbessern geben und sicher kann man das Spiel auch anders implementieren. Aber hier hast Du ein Beispiel mit Konstante und Funktionen.

  1. import random
  2.  
  3.  
  4. STATES = {n: figure for n, figure in enumerate(['Schere', 'Stein', 'Papier'])}
  5.  
  6.  
  7. def get_user_choice():
  8.     while True:
  9.         choice = input("Wähle: [0] Schere, [1] Stein, [2] Papier, [e] Ende ").lower()
  10.         if choice == 'e':
  11.             return choice
  12.         try:
  13.             choice = int(choice)
  14.         except ValueError:
  15.             continue
  16.         if 0 <= choice <= 2:
  17.             return choice
  18.  
  19.        
  20. def print_message(choice, message):
  21.     print('Computerwahl: {}. {}'.format(STATES[choice], message))
  22.  
  23.    
  24. def run_game():
  25.     while True:
  26.         user_choice = get_user_choice()
  27.         if user_choice == 'e':
  28.             break
  29.         computer_choice = random.randint(0, 2)
  30.         delta = user_choice - computer_choice
  31.         if not delta:
  32.             print_message(computer_choice, "Unentschieden")
  33.         elif delta == 1 or delta == -2:
  34.             print_message(computer_choice, "Du hast gewonnen")
  35.         else:
  36.             print_message(computer_choice, "Du hast verloren")
  37.  
  38.            
  39. def main():
  40.     print("Spiel: Schere, Stein, Papier\n")
  41.     run_game()
  42.     print("Ende.")
  43.  
  44.    
  45. main()  
Sirius3
User
Beiträge: 6884
Registriert: Sonntag 21. Oktober 2012, 17:20

Re: Mein erstes Spiel

Beitragvon Sirius3 » Samstag 13. Januar 2018, 17:56

@kbr: ein Wörterbuch, beim dem die Schlüssel von 0 aufsteigende ganze Zahlen sind, ist nichts anderes als eine kompliziert geschriebene Liste. `continue` sollte man vermeiden, weil es den Programmfluß undurchsichtig macht. In Zeile 15 kann man einfach einen else-Block zu except benutzen. Bei nummerischen Werten würde ich ein `delta == 0` einem `not delta` vorziehen.

Und dann kann man die Wiederholungen von Schere, etc und den magischen Zahlen vermeiden.
  1. import random
  2.  
  3. STATES = ['Schere', 'Stein', 'Papier']
  4. MESSAGES = [
  5.     "Unentschieden",
  6.     "Du hast gewonnen",
  7.     "Du hast verloren"
  8. ]
  9.  
  10. def get_user_choice():
  11.     while True:
  12.         choice = input("Wähle: {}, [e] Ende ".format(", ".join(
  13.             "[{}] {}".format(n,m) for n,m in enumerate(STATES)
  14.         ))).lower()
  15.         if choice == 'e':
  16.             return choice
  17.         try:
  18.             choice = int(choice)
  19.         except ValueError:
  20.             pass
  21.         else:
  22.             if 0 <= choice < len(STATES):
  23.                 return choice
  24.  
  25. def run_game():
  26.     while True:
  27.         user_choice = get_user_choice()
  28.         if user_choice == 'e':
  29.             break
  30.         computer_choice = random.randrange(len(STATES))
  31.         delta = user_choice - computer_choice
  32.         print('Computerwahl: {}. {}'.format(
  33.             STATES[computer_choice], MESSAGES[delta % 3]))
  34.            
  35. def main():
  36.     print("Spiel: {}\n".format(", ".join(STATES)))
  37.     run_game()
  38.     print("Ende.")
  39.  
  40. if __name__ == '__main__':
  41.     main()
Benutzeravatar
kbr
User
Beiträge: 758
Registriert: Mittwoch 15. Oktober 2008, 09:27
Wohnort: Düsseldorf

Re: Mein erstes Spiel

Beitragvon kbr » Samstag 13. Januar 2018, 18:21

@Sirius3: wenn Du Dich nicht gemeldet hättest, wäre ich fast schon enttäuscht gewesen. Ja, die Nutzung einer Liste ist auch ok. Was mich etwas wurmt, ist das delta modulo - darauf hätte ich auf die Schnelle ruhig selbst kommen können. Aber was das continue betrifft: ich kenne diesen Standpunkt, verstehe ihn auch, teile ihn aber in dieser Pauschalität nicht. Im Gegenteil: Continue, gut eingesetzt, kann dazu beitragen, Code lesbar zu halten.
Moon
User
Beiträge: 33
Registriert: Mittwoch 20. Dezember 2017, 15:21

Re: Mein erstes Spiel

Beitragvon Moon » Montag 15. Januar 2018, 09:55

Hey,

erstmal viele Dank für die vielen Rückmeldungen und Codebeispiele wie man es doch besser machen kann. Der Code ist an manchen Stellen doch etwas komplex.

@pixewakb: Ich möchte andere Eingaben als ich prüfe? Ich sehe dies nicht so. Ich überprüfe doch welche Eingaben ich möchte.

@Sirius3: Ok. Alles klar. Ja ich habe eben laufe des Erlernens einer anderen Programmiersprache gelernt, dass das Kommentieren des Codes wichtig ist, damit auch jemand anderes den einfach versteht, die Funktionsweise, usw. Ja das tupel habe ich falsch kommentiert.

@noisefloor: Spielfiguren ist eine Konstante? Nein. Ein Tupel. Ja mein Englisch ist nicht so gut. Darum mische ich es. Alles klar. Dann muss ich mehr Englisch lernen.

Grüße,
Moon
Sirius3
User
Beiträge: 6884
Registriert: Sonntag 21. Oktober 2012, 17:20

Re: Mein erstes Spiel

Beitragvon Sirius3 » Montag 15. Januar 2018, 10:00

@Moon: der Kommentar ist richtig (nur halt überflüssig), die Datenstruktur ist die falsche. `spielfiguren` muß eine Liste sein und darüber hinaus ist es auch noch eine Konstante.
Benutzeravatar
noisefloor
User
Beiträge: 2143
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: Görgeshausen
Kontaktdaten:

Re: Mein erstes Spiel

Beitragvon noisefloor » Montag 15. Januar 2018, 10:36

Hallo,

Konstante heißt, dass du die Werte nicht änderst. Es bleibt das ganze Spiel über Stein, Schere, Papier. Und diese Variablennamen schreibt man per Konvention groß, also SPIELFIGUREN (oder bei Sirius3: STATES).

Ja mein Englisch ist nicht so gut. Darum mische ich es.

Also für den Hausgebrauch (sprich, man hat keine Ambitionen, die Software zu verteilen) kannst du ja auch alles auf deutsch schreiben. Nur eben nicht mischen.

Gruß, noisefloor
MegaMark
User
Beiträge: 5
Registriert: Sonntag 14. Januar 2018, 22:07

Re: Mein erstes Spiel

Beitragvon MegaMark » Montag 15. Januar 2018, 14:55

Hey,
tolles Spiel
wenn du etwas Fortgeschrittener bist kannst du das bald auch besser.
Schau dir Mal Tkinter Buttons an(einfach und gut)
Gruß Mark
Moon
User
Beiträge: 33
Registriert: Mittwoch 20. Dezember 2017, 15:21

Re: Mein erstes Spiel

Beitragvon Moon » Mittwoch 17. Januar 2018, 12:41

Hey,

ok alles klar. Ich werde dieses Spiel auch noch erweitern und dann das neue Script hier vorstellen und eure Meinung dazu einholen.

Grüße,
Moon

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder