Простая игра на 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 шт):
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) Полная ничья - у всех игроков одинаковое количество очков
# После чего вывести соответствующее сообщение о победе