@page "/" @page "/blackjack" @using БлэкДжек.Components @implements IDisposable @rendermode InteractiveServer

Blackjack

@* Область для сообщений игры *@ @if (!string.IsNullOrEmpty(GameMessage)) { } @* Основной блок игры, отображается после нажатия "Начать" *@ @if (IsGameStarted) {

Дилер @(IsPlayerTurn ? "?" : DealerScore.ToString())

@foreach (var card in DealerHand) {
@if (DealerHand.IndexOf(card) == 0 && IsPlayerTurn) {
} else {
@card.Rank
@card.Suit
@card.Suit
@card.Rank
@card.Suit
}
}

Игрок @PlayerScore

@foreach (var card in PlayerHand) {
@card.Rank
@card.Suit
@card.Suit
@card.Rank
@card.Suit
}
@* Кнопки действий *@
} else {
}
@code { // --- Поля состояния игры --- private Deck GameDeck; private List PlayerHand = new List(); private List DealerHand = new List(); // --- Вычисляемые свойства для счета --- private int PlayerScore => CalculateScore(PlayerHand); private int DealerScore => CalculateScore(DealerHand); // --- Флаги состояния игры --- private bool IsPlayerTurn; private bool IsGameOver; private bool IsGameStarted; private string GameMessage = string.Empty; // --- Инициализация компонента --- protected override void OnInitialized() { IsGameStarted = false; } // --- Метод начала новой игры --- private void StartGame() { GameDeck = new Deck(); GameDeck.Shuffle(); PlayerHand = new List(); DealerHand = new List(); IsGameOver = false; IsPlayerTurn = true; GameMessage = "Ваш ход. Взять карту или стоп?"; IsGameStarted = true; // Раздаем по 2 карты PlayerHand.Add(GameDeck.DealCard()); DealerHand.Add(GameDeck.DealCard()); PlayerHand.Add(GameDeck.DealCard()); DealerHand.Add(GameDeck.DealCard()); // Проверка на блэкджек if (PlayerScore == 21 && DealerHand.Count == 2) { if (DealerScore == 21) { RevealDealerCardAndEndGame("Ничья! У обоих Блэкджек!"); } else { RevealDealerCardAndEndGame("Блэкджек! Вы выиграли!"); } } else if (DealerScore == 21 && DealerHand.Count == 2) { RevealDealerCardAndEndGame("Блэкджек у дилера! Вы проиграли."); } StateHasChanged(); } // --- Действие игрока: Взять карту (Hit) --- private void PlayerHit() { if (!IsPlayerTurn || IsGameOver) return; var newCard = GameDeck.DealCard(); if (newCard != null) { PlayerHand.Add(newCard); if (PlayerScore > 21) { EndGame("Перебор! Вы проиграли."); } else if (PlayerScore == 21) { PlayerStand(); } } else { // Колода пуста, можно обработать этот случай GameMessage = "Колода пуста! Создается новая колода..."; GameDeck = new Deck(); GameDeck.Shuffle(); } StateHasChanged(); } // --- Действие игрока: Стоп (Stand) --- private void PlayerStand() { if (!IsPlayerTurn || IsGameOver) return; IsPlayerTurn = false; GameMessage = "Дилер ходит..."; StateHasChanged(); DealerTurn(); } // --- Логика хода Дилера --- private void DealerTurn() { while (DealerScore < 17) { DealerHand.Add(GameDeck.DealCard()); } DetermineWinner(); StateHasChanged(); } // --- Подсчет очков для руки --- private int CalculateScore(List hand) { if (hand == null || hand.Count == 0) return 0; int score = 0; int aceCount = 0; foreach (var card in hand) { score += card.Value; if (card.Rank == "A") { aceCount++; } } // Корректировка значения Тузов while (score > 21 && aceCount > 0) { score -= 10; aceCount--; } return score; } // --- Определение победителя --- private void DetermineWinner() { if (PlayerScore > 21) { EndGame("Перебор! Вы проиграли."); } else if (DealerScore > 21) { EndGame("У дилера перебор! Вы выиграли!"); } else if (PlayerScore > DealerScore) { EndGame("Вы выиграли!"); } else if (DealerScore > PlayerScore) { EndGame("Дилер выиграл!"); } else // Очки равны { EndGame("Ничья (Push)!"); } } // --- Метод для завершения игры и установки сообщения --- private void RevealDealerCardAndEndGame(string message) { IsPlayerTurn = false; EndGame(message); } private void EndGame(string message) { IsGameOver = true; IsPlayerTurn = false; GameMessage = message; } // --- Вспомогательный метод для определения цвета карты --- private string GetCardColor(Card card) { return (card.Suit == "♥" || card.Suit == "♦") ? "card-red" : "card-black"; } // --- Реализация IDisposable --- public void Dispose() { // Реализация IDisposable } }