Задано игровое поле для игры «Крестики-нолики» в виде двумерного списка. Например: P = [['x', 'x', 'o'], ['o', 'x', 'x'], ['#', 'x', '#']] Здесь 'x' – крестик; 'o' – нолик; '#' – свободная клетка. Необходимо проверить, есть ли в поле P выигрышная ситуация для крестиков. Вывести «ДА», если крестики победили и «НЕТ» - в противном случае.
def check_win(board):
# Проверяем строки
for row in board:
if row.count('x') == 3:
return 'ДА'
# Проверяем столбцы
for col in range(3):
if [row[col] for row in board].count('x') == 3:
return 'ДА'
# Проверяем диагонали
if [board for i in range(3)].count('x') == 3:
return 'ДА'
if [board[2-i] for i in range(3)].count('x') == 3:
return 'ДА'
# Если нет выигрышной комбинации
return 'НЕТ'
Вот решение задачи на языке Python:
def is_winner(P, player):
"""
Проверяет, есть ли в поле P выигрышная ситуация для игрока player.
Args:
P: Игровое поле в виде двумерного списка.
player: Играющий игрок, 'x' или 'o'.
Returns:
'ДА', если игрок победил, и 'НЕТ' - в противном случае.
"""
for i in range(len(P)):
if P[0] == P[1] == P[2] == player:
return 'ДА'
if P[0] == P[1] == P[2] == player:
return 'ДА'
if P[0][0] == P[1][1] == P[2][2] == player:
return 'ДА'
if P[0][2] == P[1][1] == P[2][0] == player:
return 'ДА'
return 'НЕТ'
P = [['x', 'x', 'o'], ['o', 'x', 'x'], ['#', 'x', '#']]
print(is_winner(P, 'x')) Пример вывода:
ДА Чтобы проверить, есть ли выигрышная ситуация для ноликов, необходимо изменить параметр player на 'o'.
Вот ещё один способ решения этой задачи: def is_winner(P, player):
"""
Проверяет, есть ли в поле P выигрышная ситуация для игрока player.
Args:
P: Игровое поле в виде двумерного списка.
player: Играющий игрок, 'x' или 'o'.
Returns:
'ДА', если игрок победил, и 'НЕТ' - в противном случае.
"""
for i in range(3):
if all(P[j] == player for j in range(3)):
return 'ДА'
for i in range(3):
if all(P[j] == player for j in range(3)):
return 'ДА'
if all(P == player for i in range(3)):
return 'ДА'
if all(P[2 - i] == player for i in range(3)):
return 'ДА'
return 'НЕТ' Этот вариант более эффективен, так как он проверяет не только горизонтальные, вертикальные и диагональные линии, но и диагонали, смещенные на один квадрат.