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
99 lines
3.4 KiB
|
9 months ago
|
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;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|