Advertisement
Hasli4

Untitled

Apr 18th, 2025
300
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.69 KB | None | 0 0
  1. class Cell:
  2.     # Клетка, у которой есть:
  3.     #  - номер (1–9)
  4.     #  - статус (либо сам номер, либо 'X' / 'O')
  5.     def __init__(self, number, status):
  6.         self.number = number
  7.         self.status = status
  8.  
  9.  
  10. class Board:
  11.     # Поле из 9 клеток
  12.     def __init__(self):
  13.         self.cells = []
  14.         for i_cell in range(1, 10):
  15.             # Стартово в каждой клетке хранится её номер
  16.             cell = Cell(i_cell, i_cell)
  17.             self.cells.append(cell)
  18.  
  19.     def print_board(self):
  20.         # Печатаем 3×3 доску
  21.         for cell in self.cells:
  22.             # Если клетка не крайняя в строке, выводим с " |"
  23.             if cell.number % 3 != 0:
  24.                 print(f' {cell.status} |', end='')
  25.             else:
  26.                 # Крайний столбец, печатаем и перехід на новую строку
  27.                 print(f' {cell.status} ')
  28.                 print('------------')
  29.  
  30.     def end_of_game(self, view):
  31.         # Собираем все 8 возможных линий-побед
  32.         lines = [
  33.             [self.cells[0].status, self.cells[1].status, self.cells[2].status],
  34.             [self.cells[3].status, self.cells[4].status, self.cells[5].status],
  35.             [self.cells[6].status, self.cells[7].status, self.cells[8].status],
  36.             [self.cells[0].status, self.cells[3].status, self.cells[6].status],
  37.             [self.cells[1].status, self.cells[4].status, self.cells[7].status],
  38.             [self.cells[2].status, self.cells[5].status, self.cells[8].status],
  39.             [self.cells[0].status, self.cells[4].status, self.cells[8].status],
  40.             [self.cells[2].status, self.cells[4].status, self.cells[6].status],
  41.         ]
  42.         # 1 — победа текущего игрока
  43.         if [view] * 3 in lines:
  44.             return 1
  45.         # 2 — ничья, если ни одной клетке не осталось числа
  46.         elif all(isinstance(cell.status, str) for cell in self.cells):
  47.             return 2
  48.         # 0 — игра продолжается
  49.         else:
  50.             return 0
  51.  
  52.  
  53. class Player:
  54.     # У игрока есть имя и знак ('X' или 'O')
  55.     def __init__(self, name, view):
  56.         self.name = name
  57.         self.view = view
  58.  
  59.     def go(self, board, number):
  60.         """
  61.        Попытаться походить в клетку с заданным number (1–9).
  62.        Вернёт True, если поход успешен, или False, если клетка уже занята / неверный номер.
  63.        """
  64.         # Проверяем номер на диапазон
  65.         if not (1 <= number <= 9):
  66.             return False
  67.  
  68.         # Ищем клетку с этим номером
  69.         cell = board.cells[number - 1]
  70.         # Если статус — число, клетка свободна
  71.         if isinstance(cell.status, int):
  72.             cell.status = self.view  # ставим 'X' или 'O'
  73.             return True
  74.         else:
  75.             return False  # уже было 'X' или 'O'
  76.  
  77.  
  78.  
  79. print("Добро пожаловать в игру «Крестики-нолики»!\n")
  80.  
  81. # Создаём двух игроков
  82. name1 = input("Имя первого игрока (X): ")
  83. player1 = Player(name1, 'X')
  84.  
  85. name2 = input("Имя второго игрока (O): ")
  86. player2 = Player(name2, 'O')
  87.  
  88. # Создаём поле
  89. board = Board()
  90.  
  91. current = player1  # первый ходит X
  92. result = 0
  93.  
  94. # Игровой цикл
  95. while True:
  96.     board.print_board()
  97.     # Спрашиваем у текущего игрока номер клетки
  98.     try:
  99.         choice = int(input(f"{current.name} ({current.view}), выберите клетку (1–9): "))
  100.     except ValueError:
  101.         print("Пожалуйста, введите число от 1 до 9.")
  102.         continue
  103.  
  104.     # Совершаем ход
  105.     if not current.go(board, choice):
  106.         print("Неверный ход — клетка занята или номер вне диапазона.")
  107.         continue
  108.  
  109.     # Проверяем, не закончилась ли игра
  110.     result = board.end_of_game(current.view)
  111.     if result == 1:
  112.         board.print_board()
  113.         print(f"Победа! {current.name} ({current.view}) выиграл!")
  114.         break
  115.     elif result == 2:
  116.         board.print_board()
  117.         print("Ничья!")
  118.         break
  119.  
  120.     # Меняем игрока
  121.     current = player2 if current is player1 else player1
  122.  
  123. print("Спасибо за игру!")
  124.  
  125.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement