##Проєкт складається з двох частин:
ClassLibrary– містить всю ігрову логіку, моделі та сервіси.WindowsFormsBlackjack– графічний інтерфейс користувача (Windows Forms).
##ClassLibrary – Логіка гри
###Моделі
CardData– збережена інформація про карту (Value,Suit).GameSaveData– стан гри: руки, баланси, поточна ставка, стан гри.
###Гравець (Player)
- Властивості:
Hand,HandsBalance,CurrentBet
- Методи:
PlaceBet(float)WinBet(),LoseBet(),ReturnBet()DoubleBet()SplitHand()ReceiveCard(Card)ResetHand()
CalculateScore(Player)– обрахунок очок з урахуванням тузів.IsBust(Player)– перевірка на перевищення 21.
GetWinner(Player, Dealer)– визначення переможця (Player, Dealer або Tie).
PlayerAction–Hit,Stand,Double,SplitGameResult–PlayerWin,DealerWin,Tie,PlayerBust,DealerBustGameState–NotStarted,WaitingForBet,PlayerTurn,DealerTurn,GameOver, ...
Save(GameManager)Load(): GameSaveDataDeleteSave()
Зберігає гру у
savegame.jsonчерезSystem.Text.Json.
- Методи:
Flip()SetCard(string)SetFaceUp(bool)
- Ініціалізація компонентів:
GameManager,CardAnimator,GameSaver. - Завантаження збереженої гри.
- Події:
OnGameStateChanged→UpdateUI()OnGameEnded→HandleGameEnd()
- Кнопки:
Hit,Stand,Double,Split,Start
- Панелі:
GamePanel– відображення карт.panelWinDesk– результат гри.
- ✅ Збереження/завантаження стану гри (
.json) - ✅ Анімація
- ✅ Можливість легкої модифікації завдяки UI
Проєкт дотримується низки принципів програмування, що забезпечують чистий, підтримуваний та ефективний код:
-
Принцип єдиної відповідальності (SRP)
Кожен клас виконує лише одну роль:Playerуправляє станом гравця,ScoreServiceвідповідає за обчислення очок, аGameSaver— за збереження гри. -
Принцип відкритості/закритості (OCP)
Класи можна розширювати без зміни наявного коду. Наприклад, додавання нових бонусів не потребує змін уScoreService— достатньо нової реалізації. -
Принцип підстановки Лісков (LSP)
Усі похідні класи (наприклад,SpriteCard, що наслідуєPictureBox) можуть замінювати базові без порушення логіки — це гарантує коректність при взаємодії з UI. -
Принцип розділення інтерфейсу (ISP)
Інтерфейси створюються вузькоспеціалізованими (наприклад,ICardAnimator,IGameSaver), що дозволяє класам реалізовувати лише необхідні методи. -
Принцип інверсії залежностей (DIP)
Класи вищого рівня (наприклад,Form1) не залежать напряму від реалізацій, а використовують абстракції (сервісиGameSaver,ScoreService), що полегшує модульність та тестування.
- Повторюваний код винесено в окремі сервіси: анімація карт — в
CardAnimator, логіка очок — уScoreService, збереження — уGameSaver.
- Структура проста та очевидна: логіка і UI розділені, кожен клас має чітке призначення.
- Реалізовано лише необхідні функції для гри у Blackjack: базові правила, анімації, збереження гри. Функціонал на майбутнє не додається передчасно.
У проєкті реалізовано кілька класичних шаблонів проєктування для зручності розширення та повторного використання:
- Створення колоди відбувається централізовано через
DeckService, що дозволяє змінювати логіку ініціалізації (наприклад, додати джокери) без змін в UI.
- Логіка оцінки виграшу (
WinEvaluator) може бути замінена на іншу реалізацію (наприклад, для гри за іншими правилами) без зміни основного коду гри.
- Деякі сервіси можуть поводитися як одинак (наприклад,
GameSaverабоLogger), забезпечуючи глобальний доступ до єдиного екземпляра.
- Клас
GameManagerповідомляє інші компоненти про зміну стану гри через події (наприклад,OnGameStateChanged,OnGameEnded), що дозволяє розділити логіку та UI.
- Model — логіка гри в окремій бібліотеці
ClassLibrary. - View — інтерфейс користувача, реалізований у
WindowsFormsBlackjack(Form1,SpriteCard). - Controller — клас
GameManager, який обробляє дії користувача та оновлює стан моделі та уявлення.
