Как исправить пока л oop в Python - PullRequest
0 голосов
/ 28 мая 2020

Я видел, что обычно ошибка возникает, когда вы используете в течение некоторого времени l oop, однако здесь это не так, поэтому я прошу помощи с этой "распространенной" ошибкой

Следующая часть кода не важна, вероятно, вы можете просто проигнорировать ее

crd = ['1 3', '2 3', '3 3', '1 2', '2 2', '3 2', '1 1', '2 1', '3 1']
inp = list(input('Enter cells:'))
wins = 0
result = False


def field(val):
    print('---------')
    for i in range(0, 9, 3):
        print('| ' + '{} {} {}'.format(val[i], val[i+1], val[i+2]).replace('_', ' ') + ' |')
    print('---------')


def win(con):
    global wins
    global result
    if inp[0] == '_':
        result = 'Impossible'
    else:
        win_con = [[con[i], con[i+1], con[i+2]] for i in range(0, 9, 3)] \
                + [[con[i], con[i+3], con[i+6]] for i in range(0, 3, 1)]\
                + [[con[0], con[4], con[8]], [con[2], con[4], con[6]]]

        for i in win_con:
            if (set(i) == {'X'} or set(i) == {'O'}) and wins == 1:
                result = 'Impossible'
            elif set(i) == {'X'}:
                result = 'X wins'
                wins = 1
            elif set(i) == {'O'}:
                result = 'O wins'
                wins = 1

        if result == False:
            try:
                inp.index('_')
                result = 'Game not finished'
            except:
                result = 'Draw'
    print(result)


field(inp)

Сильфон - это часть кода с al oop, которая возвращает ошибку бесконечного цикла (насколько я понял ошибка в def move () part

def move():
    move = input('Enter the coordinates:').split(' ')
    while True:
        for n in move:
            if int(n) not in range(1, 4):
                print('Coordinates should be from 1 to 3!')
                move = input('Enter the coordinates:').split(' ')
                continue
            elif int(n) in range(1, 4):
                move = ' '.join(move)
                break


while True:
    move()
    position = [p for p, x in enumerate(crd) if x == move]
    int_pos = int("".join([str(p) for p in position]))

    if inp[int_pos] == '0' or inp[int_pos] == 'X':
        print('This cell is occupied! Choose another one!')
        move()
    elif inp[int_pos] == '_':
        inp[int_pos] = 'X'
        field(inp)
        win(inp)
    if result:
        break

Каким-то образом, однажды мне даже удалось исправить ошибку бесконечного l oop, тем не менее, возникла другая проблема - после проверки первой пары координат (и показа того, что они находятся за пределами диапазона) потребовался ввод для новой пары координат, но все же продолжилась проверка старой пары координат, которая уже была проверена.

1 Ответ

0 голосов
/ 28 мая 2020

Я предполагаю, что вы используете функцию move только для ввода правильных координат вправо
вы можете упростить его следующим образом

def input_coordinates():
    while True:
        x, y = [int(i) for i in input('Enter the coordinates:').split(' ')]
        if (1 <= x < 4
              and 1 <= y < 4):
           return x, y
        # this will keep looping unless you get valid coordinates

Затем вы пишете основной как это

while True:
    x, y = input_coordinates()
    move = "{} {}".format(x, y) # formatting the way you expect it.
    position = [p for p, x in enumerate(crd) if x == move]
    int_pos = int("".join([str(p) for p in position]))

    if inp[int_pos] == '0' or inp[int_pos] == 'X':
        print('This cell is occupied! Choose another one!')
        continue
    elif inp[int_pos] == '_':
        inp[int_pos] = 'X'
        field(inp)
        win(inp)
    if result:
        break
  1. Старайтесь избегать глобальных переменных,
  2. у вас также был конфликт, у вас была строка и функция с именем "move"
  3. вам не нужно было добавлять еще одну итерацию (for n in move) в исходной функции move ()
...