Anfänger (Schere, Stein, Papier)

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.
Antworten
Kampfgummibaerlie
User
Beiträge: 27
Registriert: Freitag 18. Juni 2021, 14:44

Ich habe mir ein Buch gekauft, bin beim ersten Kapitel, wo ein Schere, Stein, Papier in der Maschine programmiert wird.

Jetzt habe ich das Problem, dass ich (quasi) nicht verlieren kann, weil er, falls ich verliere den Wert "None" zurückgibt, jedoch nicht die Message für ein Lose...

Hier mein bisheriger Code:

Code: Alles auswählen

"""
Rock - Paper - Scissor
"""
import random

ROCK = "r"
PAPER = "p"
SCISSORS = "s"

TIE = "Tie."
WIN = "You win :-)"
LOSE = "You lose :-("

def compare_moves(you, computer):
    if you == computer:
        return TIE
    elif you == SCISSORS and computer == PAPER:
        return WIN
    elif you == ROCK and computer == SCISSORS:
        return WIN
    elif you == PAPER and computer == ROCK:
        return LOSE
    
you = ""

while you not in [ROCK, PAPER, SCISSORS]:
    you = input("(r)ock, (p)aper or (s)cissors ? > ")

computer = random.choice([ROCK, PAPER, SCISSORS])
result = compare_moves(you, computer)

print(f"You: {you}, Computer: {computer}. {result}")
Freue mich, Python als nächstes in Erfahrung bringen zu dürfen!

LG Kampfgummibaerlie
Benutzeravatar
sparrow
User
Beiträge: 4540
Registriert: Freitag 17. April 2009, 10:28

Eine Funktion gibt immer "None" zurück, wenn nicht explizit etwas zurückegegben wird.
Was genau bedeutet denn das letzte elif in deiner Funktion "compre_moves"?

Wenn ich deinen Gedanken richtig verstehe und du dir "if" und "elif" anschaust, solltest du auch über "else" stolpern.
Kampfgummibaerlie
User
Beiträge: 27
Registriert: Freitag 18. Juni 2021, 14:44

Danke, genau das war der Fehler ;)

Das letzte Elif auf Else geändert, und funktioniert jetzt einwandfrei :D

Danke ;)
Benutzeravatar
sparrow
User
Beiträge: 4540
Registriert: Freitag 17. April 2009, 10:28

Kampfgummibaerlie hat geschrieben: Sonntag 29. August 2021, 21:04Das letzte Elif auf Else geändert, und funktioniert jetzt einwandfrei :D
Dann zeig doch deinen Code jetzt einmal. Wenn du das letzte elif geändert hast, fehlt dir nun eine Kombination.
Kampfgummibaerlie
User
Beiträge: 27
Registriert: Freitag 18. Juni 2021, 14:44

Mein Code sieht jetzt so aus:

Code: Alles auswählen

"""
Rock - Paper - Scissor
"""
import random

ROCK = "r"
PAPER = "p"
SCISSORS = "s"

TIE = "Tie."
WIN = "You win :-)"
LOSE = "You lose :-("

def compare_moves(you, computer):
    if you == computer:
        return TIE
    elif you == SCISSORS and computer == PAPER:
        return WIN
    elif you == ROCK and computer == SCISSORS:
        return WIN
    else:
        return LOSE
    
you = ""

while you not in [ROCK, PAPER, SCISSORS]:
    you = input("(r)ock, (p)aper or (s)cissors ? > ")

computer = random.choice([ROCK, PAPER, SCISSORS])
result = compare_moves(you, computer)

print(f"You: {you}, Computer: {computer}. {result}")
Danke für die Hilfen ;)
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Dann würde ich an deiner Stelle nie Papier wählen :)
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Alternative:

Code: Alles auswählen

def compare_moves(you, computer):
    return WIN if (you, computer) in [(PAPER, ROCK), (SCISSORS, PAPER), (ROCK, SCISSORS)] else LOSE
Kampfgummibaerlie
User
Beiträge: 27
Registriert: Freitag 18. Juni 2021, 14:44

