public PlayTimer() { KifuMoveTime = new KifuMoveTime(); Stopwatch = new Stopwatch(); Stopwatch.Stop(); KifuTimeSetting = new KifuTimeSetting(); // デフォルトで何かセットしておかないと起動後の描画でnull参照になってしまう。 }
/// <summary> /// 自分の手番が終わり。 /// タイマーを終了する。 /// MoveTimeに今回の消費時間等を反映させる。 /// IncTimeの時はタイマーが加算される。 /// /// 引数のtimeUpは、タイムアップになったかのフラグ /// TimeUpのときは、IncTimeによって残り時間が増えてしまうと、 /// 残り時間があるにも関わらずタイムアップになったように見えるといけないので /// IncTimeしない。 /// </summary> public void ChageToThemTurn(bool timeUp) { StopTimer(); // 今回の指し手の計測時間 var thinkingTime = ThinkingTime(); // ElapsedTime()が0を返すようにしておく。 // (そうしないとDisplayShortString()で残り時間を表示するときにさらに消費時間を引かれてしまう) startTime = Stopwatch.ElapsedMilliseconds; var restTime = KifuMoveTime.RestTime; // 計測時間をRestTimeから減らす restTime -= thinkingTime; if (restTime < TimeSpan.Zero) { restTime = TimeSpan.Zero; } // IncTimeの処理 // TimeUpのときは、IncTimeによって残り時間が増えてしまうと、 // 残り時間があるにも関わらずタイムアップになったように見えるといけないので // IncTimeしない。 if (!timeUp && KifuTimeSetting.IncTimeEnable) { restTime += new TimeSpan(0, 0, KifuTimeSetting.IncTime); } // 実消費時間 var realThinkingTime = RealThinkingTime(); // KifuMoveTimeに反映するので、そこから取り出すべし。 KifuMoveTime = new KifuMoveTime(thinkingTime, realThinkingTime, KifuMoveTime.TotalTime + thinkingTime, restTime); }
/// <summary> /// ゲーム開始なので、TimeSettingの時間をRestTimeに反映させる。 /// </summary> public void GameStart() { KifuMoveTime = new KifuMoveTime( TimeSpan.Zero, // まだ指してないので、指し手の時間 = 0 TimeSpan.Zero, // まだ指してないので、指し手の時間 = 0 TimeSpan.Zero, // 総消費時間 = 0 new TimeSpan(KifuTimeSetting.Hour, KifuTimeSetting.Minute, KifuTimeSetting.Second) // 残り持ち時間 ); Init(); }
/// <summary> /// 自分の手番になった。 /// </summary> public void ChangeToOurTurn() { var restTime = KifuMoveTime.RestTime; // byoyomiありかも知れないのでいったんリセットする。 if (restTime < TimeSpan.Zero) { restTime = TimeSpan.Zero; } var k = KifuMoveTime; KifuMoveTime = new KifuMoveTime(k.ThinkingTime, k.RealThinkingTime, k.TotalTime, restTime); StartTimer(); }
/// <summary> /// 自分の手番になった。 /// </summary> public void ChangeToOurTurn() { var restTime = KifuMoveTime.RestTime; // byoyomiありかも知れないので残り時間がマイナスなのについては、いったんリセットする。 if (restTime < TimeSpan.Zero) { restTime = TimeSpan.Zero; } // 秒加算 if (KifuTimeSetting.IncTimeEnable) { restTime += new TimeSpan(0, 0, KifuTimeSetting.IncTime); } var k = KifuMoveTime; KifuMoveTime = new KifuMoveTime(k.ThinkingTime, k.RealThinkingTime, k.TotalTime, restTime); StartTimer(); timeUp_ = false; }
/// <summary> /// KifuMoveTimeを内部の状態に反映させる。 /// 中断局の再開処理や待ったの時に、KifuMoveTimeによってこのクラスの状態をリセットしないといけないので /// そのための処理。 /// /// このあと、ChangeToMyTurn()が呼び出されることを前提 /// </summary> /// <param name="kifuMoveTime"></param> public void SetKifuMoveTime(KifuMoveTime kifuMoveTime) { KifuMoveTime = kifuMoveTime; Init(); }