2 votes

Problème pour terminer une instruction if multiple pour attraper tout le monde

J'essaie actuellement d'écrire mon premier programme/application en Python en créant un outil que mon partenaire pourra utiliser lorsque nous jouerons à un jeu de cartes. Je viens juste de commencer à apprendre à programmer sérieusement, donc c'est peut-être une erreur de débutant que j'ai manquée, mais je n'arrive pas à attraper "autre chose" via l'entrée pour détourner la réponse de l'utilisateur.

Voici mon code :

def counting_up ():
round_total = 0
while True :
    global game_level
    cards = input("Enter Card: \n")
    if cards.upper() == "A" or cards == "2" :
        round_total += 20
    if cards == "3" :
        round_total += 3
    if cards == "4":
        round_total += 4
    if cards == "5" :
        round_total += 5
    if cards == "6" : 
        round_total += 6
    if cards == "7" :
        round_total += 7
    if cards == "8" :
        round_total += 8
    if cards == "9" :
        round_total += 9
    if cards == "10" or cards.upper() == "J" or cards.upper() == "Q" or cards.upper() == "K" :
        round_total += 10
    if cards == "0" : 
        game_level += 1
    if cards.upper() == "END" :
        game_state = 1
        break
    else : 
        print (f"{cards}, is not a valid value, please enter a valid value!")

print ("Your score this round was " + str(round_total))
return round_total

Lors du test, il ne semble pas passer par les contrôles logiques préalables avant de conclure que la valeur n'est pas valide. REMARQUE : cette fonction entière fonctionnait comme prévu et continue de fonctionner si je supprime l'instruction else : à la fin. Existe-t-il en Python quelque chose de similaire à une instruction case en Java qui pourrait fonctionner ?

Merci d'avance

4voto

ukemi Points 3499

Avec de multiples if au même niveau, python vérifiera chaque déclaration conditionnelle. Si vous voulez qu'il ignore les déclarations suivantes lorsqu'une précédente a été satisfaite, utilisez elif :

def counting_up(game_state, game_level, round_total=0):
    """Request and add input card face value to score repeatedly till end."""
    while True:
        cards = input("Enter Card: \n")
        if cards.upper() == "END":
            game_state = 1; break
        elif cards == "0": 
            game_level += 1
        elif cards.upper() in ("A", "2"):
            round_total += 20
        elif cards.isnumeric():
            round_total += int(cards)
        elif cards.upper() in ("J","Q","K"):
            round_total += 10
        else: 
            print(f"{cards}, is not a valid value, please enter a valid value!")

    print(f"Your score this round was {round_total}.")
    return round_total

2voto

dwjbosman Points 199

Seul le premier "if" doit être un "if" ; les autres instructions "if" doivent être remplacées par des instructions "elif" (else if).

2voto

Naruto137 Points 84

"else" vérifie toujours le "if" le plus récent et l'évalue ensuite. Ainsi, si vous entrez seulement "END" sans avoir l'instruction break, le programme ne passera pas à l'instruction else. Ainsi, tout ce que vous saisissez, autre que "END", imprime le résultat en même temps que le résultat de l'instruction else.

Utilisez donc "elif" pour les instructions autres que la première instruction "if" afin de vérifier la condition. Si elle est satisfaite, elle imprime le résultat, sinon elle passe à l'instruction suivante.

1voto

Sociopath Points 3139

Vous pouvez utiliser dict

def counting_up ():
    round_total = 0
    while True :
        global game_level
        cards = input("Enter Card: \n")
        card_dict = {'A':20,'2':20,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9,'10':10,'J':10,'Q':10,'K':10}
        if cards.upper() in card_dict.keys():
            round_total += card_dict[cards.upper()]
        elif cards == "0" : 
            game_level += 1
        elif cards.upper() == "END" :
            game_state = 1
            break
        else : 
            print (f"{cards}, is not a valid value, please enter a valid value!")

    print("Your score this round was " + str(round_total))
    return round_total

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X