0
votes

Comment résoudre: TypeError: type (s) d'opérande non pris en charge pour -: 'NoneType' et 'NoneType'?

Je suis très nouveau en python. J'ai essayé de créer un jeu de ciseaux en papier rock mais j'ai reçu l'erreur:

TypeError: type (s) d'opérande non pris en charge pour -: 'NoneType' et 'NoneType'

sur la ligne: dif = a - b

J'ai essayé de rechercher la solution sur Google et Stackoverflow et presque toutes les réponses que j'ai trouvées indiquaient qu'il fallait quelque chose avec un changement d'impression pour revenir. J'ai essayé de le faire à plusieurs endroits mais j'ai fini par avoir plus d'erreurs, donc je pose cette question.

Quelqu'un sait-il comment résoudre cette erreur pour ce code particulier? Merci!!

Code:

while True:
    dictionary = {"steen": 1, "papier": 2, "schaar": 3}

    p1 = raw_input("Maak een keuze: steen, papier of schaar:")
    p2 = raw_input("Maak een keuze: steen, papier of schaar:")
    a = dictionary.get(p1)
    b = dictionary.get(p2)
    dif = a - b

    if dif in [1, -2]:
        print ("Speler 1 heeft gewonnen")
        if str(input("Wilt u nog een keer spelen, ja of nee?")) == "Ja":
            continue
        else:
            print ("Game over")
            break
    elif dif in [-1, 2]:
        print ("Speler 2 heeft gewonnen")
        if str(input("Wilt u nog een keer spelem, ja of nee?")) == "Ja":
            continue
        else:
            print ("Game over")
            break
    else:
        print ("Gelijkspel")
        if str(input("Wilt u nog een keer spelen, ja of nee?")) == "Ja":
            continue
        else:
            print ("Game over")
            break


4 commentaires

dict.get renverra None par défaut si la clé est manquante, et None ne prend pas en charge les opérations mathématiques


Cela aiderait, lors de l'attachement d'une erreur en python, si vous spécifiez également la ligne sur laquelle elle s'est produite.


C.Nivs, merci pour votre réponse tout d'abord. Je ne sais pas vraiment ce qu'est «la clé» et est-ce qu'il manque ici? Si oui, que dois-je ajuster? Je comprends cependant la deuxième partie de votre réponse, cela a du sens. J'espère que vous pourrez développer davantage la partie clé manquante. Merci d'avance!


Salut NadavS, ah oui bien sûr, je suis désolé, première fois en postant ici haha. Le message d'erreur s'est produit sur dif = a - b


3 Réponses :


1
votes

La ligne a = dictionary.get(p1) renvoie probablement None. Ou la ligne après ça.

Je recommande d'utiliser un débogueur et de faire une pause sur la ligne défaillante.


1 commentaires

Très bien merci pour votre réponse. Je vais chercher sur YouTube comment faire cela. Merci! :-)



0
votes

J'ai donc essayé d'autres choses et je pense savoir pourquoi j'ai reçu l'erreur. Je pense que j'ai mis un espace supplémentaire avant la réponse comme entrée. Donc au lieu de répondre "rock", j'ai répondu "rock". Par conséquent, il n'y avait pas de valeur entière attribuée à mon entrée car "rock" n'est pas dans mon dictionnaire ce qui a fait que la ligne dif me donne une erreur.

Pour tous ceux qui pourraient rencontrer le même problème, c'est ce que j'ai fait pour ne pas recevoir d'erreur si l'entrée est légèrement désactivée (cela indiquera maintenant à l'utilisateur que l'entrée n'était pas correcte et qu'il devrait essayer autre chose) :

while True:

dictionary = {"steen": 1, "papier": 2, "schaar": 3}
p1 = raw_input("Speler 1, maak een keuze: steen, papier of schaar: ")
p2 = raw_input("Speler 2, maak een keuze: steen, papier of schaar: ")
a = dictionary.get(p1)
b = dictionary.get(p2)
antwOpties = ["steen", "papier", "schaar"]

if p1 not in antwOpties or p2 not in antwOpties:
    print ("U heeft een ongeldig antwoord ingevuld, kies schaar, steen of papier")
    continue

dif = a - b
if dif in [1, -2]:
    print ("Speler 1 heeft gewonnen")
    if str(input("Wilt u nog een keer spelen, ja of nee?")) == "Ja":
        continue
    else:
        print ("Game over")
        break
elif dif in [-1, 2]:
    print ("Speler 2 heeft gewonnen")
    if raw_input("Wilt u nog een keer spelem, ja of nee?") == "Ja":
        continue
    else:
        print ("Game over")
        break
else:
    print ("Gelijkspel")
    if raw_input("Wilt u nog een keer spelen, ja of nee?") == "Ja":
        continue
    else:
        print ("Game over")
        break

Alors tout d'abord, j'ai créé une liste avec les réponses possibles, appelée antwOpties. J'ai ensuite créé un morceau de code qui vérifierait si l'entrée des joueurs 1 et 2 était dans cette liste. Si ce n'est pas le cas, il l'imprime et demande une autre entrée, puis revient au début de la boucle grâce au "continuer". Et enfin j'ai déplacé le "dif = a - b" sous ce morceau de code qui vérifie si l'entrée est valide. Je l'ai fait pour qu'il ne passe pas par ça si l'entrée n'est pas valide (car elle ne dépasse le "continuer" que si l'entrée EST dans les réponses et correspond donc à un entier.


0 commentaires

0
votes

Le code fonctionne en fait avec une entrée correcte. Donnez une entrée en utilisant n'importe qui des entrées ["steen," papier "," schaar "]


0 commentaires