Python крестики нолики классы

ООП. Написать игру крестики-нолики.

Есть вот такое вот задание
Написать игру крестики-нолики, используя как можно больше ООП.
Общие указания.
Все этапы независимы, вы можете реализовывать их в любом порядке.
Создавайте вспомогательные методы по необходимости.
Не забывайте про конструкторы и __str__
Этап 1.
Напишите класс Field — игровое поле. По умолчанию оно имеет размер 3х3.

Игровое поле должно иметь метод для заполнения клетки с указанными координатами указанным символом. Нулевой считается клетка в верхнем левом углу, она имеет координаты (0, 0).
Игровое поле должно иметь метод для проверки, занята ли клетка с указанными координатами, который возвращает True или False.
Игровое поле должно иметь метод для вывода себя на экран. Вместе с полем выводите значения координат, например:

0 1 2
0 o | x | o
————
1 | x |
————
2 | o | x
Этап 2.
Напишите класс Player — игрок.

При создании игрок получает символ, которым ходит.
У игрока должен быть метод, который возвращает координаты клетки, куда выполняется ход. Для игрока-человека координаты вводит пользователь. Если клетка уже занята, нужно вывести сообщение об этом и попросить ввести другую клетку. Метод принимает объект Field в аргументах.
Этап 3.
Напишите класс Brain — бот.

Бот наследуется от игрока.
Бот должен переопределять метод для совершения хода и самостоятельно выбирать клетку, куда будет ходить. Используйте любой алгоритм для выбора клетки, например, случайный выбор пустой клетки на поле. Бот должен выводить сообщение, куда он ходит.
Этап 4.
Напишите класс Checker — проверщик.

Проверщик должен содержать метод для определения, что один из игроков победил — построил на поле линию из одинаковых символов по вертикали, горизонтали или диагонали. Метод принимает объект Field для проверки в аргументах.
Этап 5.
Напишите класс Game — игра. Кроме конструктора, класс игры должен содержать один метод — главный цикл игры:

Читайте также:  Caused by java lang illegalargumentexception could not locate appropriate constructor on class

Выбор типа игры: 1 игрок или 2 игрока
Выбор первого игрока случайным образом
Пока поле не заполнилось или один из игроков не победил:

Ход первого игрока, проверка на победу, вывод игрового поля на экран

Ход второго игрока, проверка на победу, вывод игрового поля на экран

Вывод сообщения о победе.
Вывод «Сыграть ещё?», выход, если игрок отказался.
Должна быть возможность выхода из игры командой exit.
Вот что имеется на данный момент

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211
class Field: EMPTY_CELL = ' ' def __init__(self, size=3): self.size = size self.count = size * size self.cells = [] for i in range(size): self.cells.append([Field.EMPTY_CELL] * size) # print(self.cells) def is_cell_empty(self, x, y): return self.cells[x][y] == Field.EMPTY_CELL def set_cell(self, x, y, value): self.cells[x][y] = value self.count -= 1 def __str__(self): result = " " * 5 for i in range(self.size): result += f"" line = "\n" + " " * 4 + "-" * (self.size * 4 + 1) result += line for i in range(self.size): row = f"" + "|" for j in range(self.size): row += f"" + "|" result += "\n" + row + line return result class Player(): def __init__(self, name, symbol, initial_score=0): self.name= name self.symbol= symbol self.score= initial_score def won_match(self): self.score+= 100 def lost_match(self): self.score-= 50 def show_score(self): print('Игрок <>: <> очки'.format(self.name, self.score)) class Game(): def __init__(self, board, player1, player2): self.board = board self.players = [player1, player2] self.turn = 0 def greet_user(self, currplayer): print ("Очередь игрока " + currplayer.symbol) def play(self): flag = False while flag == False: currplayer = self.players[self.turn] self.board.print_board() self.greet_user(currplayer) move = Move(self.board, currplayer) player_move = move.ask_for_move() self.board.tiles[player_move] = currplayer.symbol winner = self.check_win(currplayer.symbol) if winner != False: self.game_over(winner) flag = True else: self.turn = 1 - self.turn def check_win(self, player_symbol): tiles = self.board.tiles for i in range(3): if tiles[i] == player_symbol and tiles[i+3] == player_symbol and tiles[i+6] == player_symbol: #check for vertical win return player_symbol elif tiles[(i*3)] == player_symbol and tiles[(i*3) + 1] == player_symbol and tiles[(i*3) + 2] == player_symbol: #check for horizontal win return player_symbol if tiles[0] == player_symbol and tiles[4] == player_symbol and tiles[8] == player_symbol: return player_symbol elif tiles[2] == player_symbol and tiles[4] == player_symbol and tiles[6] == player_symbol: return player_symbol return False def game_over(self, player_symbol): print ("Игра закончена! Игрок " + player_symbol + "выиграл") class Checker: def __init__(self): self.field = None def check(self, field): self.field = field.cells for i in range(3): result = self.check_horizontal_line(i) if result: return result for i in range(3): result = self.check_vertical_line(i) if result: return result result = self.check_diagonal_line() if result: return result result = self.check_back_diagonal_line() if result: return result return None def check_horizontal_line(self, line_id): counts = { 'x': 0, 'o': 0, Field.EMPTY_CELL: 0 } for j in range(3): key = self.field[line_id][j] counts[key] += 1 if counts['x'] == 3: return 'x' if counts['o'] == 3: return 'o' return None def check_vertical_line(self, line_id): counts = { 'x': 0, 'o': 0, Field.EMPTY_CELL: 0 } for j in range(3): key = self.field[j][line_id] counts[key] += 1 if counts['x'] == 3: return 'x' if counts['o'] == 3: return 'o' return 0 def check_diagonal_line(self): counts = { 'x': 0, 'o': 0, Field.EMPTY_CELL: 0 } for i in range(3): key = self.field[i][i] counts[key] += 1 if counts['x'] == 3: return 'x' if counts['o'] == 3: return 'o' return None def check_back_diagonal_line(self): counts = { 'x': 0, 'o': 0, Field.EMPTY_CELL: 0 } for i in range(3): key = self.field[i][2 - i] counts[key] += 1 if counts['x'] == 3: return 'x' if counts['o'] == 3: return 'o' return None class Player(): f = Field(3) print(f) p = Player() f.set_cell(1, 0, 'x') print(f) f.set_cell(0, 2, 'x') f.set_cell(1, 1, 'o') f.set_cell(2, 0, 'o') f.set_cell(1, 2, 'x') f.set_cell(2, 2, 'o') f.set_cell(0, 0, 'x') print(f) print(f.is_cell_empty(1, 0)) print(f.is_cell_empty(1, 1)) checker = Checker() print(checker.check(f))

