Skip to content

Monopoly-team/Monopoly-Client

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

65 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

TCP Monopoly

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       # регрессионные тесты

Game layer

Основные классы:

  • GameController — управляет игровым процессом;
  • GameState — хранит состояние игроков, поля, текущего хода и статуса игры;
  • GameRules — содержит правила покупки, аренды, построек и проверок;
  • GameSession — объединяет состояние игровой сессии.

Network layer

Основные классы:

  • TcpServerController — принимает подключения, управляет лобби, игрой, аукционами и рассылкой состояния;
  • TcpClientController — подключается к серверу, отправляет действия игрока и принимает обновления;
  • NetworkMessage — сериализация и десериализация JSON-сообщений.

UI layer

Основные элементы:

  • 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"
  }
}

Игровой процесс

  1. Игрок вводит имя и подключается к серверу.
  2. Сервер добавляет игрока в лобби и выдаёт ему аватар.
  3. Когда все игроки готовы, начинается обратный отсчёт.
  4. После старта игроки по очереди бросают кубики.
  5. Сервер перемещает игрока и обрабатывает клетку.
  6. Если клетка свободна, игрок может купить её или отказаться.
  7. При отказе от покупки может начаться аукцион.
  8. Если клетка принадлежит другому игроку, списывается аренда.
  9. При банкротстве игрок выбывает из игры.
  10. Побеждает последний активный игрок.

Рефакторинг и оптимизации

Перед финальной сдачей были выполнены следующие улучшения:

  • удалены лишние и дублирующиеся участки кода;
  • бросок кубиков перенесён полностью на сторону сервера;
  • состояние аукциона сгруппировано в AuctionState;
  • обработка клиентских сетевых сообщений вынесена в message router на основе QHash<QString, std::function<...>>;
  • изображения клеток кэшируются в BoardWidget;
  • SVG и PNG больше не загружаются заново при каждой перерисовке поля;
  • добавлены регрессионные тесты для ключевых правил игры.

Кэш изображений особенно важен для BoardWidget, потому что игровое поле часто перерисовывается во время анимации фишек.


Сборка проекта

Требования

  • CMake 3.20+
  • Qt 6.11.1
  • Компилятор с поддержкой C++17

Сборка через CMake

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 TCPMonopolyRegressionTests

Запуск через CTest

ctest --test-dir build --output-on-failure

Основные директории

include/
├── 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 с разделением на игровую логику, сетевой слой и пользовательский интерфейс. В финальной версии добавлены оптимизации отрисовки, улучшена структура сетевой обработки и подготовлены регрессионные тесты для защиты от повторного появления критичных ошибок.

About

No description, website, or topics provided.

Resources

Stars

2 stars

Watchers

1 watching

Forks

Packages

 
 
 

Contributors