TCP Monopoly — сетевой проект на C++/Qt: многопользовательская игра в стиле Monopoly с подключением по TCP, JSON-протоколом, лобби, чатом, игровым полем, покупкой бизнесов, арендой, улучшениями, аукционами и поддержкой админ-команд.
- подключение игроков по TCP;
- лобби с готовностью игроков;
- автоматический старт игры после готовности всех участников;
- случайная выдача аватаров без повторений;
- бросок кубиков на стороне сервера;
- перемещение игрока по полю;
- покупка свободных бизнес-клеток;
- начисление аренды владельцу клетки;
- группы бизнесов и увеличение аренды при владении группой;
- равномерная постройка улучшений;
- карточки Chance / Community Chest;
- тюрьма, парковка, стартовая клетка;
- аукцион при отказе от покупки;
- банкротство и определение победителя;
- игровой чат;
- события игры в логе;
- обработка админ-действий через сетевой протокол.
- C++17
- Qt 6
- Qt Widgets — пользовательский интерфейс
- Qt Network — TCP-сервер и TCP-клиент
- Qt Svg — отображение SVG-иконок
- Qt Multimedia — звуки
- Qt Test — регрессионные тесты
- CMake
Проект разделён на несколько основных слоёв:
TCPMonopoly
├── game # игровая логика, правила, состояние игры
├── network # TCP-сервер, TCP-клиент, JSON-сообщения
├── ui # Qt Widgets интерфейс
├── services # вспомогательные сервисы, например звук
├── resources # изображения, SVG, аудио, QSS
└── tests # регрессионные тесты
Основные классы:
GameController— управляет игровым процессом;GameState— хранит состояние игроков, поля, текущего хода и статуса игры;GameRules— содержит правила покупки, аренды, построек и проверок;GameSession— объединяет состояние игровой сессии.
Основные классы:
TcpServerController— принимает подключения, управляет лобби, игрой, аукционами и рассылкой состояния;TcpClientController— подключается к серверу, отправляет действия игрока и принимает обновления;NetworkMessage— сериализация и десериализация JSON-сообщений.
Основные элементы:
MainWindow— главный экран и навигация между меню, лобби и игрой;MenuWidget— экран создания/подключения к игре;LobbyWidget— лобби игроков;GameWidget— основной игровой экран;BoardWidget— отрисовка игрового поля, фишек, событий и чата;DiceWidget— отображение кубиков;PurchaseOfferDialog— предложение покупки клетки;AuctionDialog— интерфейс аукциона.
Взаимодействие клиента и сервера построено на TCP и JSON-сообщениях.
Общий формат сообщения:
{
"type": "message_type",
"senderId": 1,
"payload": {}
}Пример запроса подключения:
{
"type": "connect_request",
"senderId": 0,
"payload": {
"nickname": "Player"
}
}Пример действия игрока:
{
"type": "player_action",
"senderId": 2,
"payload": {
"action": "roll_dice"
}
}- Игрок вводит имя и подключается к серверу.
- Сервер добавляет игрока в лобби и выдаёт ему аватар.
- Когда все игроки готовы, начинается обратный отсчёт.
- После старта игроки по очереди бросают кубики.
- Сервер перемещает игрока и обрабатывает клетку.
- Если клетка свободна, игрок может купить её или отказаться.
- При отказе от покупки может начаться аукцион.
- Если клетка принадлежит другому игроку, списывается аренда.
- При банкротстве игрок выбывает из игры.
- Побеждает последний активный игрок.
Перед финальной сдачей были выполнены следующие улучшения:
- удалены лишние и дублирующиеся участки кода;
- бросок кубиков перенесён полностью на сторону сервера;
- состояние аукциона сгруппировано в
AuctionState; - обработка клиентских сетевых сообщений вынесена в message router на основе
QHash<QString, std::function<...>>; - изображения клеток кэшируются в
BoardWidget; - SVG и PNG больше не загружаются заново при каждой перерисовке поля;
- добавлены регрессионные тесты для ключевых правил игры.
Кэш изображений особенно важен для BoardWidget, потому что игровое поле часто перерисовывается во время анимации фишек.
- CMake 3.20+
- Qt 6.11.1
- Компилятор с поддержкой C++17
cmake -S . -B build
cmake --build buildДля Qt Creator обычно достаточно открыть CMakeLists.txt, выбрать Qt Kit и собрать проект.
После сборки запустить исполняемый файл:
./TCPMonopolyНа Windows путь может выглядеть так:
build/Desktop_Qt_6_11_1_MinGW_64_bit-Debug/TCPMonopoly.exeВ приложении можно создать игру или подключиться к серверу по IP.
По умолчанию сервер использует TCP-порт:
7777
В проект добавлены тесты для проверки ключевых игровых правил.
Покрываются сценарии:
- полное владение группой увеличивает аренду;
- частичное владение группой корректно влияет на аренду;
- нельзя строить улучшения неравномерно;
- можно строить улучшения при корректном состоянии группы;
- нельзя купить уже занятую клетку;
- нельзя купить клетку без достаточного баланса;
- поиск ближайшего бизнеса работает с переходом через конец поля;
- клиент не может подменить результат броска кубиков через
payload.
cmake --build build --target TCPMonopolyRegressionTestsctest --test-dir build --output-on-failureinclude/
├── game/
├── network/
├── services/
└── ui/
src/
├── game/
├── network/
├── services/
└── ui/
resources/
├── audio/
├── img/
└── styles/
tests/
└── regression_tests.cpp
| Тип сообщения | Назначение |
|---|---|
connect_request |
запрос подключения |
connect_accepted |
успешное подключение игрока |
lobby_update |
обновление списка игроков в лобби |
ready_changed |
изменение готовности игрока |
countdown_update |
обновление таймера старта |
game_started |
старт игры |
game_state |
актуальное состояние игры |
game_event |
событие игрового лога |
chat_message |
сообщение чата |
player_action |
действие игрока |
purchase_offer |
предложение купить клетку |
auction_update |
обновление аукциона |
auction_finished |
завершение аукциона |
server_disconnect |
отключение от сервера |
admin_action |
действие администратора |
Проект демонстрирует разработку сетевой настольной игры на C++/Qt с разделением на игровую логику, сетевой слой и пользовательский интерфейс. В финальной версии добавлены оптимизации отрисовки, улучшена структура сетевой обработки и подготовлены регрессионные тесты для защиты от повторного появления критичных ошибок.