【问题标题】:How to fix a while loop in Python如何在 Python 中修复 while 循环
【发布时间】:2020-09-15 12:51:54
【问题描述】:

我已经看到通常,当您在 while 循环中使用 while 时会发生错误,但是,这里不是这种情况,所以我请求帮助解决这个“常见”错误

以下部分代码并不重要,可能你可以 忽略它

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)

波纹管是带有返回无限循环的循环的代码部分 错误(据我了解,错误在 def move() 部分

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

不知何故,一旦我设法修复了无限循环错误,然而,发生了一个不同的问题 - 在检查第一对坐标(并显示它们超出范围)之后,它接受了新坐标对的输入,但仍然继续检查已经检查过的旧坐标对。

【问题讨论】:

    标签: python while-loop infinite-loop


    【解决方案1】:

    我猜你正在使用函数 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
    

    那你就这样写你的main

    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. 您不需要在原来的 move() 函数中再添加一次迭代 (for n in move)

    【讨论】:

    • 太棒了,明白了!感谢您的详细回复。
    猜你喜欢
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    • 2020-01-18
    • 1970-01-01
    相关资源
    最近更新 更多