Простая игра на python. Как обратиться к элементу в доске, проверить его расположение и поменять на опр символ?

не понимаю, как из списка игровой доски достать опр элемент и проверить его номер + проверить лежит ли он наискосок от другого элемента, который ввёл другой игрок. Саму задачу вставил ниже, вот мой код на текущий момент : (поле у меня реализовано через * , 4 столбца по 5 элементов в каждом. Рассмотрю любые предложения. Загвоздка в том, что у каждого игрока из трёх свой уникальный символ, которым он заполняет поле и программа проверяет лежат ли они рядом или наискосок и добавляет штрафные баллы этим игрокам. PS буду очень признателен, если кто-нибудь решит эту задачку, даже готов поддержать копеечкой...

board = ['*','*','*','*',]
def draw_board(board):
    print('-' * 21)
    for i in range(4):
        print("|", board[0], "|", board[0], "|", board[0], "|", board[0], "|", board[0], "|")
        print("-" * 21)
draw_board(board)

#изменение поля
def change_board(player_token):
    valid = False
    while not valid:
        player_move = input(f'Введите координаты хода(строка,столбец)')
        coordinate = player_move.split(',')
        y = int(coordinate[0])  # строка
        z = int(coordinate[1])  # столбец
        try:
            y = int(y)
            z = int(z)
        except:
            print('Введите числа через запятую!')
        if 1 <= y <= 5 and 1 <= z <= 4:

вывод доски:

---------------------
| * | * | * | * | * |
---------------------
| * | * | * | * | * |
---------------------
| * | * | * | * | * |
---------------------
| * | * | * | * | * |
---------------------

Реализовать программу, при помощи которой 3 игрока могут играть в игру «Лоскутное одеяло». Правила игры следующие. На поле, имеющем размер 4 на 5 клеток за один ход каждый игрок должен заполнить одну клетку своим символом. Игрок старается, чтобы его символы были как можно дальше друг от друга. В ходе игры ведется подсчет очков: за каждое соседство клеток с одинаковыми символами игроку, владельцу символа добавляется одно штрафное очко. Соседними считаются клетки, имеющие общую сторону или расположенные наискосок друг от друга. Выигрывает тот, у кого в конце игры меньше всего штрафных очков. Взаимодействие с программой производится через консоль. Игровое поле изображается в виде 4 текстовых строк и перерисовывается при каждом изменении состояния поля. При запросе данных от пользователя программа сообщает, что ожидает от пользователя (например, координаты очередного хода) и проверяет корректность ввода. Программа должна уметь автоматически определять количество штрафных очков и окончание партии и ее победителя. Сама программа НЕ ходит, т.е. не пытается заполнять клетки символами с целью выиграть игру.


Ответы (1 шт):

Автор решения: EzikBro
table = [['*'] * 5 for _ in range(4)]
players_char = ['1', '2', '3']

for i in range(20):
    player = i % 3
    x, y = map(int, input(f'Ход игрока {player + 1}: ').split())
    table[y - 1][x - 1] = players_char[player]

dxy = [[-1, -1], [-1, 0], [-1, 1], \
       [0,  -1],          [0,  1], \
       [1,  -1], [1,  0], [1,  1]  ]
score = [0, 0, 0]
for y in range(4):
    for x in range(5):
        for i in range(len(dxy)):
            nx, ny = x + dxy[i][0], y + dxy[i][1]
            if 0 <= nx < 5 and 0 <= ny < 4:
                if table[y][x] == table[ny][nx]:
                    score[int(table[y][x]) - 1] += 1
                    # Для иных символов игроков нужно составить словарь
                    # char_rev = {player_char[i]: i for i in range(len(player))}
                    # И использовать score[char_rev[table[y][x]]]

# Теперь в score удвоенное количество штрафных очков каждого игрока
# Так что их все нужно поделить на 2
score = [i // 2 for i in score]

for i in range(len(player)):
    print(f'Игрок {i + 1} получил {score[i]} штрафных очков')

# Тут далее необходимо расписать возможные случаи:
# 1) Победил один игрок - у него меньше очков, чем у двух других
# 2) Победили два игрока - у них одинаковое количество очков, меньшее, чем у третьего
# 3) Полная ничья - у всех игроков одинаковое количество очков
# После чего вывести соответствующее сообщение о победе
→ Ссылка