Оптимизация нескольких повторяющихся операторов, работающих с массивами - PullRequest
0 голосов
/ 29 июня 2019

Я работаю над небольшой программой для игры в tictactoe с компьютером, однако, когда дело доходит до проверки того, кто является победителем, я сделал функцию, которая проверяет массив, представляющий доску, на предмет любых «X» или «O», которые встречаются. доска вертикально, горизонтально и поперек. Просто глядя на код, я вижу много повторений, и я просто искал предложения о том, как его оптимизировать.

Я пытался объединить операторы if для «X» и «O», но я не могу объединить их, так как мне нужно, чтобы каждое из них выводило различное сообщение на выход. Первый оператор if проверяет каждую строку для всех значений X, второй проверяет по вертикали, а третий и четвертый проверяют значения по всей доске.

for i in range(3):
    if myDict[0][i] == 'X' and myDict[1][i] == 'X' and myDict[2][i] == 'X':
        print('You Lose!!!')
        DisplayBoard(myDict)
        return False
    elif myDict[i][0] == 'X' and myDict[i][1] == 'X' and myDict[i][2] == 'X':
        print('You Lose!!!')
        DisplayBoard(myDict)
        return False
if myDict[0][0] == 'X' and myDict[1][1] == 'X' and myDict[2][2] == 'X':
    print('You Lose!!!')
    DisplayBoard(myDict)
    return False
elif myDict[0][2] == 'X' and myDict[1][1] == 'X' and myDict[2][0] == 'X':
    print('You Lose!!!')
    DisplayBoard(myDict)
    return False

for i in range(3):
    if myDict[0][i] == 'O' and myDict[1][i] == 'O' and myDict[2][i] == 'O':
        print('You Win!!!')
        DisplayBoard(myDict)
        return False
    elif myDict[i][0] == 'O' and myDict[i][1] == 'O' and myDict[i][2] == 'O':
        print('You Win!!!')
        DisplayBoard(myDict)
        return False
if myDict[0][0] == 'O' and myDict[1][1] == 'O' and myDict[2][2] == 'O':
    print('You Win!!!')
    DisplayBoard(myDict)
    return False
elif myDict[0][2] == 'O' and myDict[1][1] == 'O' and myDict[2][0] == 'O':
    print('You Win!!!')
    DisplayBoard(myDict)
    return False
return True

Программа работает, просто ищет способы оптимизации кода.

Ответы [ 2 ]

0 голосов
/ 29 июня 2019

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

Например:

axes = [ [(0,0),(0,1),(0,2)], [(1,0),(1,1),(1,2)], [(2,0),(2,1),(2,2)],
         [(0,0),(1,0),(2,0)], [(0,1),(1,1),(2,1)], [(0,2),(1,2),(2,2)],
         [(0,0),(1,1),(2,2)], [(0,2),(1,1),(2,0)] ]

winner = "O"
for axis in axes:
    p = "".join(myDict[r][c] for r,c in axis)
    if p = "OOO": winner = "O"
    if p = "XXX": winner = "X" 
if winner == "O": print("You Win!!!")
if winner == "X": print("You Lose!!!") 
0 голосов
/ 29 июня 2019

myDict[0][i] == 'X' and myDict[1][i] == 'X' and myDict[2][i] == 'X'

можно заменить на

all(myDict[j][i]=='X' for j in range(3))


Пара операторов if / elif может быть объединена с or.


Вы также можете заменить дублированный код, написав функцию, которая принимает проигрыватель ('X' или 'O') в качестве аргумента. Просто вызовите функцию один раз для каждого игрока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...