while True:
Это никогда не замечательно и должно указывать на то, что есть лучший способ разработать этот код. Даже если он просто использует логический флаг.
if len(player_choice) != 2:
continue
if not player_choice[0].isdigit() or not player_choice[0].isdigit():
Так, кроме очевидной опечатки, где второе предложение должно было быть player_choice[1]
, в python более идиоматично - try
вместо if
(https://devblogs.microsoft.com/python/idiomatic-python-eafp-versus-lbyl/).. Также рассмотрите возможность предоставления некоторой обратной связи с пользователем, так как (а) тот факт, что команда потерпела неудачу и (б) почему она провалилась:
try:
row = int(player_choice[0])
col = int(player_choice[1])
except ValueError:
print(f"Input must be two numbers, however non-digit characters were received."
except IndexError:
print("The input should be two numbers separated by a space but no space was entered")
Для проверки лимитов, снова подумайте о предоставлении обратной связи. Также ROWS
и т. Д. Не являются такими описательными именами. num_rows
лучше. Кроме того, вместо константы, вместо этого сделайте все это функцией и установите вместо них аргументы по умолчанию;
def validate_user_input(player_choice: str, num_rows: int = 10, num_cols: int = 10) -> bool:
try:
row, col = player_choice.split()
except ValueError:
print("Bad input: The input should be exactly two numbers separated by a space.")
return False
try:
row = int(row)
col = int(col)
except ValueError:
print(f"Input must be two numbers, however non-digit characters were received."
return False
if row < 0 or row > num_rows:
print(f"The first number must be between 0 and {num_rows} but {row} was passed.")
return False
if col < 0 or col > num_rows:
print(f"The second number must be between 0 and {num_cols} but {col} was passed.")
return False
return true
И тогда ваш цикл становится:
valid_input = False
while not valid_input:
player_choice = input("Enter the row and column of your choice separated by a space: ")
valid_input = validate_user_input(player_choice)