/
Junki
/
Datac_hange
Обзор
Документация
Войти
/
Junki
/
Datac_hange
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Core/GameEngine.cs
149 строк
5 KB
Junki
create Core/GameEngine.cs
19 дек 2025, 03:33
19 дек 2025, 03:33
1766194
Код
Авторство
О чём код?
using System; using System.Collections.Generic; namespace WordPuzzle.Core { public class GameEngine { private Board board; private TileBag tileBag; private WordValidator wordValidator; private ScoreCalculator scoreCalculator; private List<Player> players; private int currentPlayerIndex; private Dictionary<Player, int> scores; public GameEngine() { board = new Board(); tileBag = new TileBag(); wordValidator = new WordValidator(); scoreCalculator = new ScoreCalculator(); players = new List<Player>(); scores = new Dictionary<Player, int>(); } public void InitializeGame(int playerCount) { // Создаем игроков for (int i = 0; i < playerCount; i++) { var player = new Player($"Игрок {i + 1}"); players.Add(player); scores[player] = 0; // Раздаем начальные буквы player.Hand = tileBag.DrawTiles(7); } currentPlayerIndex = 0; Console.WriteLine($"Игра началась! Участвуют {playerCount} игрока(ов)."); } public bool MakeMove(Player player, string word, int position) { // Проверяем, чей сейчас ход if (players[currentPlayerIndex] != player) { Console.WriteLine("Сейчас не ваш ход!"); return false; } // Проверяем возможность составления слова if (!wordValidator.CanFormWord(word, player.Hand)) { Console.WriteLine("Нельзя составить это слово из ваших букв!"); return false; } // Проверяем существование слова if (!wordValidator.IsValidWord(word)) { Console.WriteLine("Такого слова не существует!"); return false; } // Пытаемся разместить слово на доске if (!board.TryPlaceWord(word, position)) { Console.WriteLine("Нельзя разместить слово в этой позиции!"); return false; } // Вычисляем очки int wordScore = scoreCalculator.CalculateWordScore(word); scores[player] += wordScore; // Удаляем использованные буквы из руки игрока RemoveUsedLetters(player, word); // Добираем новые буквы List<Tile> newTiles = tileBag.DrawTiles(word.Length); player.Hand.AddRange(newTiles); // Передаем ход следующему игроку currentPlayerIndex = (currentPlayerIndex + 1) % players.Count; Console.WriteLine($"{player.Name} составил слово '{word}' и получил {wordScore} очков!"); return true; } private void RemoveUsedLetters(Player player, string word) { foreach (char letter in word) { var tile = player.Hand.Find(t => t.Letter == letter); if (tile != null) { player.Hand.Remove(tile); } } } public Player GetCurrentPlayer() { return players[currentPlayerIndex]; } public Dictionary<Player, int> GetScores() { return new Dictionary<Player, int>(scores); } public bool IsGameOver() { return tileBag.IsEmpty() && players.All(p => p.Hand.Count == 0); } public Player GetWinner() { if (!IsGameOver()) return null; Player winner = null; int maxScore = -1; foreach (var kvp in scores) { if (kvp.Value > maxScore) { maxScore = kvp.Value; winner = kvp.Key; } } return winner; } } public class Player { public string Name { get; } public List<Tile> Hand { get; set; } public Player(string name) { Name = name; Hand = new List<Tile>(); } } }