示例#1
0
 public ShiritoriPreload()
 {
     if (!File.Exists("Saves/Game/ShiritoriJapanese.txt"))
     {
         File.WriteAllBytes("Saves/Game/ShiritoriJapanese.txt", StaticObjects.HttpClient.GetByteArrayAsync("https://files.zirk.eu/Sanara/ShiritoriJapanese.txt").GetAwaiter().GetResult());
     }
     string[] lines = File.ReadAllLines("Saves/Game/ShiritoriJapanese.txt");
     _preload = new ShiritoriPreloadResult[lines.Length];
     for (int i = 0; i < lines.Length; i++)
     {
         string[] curr = lines[i].Split('$');
         string   word = curr[0];
         _preload[i] = new ShiritoriPreloadResult(word, LanguageModule.ToRomaji(word), curr[1]);
     }
 }
示例#2
0
        protected override async Task CheckAnswerInternalAsync(string answer)
        {
            // We convert to hiragana so it's then easier to check if the word really exist
            // Especially for some edge case, like りゅう (ryuu) is starting by "ri" and not by "ry"
            string hiraganaAnswer = LanguageModule.ToHiragana(answer);

            if (hiraganaAnswer.Any(c => c < 0x0041 || (c > 0x005A && c < 0x0061) || (c > 0x007A && c < 0x3041) || (c > 0x3096 && c < 0x30A1) || c > 0x30FA))
            {
                throw new InvalidGameAnswer("Your answer must be in hiragana, katakana or romaji");
            }

            JObject json = JsonConvert.DeserializeObject <JObject>(await StaticObjects.HttpClient.GetStringAsync("http://jisho.org/api/v1/search/words?keyword=" + HttpUtility.UrlEncode(string.Join("%20", hiraganaAnswer))));
            var     data = (JArray)json["data"];

            if (data.Count == 0)
            {
                throw new InvalidGameAnswer("This word doesn't exist.");
            }

            bool   isCorrect = false, isNoun = false;
            string reading;

            string[] meanings = new string[0];
            // For each answer we check if it match our answer
            foreach (var d in data)
            {
                foreach (var jp in d["japanese"])
                {
                    var readingObj = jp["reading"];
                    if (readingObj == null)
                    {
                        continue;
                    }
                    reading = LanguageModule.ToHiragana(readingObj.Value <string>());
                    if (reading == hiraganaAnswer)
                    {
                        isCorrect = true;
                        // For each meaning we check if the word is a noun
                        foreach (var meaning in d["senses"])
                        {
                            foreach (var partSpeech in meaning["parts_of_speech"])
                            {
                                if (partSpeech.Value <string>() == "Noun")
                                {
                                    isNoun   = true;
                                    meanings = ((JArray)meaning["english_definitions"]).Select(x => (string)x).ToArray();
                                    goto ContinueCheck; // The word is valid, we are done with the basic checks
                                }
                            }
                        }
                    }
                }
            }
ContinueCheck:
            if (!isCorrect)
            {
                throw new InvalidGameAnswer("This word doesn't exist.");
            }
            var ending = GetWordEnding(_currWord);

            if (!hiraganaAnswer.StartsWith(ending))
            {
                throw new InvalidGameAnswer($"Your word must begin by {ending} ({LanguageModule.ToRomaji(ending)}).");
            }
            if (!isNoun)
            {
                throw new InvalidGameAnswer("Your word must be a noun.");
            }
            if (hiraganaAnswer == GetWordEnding(hiraganaAnswer)) // We can't just check the word count since しゃ would count as only one character
            {
                throw new InvalidGameAnswer("Your word must be at least 2 characters.");
            }
            if (_alreadySaid.Contains(hiraganaAnswer))
            {
                throw new GameLost("This word was already said.");
            }
            if (hiraganaAnswer.Last() == 'ん')
            {
                throw new GameLost("Your word is finishing with a ん (n).");
            }
            if (_words.Any(x => x.Word == hiraganaAnswer))
            {
                _words.Remove(_words.Where(x => x.Word == hiraganaAnswer).First());
            }
            _alreadySaid.Add(hiraganaAnswer);
            _currWord = hiraganaAnswer;
        }