class Cell:
# Клетка, у которой есть:
# - номер (1–9)
# - статус (либо сам номер, либо 'X' / 'O')
def __init__(self, number, status):
self.number = number
self.status = status
class Board:
# Поле из 9 клеток
def __init__(self):
self.cells = []
for i_cell in range(1, 10):
# Стартово в каждой клетке хранится её номер
cell = Cell(i_cell, i_cell)
self.cells.append(cell)
def print_board(self):
# Печатаем ×ばつ3 доску
for cell in self.cells:
# Если клетка не крайняя в строке, выводим с " |"
if cell.number % 3 != 0:
print(f' {cell.status} |', end='')
else:
# Крайний столбец, печатаем и перехід на новую строку
print(f' {cell.status} ')
print('------------')
def end_of_game(self, view):
# Собираем все 8 возможных линий-побед
lines = [
[self.cells[0].status, self.cells[1].status, self.cells[2].status],
[self.cells[3].status, self.cells[4].status, self.cells[5].status],
[self.cells[6].status, self.cells[7].status, self.cells[8].status],
[self.cells[0].status, self.cells[3].status, self.cells[6].status],
[self.cells[1].status, self.cells[4].status, self.cells[7].status],
[self.cells[2].status, self.cells[5].status, self.cells[8].status],
[self.cells[0].status, self.cells[4].status, self.cells[8].status],
[self.cells[2].status, self.cells[4].status, self.cells[6].status],
]
# 1 — победа текущего игрока
if [view] * 3 in lines:
return 1
# 2 — ничья, если ни одной клетке не осталось числа
elif all(isinstance(cell.status, str) for cell in self.cells):
return 2
# 0 — игра продолжается
else:
return 0
class Player:
# У игрока есть имя и знак ('X' или 'O')
def __init__(self, name, view):
self.name = name
self.view = view
def go(self, board, number):
"""
Попытаться походить в клетку с заданным number (1–9).
Вернёт True, если поход успешен, или False, если клетка уже занята / неверный номер.
"""
# Проверяем номер на диапазон
if not (1 <= number <= 9):
return False
# Ищем клетку с этим номером
cell = board.cells[number - 1]
# Если статус — число, клетка свободна
if isinstance(cell.status, int):
cell.status = self.view # ставим 'X' или 'O'
return True
else:
return False # уже было 'X' или 'O'
print("Добро пожаловать в игру «Крестики-нолики»!\n")
# Создаём двух игроков
name1 = input("Имя первого игрока (X): ")
player1 = Player(name1, 'X')
name2 = input("Имя второго игрока (O): ")
player2 = Player(name2, 'O')
# Создаём поле
board = Board()
current = player1 # первый ходит X
result = 0
# Игровой цикл
while True:
board.print_board()
# Спрашиваем у текущего игрока номер клетки
try:
choice = int(input(f"{current.name} ({current.view}), выберите клетку (1–9): "))
except ValueError:
print("Пожалуйста, введите число от 1 до 9.")
continue
# Совершаем ход
if not current.go(board, choice):
print("Неверный ход — клетка занята или номер вне диапазона.")
continue
# Проверяем, не закончилась ли игра
result = board.end_of_game(current.view)
if result == 1:
board.print_board()
print(f"Победа! {current.name} ({current.view}) выиграл!")
break
elif result == 2:
board.print_board()
print("Ничья!")
break
# Меняем игрока
current = player2 if current is player1 else player1
print("Спасибо за игру!")