using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; namespace FiveLetters.Model { public class FiveLetterServer { private readonly int MaxAttemptsCount = 6; private readonly ITaskProvider _wordsProvider; private readonly IDictionaryProvider _dictionaryProvider; Dictionary> Results { get; } public FiveLetterServer( ITaskProvider wordsProvider, IDictionaryProvider dictionaryProvider, int attemptsCount = 0) { if (attemptsCount > 0) { MaxAttemptsCount = attemptsCount; } Results = new Dictionary>(); this._wordsProvider = wordsProvider; this._dictionaryProvider = dictionaryProvider; } public FiveLettersResult Turn(string user, string word) { FiveLettersResult result = GetResult(user); string effectiveWord = word.Substring(0, 5); // TODO: check by dictionary for word existence if (!_dictionaryProvider.CheckWordForExistence(effectiveWord)) { return null; } var task = _wordsProvider.GetTask(result.TaskGuid); h_PerformAnalyzeWordToTask(effectiveWord, task, result); return result; } public FiveLettersResult GetResult(string user) { if (!Results.ContainsKey(user)) { Results[user] = new List(); } FiveLettersTask task = _wordsProvider.GetTodayTask(); foreach (FiveLettersResult result in Results[user]) { if (result.TaskGuid.Equals(task.TaskGuid)) { // пользователь уже играет return result; } } // пользователь еще не играет FiveLettersResult resultNew = new FiveLettersResult(user, task.TaskGuid); resultNew.Result = EResultGameType.InProcess; Results[user].Add(resultNew); return resultNew; } private void h_PerformAnalyzeWordToTask(string word, FiveLettersTask task, FiveLettersResult result) { List letterResultAr = new List(); for (int ii = 0; ii < word.Length; ii++) { char letter = (char)word[ii]; if (letter.Equals(task.Word[ii])) { letterResultAr.Add(new FiveLettersItemLetterResult(EResultLetterType.FullMatch, letter)); } else { if (task.Word.Contains(letter)) { letterResultAr.Add(new FiveLettersItemLetterResult(EResultLetterType.PartialMatch, letter)); } } } result.AddAttempt(letterResultAr); if (word.Equals(task.Word)) { result.Result = EResultGameType.Finished; } if (result.Attempts.Count >= MaxAttemptsCount) { result.Result = EResultGameType.Failed; } } } }