A simple tic-tac-toe game for 2 players and 3x3 field.
Project description
tic-tac-toe_3x3
Модуль для реалізації гри хрестики-нулики на полі 3x3. Реалізовано на Python з учбовою метою, але це не заважає використовувати цей пакет для реалізації гри в різноманітних варіантах.
Модуль надає абстрактні класи які визначають інтерфейси для реалізації гри для власних варіантів візуалізації.
В модулі реалізована нескладна консольна гра, яка використовується для демонстрації використання модуля і основних її конструкцій.
1. Інсталяція.
Встановлення модуля:
pip install tic-tac-toe-3x3
2. Використання консольного варіанту гри.
Консольний варіант гри використовується для демонстрації можливостей модуля і використання у якості прикладу використання API модуля для реалізації власних варіантів гри.
2.1. Запуск консольного варіанту гри.
Запуск консольного варіанта гри:
python -m tic_tac_toe_3x3.console_simple
Опціональні параметри для консольного варіанта гри:
- -X, гравець із відміткою "X". За замовченням має значення "human", доступні варіанти:
- 'human' - гравець людина, хід вводиться за допомогою консолі
- 'random' - компʼютерний гравець, хід обирається випадковим чином з доступних
- 'minimax' - компʼютерний гравець з алгоритмом minimax, перший хід (якщо він перший) обирається випадковим чином, далі - оптимальним
- -0, гравець із відміткою "0". За замовченням має значення "minimax", доступні варіанти:
- 'human' - гравець людина, хід вводиться за допомогою консолі
- 'random' - компʼютерний гравець, хід обирається випадковим чином з доступних
- 'minimax' - компʼютерний гравець з алгоритмом minimax, перший хід (якщо він перший) обирається випадковим чином, далі - оптимальним (використовується реалізація мінімаксного алгоритму)
- --starting, визначає хто починає гру. За замовченням має значення "X", доступні варіанти:
- 'X' - гравець із відміткою "X" починає гру
- '0' - гравець із відміткою "0" починає гру
Приклад запуску консольного варіанту гри із запуском двох компʼютериних гравців - з випадковими ходами (X) і використовуючого оптимальну стратегію (0), перший ход робить гравець "0":
python -m tic_tac_toe_3x3.console_simple -X random -0 minimax --starting 0
* - зверніть увагу на використання символу цифри 0 (нуль) а не букви "O"!
2.2. Використання консольного варіанту гри як приклада використання API модуля.
Код консольного варіанту гри розташовано в пакеті tic_tac_toe_3x3.console_simple.
Модулі і призначення:
- __main__.py - використовується для запуску консольного варіанту гри
- args.py - визначає обробку аргументів командного рядка (функція
parse_args). Відповідно до введених параметрів (або не введених - за замовченням) створює відповідних гравців і визначає хто починає гру. - cli.py - визначає основну "стартову" функцію
mainдля режиму командного рядка: отримає від parse_args() всі налаштування для створення гри, створює екземпляр гри ("рушій гри" - екземпляр класу tic_tac_toe_3x3.game.engine.TicTacToe) з конкретними параметрами і запускає цикл гри. - players.py - визначає клас консольного гравця наслідуючись від абстрактного класу
Playerі реалізує метод get_move() - специфічний для консольного гравця метод отримання ходу від гравця. - renderes.py - визначає клас консольного рендерера наслідуючись від абстрактного класу
Rendererі реалізує метод render() - специфічний для відображення гри в консолі. Також реалізує специфічні функції для використання в методі render().
3. Використання модуля для власної реалізації гри.
Створення власної реалізації гри на основі наданого рушія гри (екземпляр класу TicTacToe) буде повторювати логіку
наведеного консольного варіанту:
- визначити клас специфічного гравця на основі абстрактного класу
Playerі реалізувати метод get_move() - отримати хід гравця - визначити клас специфічного рендерера на основі абстрактного класу
Rendererі реалізувати метод render() - відображення специфічного для гри відображення стану гри (поле, повідомлення) - визначити модуль (модулі) які отримують первинні налаштування гри (гравці, хто починає гру), створюють і запускають
відповідний рушій гри (екземпляр класу
TicTacToe), використовуючи визначені класи гравців і рендерера.
4. API модуля.
-
Модуль
tic_tac_toe_3x3.game.engineпакет game містить елементи які реалізують ігровий механізм - в тому разі і в загальному вигляді (абстрактні класи):
-
Клас
TicTacToecтворює гру та реалізує основний ігровий цикл:
-
Параметри:
player1(Player): перший гравець, реалізація якого повинна відповідати абстрактному класуPlayer.player2(Player): другий гравець, реалізація якого повинна відповідати абстрактному класуPlayer.renderer(Renderer): реалізація класу, що наслідує абстрактний класRendererдля відображення поточного стану гри.error_handler(ErrorHandler|None, за замовчуваннямNone): функція для обробки помилок.
-
Методи:
__post_init__(self) -> None: викликається після ініціалізації для перевірки валідності гравців (різні позначки).play(self, starting_mark: Mark = Mark("X")) -> None: створює гру (перший хід визначається параметромstarting_mark), реалізує цикл гри: відобразити стан гри, перевірити умови завершення гри (якщо так - закінчити цикл), отримати наступний хід від чергового гравця (у випадку помилкового ходу - викликати error_handler(), за замовченням - виклик відсутній)get_current_player(self, game_state: GameState) -> Player: повертає гравця, чия черга робити хід.
-
-
-
Модуль
tic_tac_toe_3x3.game.playersвизначає абстрактний клас
Playerдля створення гравців і надає декілька конкретних реалізацій гравців.-
Клас
Playerабстрактний клас, що представляє гравця в грі.
-
Параметри:
mark(Mark): маркер гравця (наприклад, "X" або "O").
-
Методи:
make_move(self, game_state: GameState) -> GameState: абстрактний метод, який повинен бути реалізований у підкласах для виконання ходу гравця.
-
-
Клас
ComputerPlayer(Player)абстрактний клас специфікований для комп'ютерних гравців. Додає затримку перед ходом для імітації "розміреності" гравця.
-
Параметри:
mark(Mark): маркер гравця (наприклад, "X" або "O").delay_seconds(float): затримка перед ходом у секундах. За замовченням встановлюється 0.25 секунди.
-
Методи:
make_move(self, game_state: GameState) -> GameState: реалізує хід гравця із затримкою.get_computer_move(self, game_state: GameState) -> Move: абстрактний метод, що повинен бути реалізований у підкласах для визначення ходу комп'ютерного гравця.
-
-
Клас
RandomComputerPlayer(ComputerPlayer)компʼютерний гравець що реалізує випадковий хід з числа допустимих правилами гри.
-
Параметри:
mark(Mark): маркер гравця (наприклад, "X" або "O").delay_seconds(float): затримка перед ходом у секундах. За замовченням встановлюється 0.25 секунди.
-
-
Клас
MinimaxComputerPlayer(ComputerPlayer)реалізація компʼютерного гравця з алгоритмом minimax для визначення оптимального ходу.
Якщо цей гравець робить перший хід в грі - він робить випадковий хід. Далі обираються оптимальні ходи з точки зору мінімаксної стратегії.
-
Параметри:
mark(Mark): Маркер гравця (наприклад, "X" або "O").delay_seconds(float): затримка перед ходом у секундах. За замовченням встановлюється 0.25 секунди.
-
-
-
Модуль
tic_tac_toe_3x3.game.renderers-
Клас
Rendererабстрактний клас, що представляє рендерер для відображення стану гри.
-
Методи:
render(self, game_state: GameState) -> None: абстрактний метод, який повинен бути реалізований у підкласах для відображення поточного стану гри.
-
-
-
Модуль `tic_tac_toe_3x3.logic.exceptions
-
Клас
InvalidGameStateВиключення, яке виникає при некоректному стані гри.
-
Клас
InvalidMoveВиключення, яке виникає при некоректному ході.
-
Клас
UnknownGameScoreВиключення яке виникає коли граф гри не може бути зважено. Це може сигналізувати про помилковий стан гри.
-
-
Модуль
Надає механізми для реалізації алгоритму minimax для визначення оптимального ходу комп'ютерного гравця.tic_tac_toe_3x3.logic.minimax-
Функція
minimaxдопоміжна функція що реалізує рекурсивний алгоритм minimax оцінки запропонованого ходу (
Movie) повертає оцінку ходу (-1 (програш), 0 (нічия), 1 (перемога)) з точки зору гравцяmaximizerі логіки обрання ходівchoose_highest_score. -
Функція
find_best_moveповертає найкращий хід з можливих для поточного гравця в стані гри
game_state.
-
-
Модуль
Модуль описує моделі що відповідають сутностям гри.tic_tac_toe_3x3.logic.models-
Константа
WINNING_PATTERNSСписок можливих виграшних комбінацій на полі 3x3.
-
Клас
MarkМаркер гравця ("X" або "0").
-
Клас
GridСтан що зберігає і валідує стан сітки (поля гри).
-
Параметри:
cells(str): рядок що описує стан сітки (може складатись тільки з символів "X", "0" і " ", загальна кількість символів - 9).
-
Методи:
__post_init__(self) -> None:викликається після ініціалізації для перевірки валідності стану сітки.
-
Властивості
так якGridє не змінюваним об'єктом, всі властивості - кешовані: обчислюються при першому зверненні, при наступних зверненнях повертаються з кешу.x_count(int): кількість відміток "X" на сітці.o_count(int): кількість відміток "0" на сітці.empty_count(int): кількість пустих клітинок на сітці.
-
-
Клас
MoveОписує хід гравця. Є типовим обʼєктом для передачі стану - DTO.
-
Параметри:
mark(Mark): гравець, що робить хід.cell_index(int): індекс клітинки на полі (від 0 до 8) - куди робить хід гравець.before_state(GameState): стан гри до ходу.after_state(GameState): стан гри після ходу.
-
-
Клас
GameStateОписує стан гри.
-
Параметри:
grid(Grid): стан сітки (поля гри).starting_mark(Mark): маркер гравця що починає гру. За замовченням має значенняMark("X").
-
Методи:
__post_init__(self) -> None:викликається після ініціалізації для перевірки валідності стану гри.make_random_move(Move | None): випадковий хід для поточного гравця.make_move_to(index:int) ->Move: створює хід гравця на клітинку з індексомindex.evalute_score(self, maximizer: Mark) -> int: оцінює стан гри з точки зору гравцяmaximizer(використовується для алгоритму minimax).
-
Властивості
current_mark(Mark): маркер гравця, що робить хід.game_not_started(bool): показує чи гра не почалася (поле пусте).tie(bool): показує чи гра закінчилася в нічию.game_over(bool): показує чи гра закінчилася.winner(Mark | str | None): маркер переможця (якщо є).winning_cells(List[int]): список індексів клітинок, що утворюють виграшну комбінацію (якщо є).possible_moves(List[Move]): список можливих ходів для поточного гравця.
-
-
-
Модуль
tic_tac_toe_3x3.logic.validatorsВключає валідатори що використовуються в інших частинах коду для валідації.
-
Модуль
tic_tac_toe_3x3.console_simpleНадає реалізацію простого консольного варіанту гри. Може бути використано як зразок використання API модуля для реалізації власних варіантів гри.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file tic_tac_toe_3x3-1.0.4.tar.gz.
File metadata
- Download URL: tic_tac_toe_3x3-1.0.4.tar.gz
- Upload date:
- Size: 18.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.0.1 CPython/3.13.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
45aec42c729407c58d06e53e16640dc595b2bbf5dda4bb55a062b4f086bf73ca
|
|
| MD5 |
f3bcd70827f338f6cb792d2bccf93895
|
|
| BLAKE2b-256 |
95e92f0cb55890bef2f3f71c3d670e4eb9686b6a268ad2d7896376ebfbb06340
|
File details
Details for the file tic_tac_toe_3x3-1.0.4-py3-none-any.whl.
File metadata
- Download URL: tic_tac_toe_3x3-1.0.4-py3-none-any.whl
- Upload date:
- Size: 17.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.0.1 CPython/3.13.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
24bfcee592dde5190a7d880af2ba0e979fc87e6f8540c150a097b1f35795968d
|
|
| MD5 |
2a1bd41e987c056746fd3ba73a9904d9
|
|
| BLAKE2b-256 |
86171e5396dff67895f99e8fc110104c1374c136c41eeb7d21698e3953a9fee3
|