Как продолжать запрашивать у пользователя ввод, пока я не получу целое число в диапазоне c? - PullRequest
1 голос
/ 05 августа 2020

Недавно я решил пересмотреть свою игру TicTacToe, которую я делал около 3 месяцев go с бесплатным sh набором глаз для отладки, и в частности, есть одна ошибка, которая продолжает меня беспокоить. По сути, у меня есть этот код:

def player_choice(board):
    '''Asks the player for their next position, calls a func to check if it's free'''
    '''and returns the position if it's free for later use'''
    spot = None
    while spot not in range(1, 10) or not space_check(board, spot):
        try:
            spot = int(input("Choose your next position (1-9): "))
        except:
            print("Hmm, looks to me like your input was invalid")
        else:
            break
    return spot

Это функция из более широкой схемы вещей, но что ломает всю игру, так это то, что мне нужно целое число в качестве входных данных. , строго в диапазоне от 1 до 10 . Прежде чем пытаться обработать ошибки, я использовал некоторое время l oop, которое продолжало запрашивать int, если была задана str:

spot = int(input("Choose your next position (1-9): "))
    while spot not in range (1, 10) or not space_check(board, spot):
        spot = int(input("Looks like the spot you're trying to choose is invalid!\nPlease choose another position (1-9): "))
    return spot

Но затем я переключился на эту версию, и здесь она не принимает str в качестве ввода, но он будет принимать int вне диапазона 1-10. У меня вопрос: что я могу сделать, чтобы эта работа работала так, как мне нужно, взять целое число строго от 1 до 10 и продолжать спрашивать, пока не будет предоставлен именно этот ввод?

Ответы [ 3 ]

1 голос
/ 05 августа 2020

Переместив несколько вещей, похоже, это сработало. Хотя не знаю почему всегда срабатывает else ...

def player_choice2(board):
    '''Asks the player for their next position, calls a func to check if it's free'''
    '''and returns the position if it's free for later use'''
    try:
        spot = int(input("Choose your next position (1-9): "))
    except:
        print("Hmm, looks to me like your input was invalid")
        spot = 0
    while spot not in range(1, 10) or not space_check(board, spot):
        try:
            spot = int(input("Choose your next position **  (1-9) **: "))
        except:
            print("Hmm, looks to me like your input was invalid")
        else:
            # This always fires...?
            print("Else....")
    return spot
0 голосов
/ 05 августа 2020

Может это поможет:

    def player_choice(board):
        '''Asks the player for their next position, calls a func to check if it's free'''
        '''and returns the position if it's free for later use'''
        spot = True
        while spot in range(1, 10) or not space_check(board, spot):
            try:
                spot = int(input("Choose your next position (1-9): "))
            except:
                break
        else:
            print("Hmm, looks to me like your input was invalid")
    
        return spot
 
0 голосов
/ 05 августа 2020
spot = " "
while ord(spot) not in [49,58]:
    spot = input("Looks like the spot you're trying to choose is 
invalid!\nPlease choose another position (1-9): ")
    try:
       spot = ord(spot)
    excpet:
       spot = " "
return spot

Здесь я проверил значение ascii для пятна, которое должно быть числом, а числа - 1-> 49, 2-> 50 и т. Д.

...