Соедините 4 проблемы с вертикальным условием выигрыша - PullRequest
0 голосов
/ 16 ноября 2018

Кажется, я не могу понять, как заставить свой вертикальный ход работать. Моя доска - это вложенный список, состоящий из 6 списков по 6 элементов в каждом.

Мне удалось выяснить мое горизонтальное и диагональное условия выигрыша.Но я не могу обернуть голову вокруг вертикальной

Это мое горизонтальное условие, например

#the list itself 
    board = [
            [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0],
            ]

def hor_condition(board, player):
    """the hor_condition checks whether the list contains necessary amount of checkers in order to call it a win"""
    for row in board:
        for cell in row:
            if row.index(cell) < 2:
                check_list = [row[row.index(cell)],
                              row[row.index(cell) + 1],
                              row[row.index(cell) + 2],
                              row[row.index(cell) + 3]
                              ]
                if check_list[0] == player and\
                        check_list[1] == player and \
                        check_list[2] == player and \
                        check_list[3] == player:
                    return True

Здесь проверяется, есть ли 4 одинаковых элемента в одной строкеигрок, чтобы назвать это победой.Я ожидаю, что вертикальное условие будет выполнено, чтобы проверить, есть ли 4 одинаковые шашки в одном столбце

Это может быть больно смотреть, но имейте в виду, что я только начал с Python иЯ начинаю понимать основы.

Я на самом деле не спрашиваю о чёрном на белом коде, скорее о толчке в правильном направлении

Я был бы рад предоставить любую дополнительную информацию, еслинеобходимо!Заранее спасибо!

Редактировать: Уже немного поздно, но я хотел бы помочь всем, у кого была такая же проблема, как и у меня.В конце концов я исправил свою проблему следующим образом:

def vert_condition(board, player):
"""The vert_condition iterates over the board and checks whether 4 vertical slots contain the same player input by
 with the help of a nested loop"""
for row in range(3):
    for col in range(6):
        if (board[row][col] == \
                board[row + 1][col] == \
                board[row + 2][col] == \
                board[row + 3][col] == player):
            return True

1 Ответ

0 голосов
/ 16 ноября 2018

Вы можете выполнить итерацию в виде for col in board:

for col_index in range(6):
    col = [row[col_index] for row in board]
    for i in range(len(col) - 4 + 1):
        if all(col[i + j] == player for j in range(4)):
            return True

Поскольку вы не можете выполнять итерацию по строкам напрямую, итерируйте с помощью счетчика индекса - в данном случае range(6) - и каждый раз извлекайте n-й элемент каждой строки, чтобы построить столбец.

Я предлагаю небольшую поправку к вашему коду:

Там, где вы продолжаете писать row.index(cell), это сложное вычисление, поэтому рассчитайте его один раз и сохраните в переменной, чтобы вы могли повторно использовать результат вместо того, чтобы непрерывно пересчитывать его, когда вы могли бы так же легко его сохранить.

Чтобы сделать его еще лучше, используйте встроенный all, который вы предоставляете итеративный и возвращает true, если все элементы имеют значение true.

Кроме того, вам нужно только проверять 6 - 4 + 1 (= 3) раза с тех пор ....

  • первая проверка охватывает 1 - 4
  • второй чек 2-й * 5
  • третий чек 3-й * 6

И после этого больше нет, поскольку в строке (и столбце) нет 7-й ячейки. Расчет, который я включил в мой код:

len(row) - len(what’s being checked) + 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...