/
evsyukov.s
/
test
Обзор
Документация
Войти
/
evsyukov.s
/
test
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/DicePoker.Core/Game/GameState.cs
82 строки
2 KB
ligay.a
Улучшена логика управления состоянием игры
01 дек 2025, 13:24
01 дек 2025, 13:24
b049dd1
Код
Авторство
О чём код?
using System.Text.Json.Serialization; using DicePoker.Core.Models; namespace DicePoker.Core.Game; public sealed class GameState { public Player Player1 { get; } public Player Player2 { get; } public int CurrentPlayerIndex { get; private set; } public DiceHand Hand { get; } public int RerollsLeft { get; private set; } public int TurnNumber { get; private set; } public int SecondsPerMove { get; private set; } public IReadOnlyList<string> History => _history; [JsonInclude] private readonly List<string> _history = new(); [JsonConstructor] public GameState(Player player1, Player player2, int currentPlayerIndex, DiceHand hand, int rerollsLeft, int turnNumber, int secondsPerMove, List<string>? history = null) { Player1 = player1; Player2 = player2; CurrentPlayerIndex = currentPlayerIndex; Hand = hand; RerollsLeft = rerollsLeft; TurnNumber = turnNumber; SecondsPerMove = secondsPerMove <= 0 ? 0 : secondsPerMove; if (history != null) { _history = new List<string>(history); } } public GameState(string p1, string p2, int secondsPerMove = 0) { Player1 = new Player(p1); Player2 = new Player(p2); CurrentPlayerIndex = 0; Hand = new DiceHand(); RerollsLeft = 2; TurnNumber = 1; SecondsPerMove = secondsPerMove <= 0 ? 0 : secondsPerMove; } public Player CurrentPlayer => CurrentPlayerIndex == 0 ? Player1 : Player2; public Player OtherPlayer => CurrentPlayerIndex == 0 ? Player2 : Player1; public void StartTurn() { RerollsLeft = 2; Hand.RollAll(); AddHistory($"Turn {TurnNumber}: {CurrentPlayer.Name} rolled [{string.Join(",", Hand.Values())}]"); } public bool CanReroll => RerollsLeft > 0; public void Reroll(params int[] indices) { if (RerollsLeft <= 0) throw new InvalidOperationException("No rerolls left"); Hand.RerollIndices(indices); RerollsLeft--; AddHistory($"{CurrentPlayer.Name} rerolled indices [{string.Join(",", indices)}] -> [{string.Join(",", Hand.Values())}]"); } public HandRank EndTurnAndScore() { var values = Hand.Values(); var rank = Logic.HandEvaluator.Evaluate(values); CurrentPlayer.AddScore(rank.ScoreValue); AddHistory($"{CurrentPlayer.Name} finished with {rank.Category} ({string.Join(",", values)}) => +{rank.ScoreValue}"); CurrentPlayerIndex = 1 - CurrentPlayerIndex; TurnNumber++; return rank; } private void AddHistory(string entry) { _history.Add($"{DateTime.Now:HH:mm:ss} {entry}"); } }