Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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×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("Спасибо за игру!")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement