You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

99 lines
3.4 KiB

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<string, List<FiveLettersResult>> Results { get; }
public FiveLetterServer(
ITaskProvider wordsProvider,
IDictionaryProvider dictionaryProvider,
int attemptsCount = 0)
{
if (attemptsCount > 0)
{
MaxAttemptsCount = attemptsCount;
}
Results = new Dictionary<string, List<FiveLettersResult>>();
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<FiveLettersResult>();
}
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<FiveLettersItemLetterResult> letterResultAr = new List<FiveLettersItemLetterResult>();
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;
}
}
}
}