Добавлено через 4 минуты
Окончательно запутался в том что написал.Помогите кто может выполнить задание. c классом Player и с классом Brain

Источник

Крестики-нолики

Напишите класс TicTacToeBoard для игры в крестики-нолики, который должен иметь следующие методы:

new_game() – для создания новой игры;
get_field() – для получения поля (список списков);
check_field() – для проверки, есть ли победитель, который возвращает X, если победил первый игрок, 0, если второй, D, если ничья и None, если можно продолжать игру;
make_move(row, col) – который устанавливает значение текущего хода в ячейку поля с координатами row, col, если это возможно, «переключает» ход игрока, а также возвращает сообщение «Победил игрок X» при победе крестиков, «Победил игрок 0» при победе ноликов, «Ничья» в случае ничьей и «Продолжаем играть», если победитель после данного хода неопределён.
Кроме того, метод make_move должен возвращать сообщение «Клетка , уже занята», если в клетке уже стоит крестик или нолик, и «Игра уже завершена», если в текущей игре уже выявлен победитель или закончились ячейки для ходов.

При создании объекта класса должна создаваться новая игра.
Аргументы row и col метода make_move могут принимать значения от 1 до 3.
Вот мой код

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
class TicTacToeBoard: def __init__(self): self._field = [[None for _ in range(3)] for _ in range(3)] self._current_player = 'X' self._winner = None self._moves_left = 9 def new_game(self): self._field = [[None for _ in range(3)] for _ in range(3)] self._current_player = 'X' self._winner = None self._moves_left = 9 def get_field(self): return self._field def check_field(self): # Проверка строк for i in range(3): if self._field[i][0] == self._field[i][1] == self._field[i][2]: if self._field[i][0] is not None: self._winner = self._field[i][0] # Проверка столбцов for j in range(3): if self._field[0][j] == self._field[1][j] == self._field[2][j]: if self._field[0][j] is not None: self._winner = self._field[0][j] # Проверка диагоналей if self._field[0][0] == self._field[1][1] == self._field[2][2]: if self._field[0][0] is not None: self._winner = self._field[0][0] if self._field[0][2] == self._field[1][1] == self._field[2][0]: if self._field[0][2] is not None: self._winner = self._field[0][2] if self._winner is not None: return self._winner elif self._moves_left == 0: return 'D' else: return None def make_move(self, row, col): if self._winner is not None: return 'Игра уже завершена' if self._field[row - 1][col - 1] is not None: self._field[row - 1][col - 1] = self._current_player self._moves_left -= 1 winner = self.check_field() if winner is not None: if winner == 'X': return 'Победил игрок X' elif winner == '0': return 'Победил игрок 0' else: return 'Ничья' else: if self._current_player == 'X': self._current_player = '0' return 'Продолжаем играть'
1 2 3 4 5 6 7 8 9 10 11 12 13 14
from solution import TicTacToeBoard board = TicTacToeBoard() print(*board.get_field(), sep="\n") print(board.make_move(1, 1)) print(*board.get_field(), sep="\n") print(board.make_move(1, 1)) print(board.make_move(1, 2)) print(*board.get_field(), sep="\n") print(board.make_move(2, 1)) print(board.make_move(2, 2)) print(board.make_move(3, 1)) print(board.make_move(2, 2)) print(*board.get_field(), sep="\n")

А выводит:
[None, None, None]
[None, None, None]
[None, None, None]
None
[None, None, None]
[None, None, None]
[None, None, None]
None
None
[None, None, None]
[None, None, None]
[None, None, None]
None
None
None
None
[None, None, None]
[None, None, None]
[None, None, None]

Подскажите, пожалуйста, как исправить код

Источник

Оцените статью