Я получаю эту ошибку TypeError, которая говорит, что типы операндов не поддерживаются для «NoneType» и «NoneType» - PullRequest
0 голосов
/ 30 марта 2020

Я очень новичок в python. Я пытался создать игру «Ножницы из бумаги», но получил сообщение об ошибке:

TypeError: неподдерживаемые типы операндов для -: 'NoneType' и 'NoneType'

on the line: dif = a - b

Я пытался найти решение в Google и Stackoverflow, и почти во всех найденных ответах говорилось, что нужно что-то с изменением печати для возврата. Я пытался сделать это в нескольких местах, но в итоге получал больше ошибок, поэтому я задаю этот вопрос.

Кто-нибудь знает, как решить эту ошибку для этого конкретного кода? Спасибо !!

Код:

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

Ответы [ 3 ]

1 голос
/ 30 марта 2020

Строка a = dictionary.get(p1), вероятно, возвращает None. Или строка после этого.

Я рекомендую использовать отладчик и сделать паузу в ошибочной строке.

0 голосов
/ 30 марта 2020

Код на самом деле работает с правильным вводом. Введите входные данные, используя любой из входных данных ["steen," papier "," schaar "]

0 голосов
/ 30 марта 2020

Итак, я попробовал еще кое-что и думаю, что знаю, почему получил ошибку. Я думаю, что ставлю один лишний пробел перед ответом в качестве ввода. Поэтому вместо ответа на «рок» я ответил «рок». Поэтому моему вводу не было присвоено целочисленное значение, поскольку в моем словаре нет слова «рок», из-за которого разница в строке вызвала ошибку.

Для тех, кто может столкнуться с той же проблемой, это то, что я сделал, чтобы я не получил сообщение об ошибке, если вход немного отключен (теперь он сообщит пользователю, что ввод был неправильным и они должны попробовать что-то еще):

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

Итак, прежде всего, я создал список с возможными ответами, который называется antwOpties. Затем я создал фрагмент кода, который проверял бы, есть ли вход игрока 1 и 2 в этот список. Если это не так, он выводит это и запрашивает другой ввод, а затем возвращает обратно в начало l oop благодаря «продолжить». И наконец, я переместил «dif = a - b» ниже того фрагмента кода, который проверяет, является ли ввод действительным. Я сделал это так, чтобы он не go проходил через это, если ввод недействителен (поскольку он проходит только через «продолжить», если ввод в ответах равен IS и, таким образом, соответствует целому числу.

...