Exemple #1
0
        /// <summary>
        /// 歌を演奏します。
        /// </summary>
        /// <param name="song">歌</param>
        /// <param name="limitCount">試行回数</param>
        /// <returns>実行結果</returns>
        public PlayResult Play(ISong song, int limitCount = 100)
        {
            // 準備
            _Standby(song);

            var phrases = new List <string>();
            var count   = 0;

            while (!Audience.IsSatisfied)
            {
                // 歌手からフレーズを取得
                phrases.Add(Singer.Sing());
                count++;

                if (song.IsCompleted(phrases.TakeLast(song.CompletePhrasesCount)))
                {
                    // フレーズが完成したら、観客から掛け声を取得
                    var shout = Audience.Shout();

                    // 完成
                    return(new PlayResult.Builder
                    {
                        Song = song,
                        SingerPhrases = phrases,
                        AudienceShout = shout,
                        Message = $"{count:#,##0}回で完成しました。",
                    }.Build());
                }
                else
                {
                    if (limitCount > 0 && count >= limitCount)
                    {
                        // 試行回数を超えた場合
                        return(new PlayResult.Builder
                        {
                            Song = song,
                            SingerPhrases = phrases,
                            Message = $"{count:#,##0}回では完成しませんでした・・・。",
                        }.Build());
                    }
                }
            }
            throw new Exception($"ループが想定通りに終了しませんでした。 [{nameof(song)}:{JsonConvert.SerializeObject(song)}]");
        }
Exemple #2
0
        private IHouse _Standby(ISong song)
        {
            if (song == null)
            {
                throw new InvalidOperationException($"引数[{nameof(song)}]がnullです。");
            }
            if (Singer == null)
            {
                throw new Exception("Singerプロパティが未設定です。");
            }
            if (Audience == null)
            {
                throw new Exception("Audienceプロパティが未設定です。");
            }

            // 準備
            Singer.Standby(song);
            Audience.Standby(song);

            return(this);
        }