Sodala, jetzt (hoffe ich) es passt auch für euch ;)
Habe eine elif vergessen...

Mein jetziger Code sieht wie folgt aus:

Code: Alles auswählen

"""
Rock - Paper - Scissor
"""
import random

ROCK = "r"
PAPER = "p"
SCISSORS = "s"

TIE = "Tie."
WIN = "You win :-)"
LOSE = "You lose :-("

def compare_moves(you, computer):
    if you == computer:
        return TIE
    elif you == SCISSORS and computer == PAPER:
        return WIN
    elif you == ROCK and computer == SCISSORS:
        return WIN
    elif you == PAPER and computer == ROCK:
        return WIN
    else:
        return LOSE
    
you = ""

while you not in [ROCK, PAPER, SCISSORS]:
    you = input("(r)ock, (p)aper or (s)cissors ? > ")

computer = random.choice([ROCK, PAPER, SCISSORS])
result = compare_moves(you, computer)

print(f"You: {you}, Computer: {computer}. {result}")
LG Kampfgummibaerlie ;)

EDIT: Ich möchte langsam (und nach dem Buch, und natürlich eurer Unterstützung ^^) die Sprache lernen, also noch nichts zu komplexes bitte
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

rogerb hat geschrieben: Montag 30. August 2021, 09:34

Code: Alles auswählen

def compare_moves(you, computer):
    return WIN if (you, computer) in [(PAPER, ROCK), (SCISSORS, PAPER), (ROCK, SCISSORS)] else LOSE
Da fehlt das "Unentschieden".
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

/me hat geschrieben: Montag 30. August 2021, 11:10 Da fehlt das "Unentschieden".
Stimmt!

Code: Alles auswählen

def compare_moves(you, computer):
    if you == computer:
        return TIE
    elif (you, computer) in {(PAPER, ROCK), (SCISSORS, PAPER), (ROCK, SCISSORS)}:
        return WIN
    else:
        return LOSE
Benutzeravatar
__blackjack__
User
Beiträge: 14069
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Noch eine überarbeitete Version in der ein bisschen Redundanz herausgenommen ist, nämlich dass die Anfangsbuchstaben der Gegenstände unabhängig an zwei Stellen im Quelltext stehen. Dann habe ich aus der ``while``-Schleife wo vor der Schleife eine Variable mit einem Dummy-Wert belegt wird, eine nachprüfende Schleife gemacht. Und wir sehen den bedingten Ausdruck in `compare_moves()`, sowie „dict comprehension“-Syntax und ein Beispiel für die ``assert``-Anweisung:

Code: Alles auswählen

#!/usr/bin/env python3
"""
Rock - Paper - Scissor
"""
import random

CHOICES = ROCK, PAPER, SCISSORS = "rock", "paper", "scissors"
LETTER_TO_CHOICE = {choice[0]: choice for choice in CHOICES}
assert len(CHOICES) == len(LETTER_TO_CHOICE), "choice letters not unique"

WINNING_COMBINATIONS = {(PAPER, ROCK), (SCISSORS, PAPER), (ROCK, SCISSORS)}

TIE = "Tie."
WIN = "You win :-)"
LOSE = "You lose :-("


def format_as_option(text):
    return f"({text[0]}){text[1:]}"


def compare_moves(you, computer):
    if you == computer:
        return TIE
    else:
        return WIN if (you, computer) in WINNING_COMBINATIONS else LOSE


def main():
    prompt = "{}? > ".format(", ".join(map(format_as_option, CHOICES)))
    while True:
        you = LETTER_TO_CHOICE.get(input(prompt))
        if you is not None:
            break

    computer = random.choice(CHOICES)
    result = compare_moves(you, computer)

    print(f"You: {you}, Computer: {computer}. {result}")


if __name__ == "__main__":
    main()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Assassin4711
User
Beiträge: 77
Registriert: Mittwoch 8. September 2021, 14:22


EDIT: Ich möchte langsam (und nach dem Buch, und natürlich eurer Unterstützung ^^) die Sprache lernen, also noch nichts zu komplexes bitte
Welches Buch hast du genommen?
Antworten