Пример #1
0
        // -- private methods

        private void ChangeState(UsiEngineState state)
        {
            switch (state)
            {
            case UsiEngineState.Connected:
                // 接続されたので"usi"と送信
                // これ、接続タイムアウトがある。
                connected_time = DateTime.Now;
                SendCommand("usi");
                break;

            case UsiEngineState.UsiOk:
                // このタイミングで状態が変更になったことを通知すべき
                // エンジン設定時には、この状態で待たせておけば良い。

                // 対局時には、このあと "isready"を送信して readyokを待つ。
                if (!EngineSetting)
                {
                    // これ時間制限はなく、タイムアウトは監視しない。どこかでisreadyは完了するものとする。
                    SendCommand("isready");
                }
                break;

            case UsiEngineState.InTheGame:
                // "readyok"が来たのでusinewgameを送信して、対局の局面を送信できるようにしておく。
                SendCommand("usinewgame");
                break;
            }
            var oldState = State;

            State = state;

            Log.Write(LogInfoType.UsiServer, $"ChangeState()で{oldState.ToString()}から{state.ToString()}に状態が変化した。");
        }
Пример #2
0
        // -- private methods

        private void ChangeState(UsiEngineState state)
        {
            var oldState = State;

            State = state; // この瞬間にイベントが発生するので、これを先にやっておかないとSendSetOptionList()などで困る。

            Log.Write(LogInfoType.UsiServer, $"ChangeState()で{oldState.ToString()}から{state.ToString()}に状態が変化した。");

            switch (state)
            {
            case UsiEngineState.Connected:
                // 接続されたので"usi"と送信
                SendCommand("usi");
                State = UsiEngineState.WaitUsiOk;

                // これ、応答タイムアウトがある。15秒。
                // これを超えるなら定期的に改行などkeep alive的な何かをエンジン側から定期的に送信すべきである。
                ResetTimeOutTime();
                break;

            case UsiEngineState.UsiOk:
                // このタイミングで状態が変更になったことを通知すべき
                // エンジン設定時には、この状態で待たせておけば良い。

                // 対局時には、このあと "isready"を送信して readyokを待つ。
                if (!EngineSetting)
                {
                    // このタイミングでoptionを先に送らないとEvalDirの変更などが間に合わない。
                    SendSetOptionList();

                    SendCommand("isready");
                    State = UsiEngineState.WaitReadyOk;

                    // これもタイムアウトがある。30秒。
                    // これを超えるなら定期的に改行などkeep alive的な何かをエンジン側から定期的に送信すべきである。
                    ResetTimeOutTime();
                }
                break;

            case UsiEngineState.InTheGame:
                // "readyok"が来たのでusinewgameを送信して、対局の局面を送信できるようにしておく。
                SendCommand("usinewgame");
                break;

            // -- time out

            case UsiEngineState.ConnectionTimeout:
                throw new Exception("エンジンからの応答がtimeoutになりました。エンジンのusiコマンドに対する応答が遅すぎます。" +
                                    "毎回タイムアウトになるなら、設定→エンジン補助設定でusiコマンドに対するタイムアウトまでの時間を増やしてください。");

            case UsiEngineState.IsReadyTimeout:
                throw new Exception("エンジンからの応答がtimeoutになりました。エンジンのisreadyコマンドに対する応答が遅すぎます。" +
                                    "毎回タイムアウトになるなら、設定→エンジン補助設定でisreadyコマンドに対するタイムアウトまでの時間を増やしてください。");

                // これ以外の変化に対する応答は必要ない。
            }
        }
Пример #3
0
        // -- private methods

        private void ChangeState(UsiEngineState state)
        {
            var oldState = State;

            State = state; // この瞬間にイベントが発生するので、これを先にやっておかないとSendSetOptionList()などで困る。

            Log.Write(LogInfoType.UsiServer, $"ChangeState()で{oldState.ToString()}から{state.ToString()}に状態が変化した。");

            switch (state)
            {
            case UsiEngineState.Connected:
                // 接続されたので"usi"と送信
                // これ、応答タイムアウトがあるので現在時刻を保存。
                connected_time = DateTime.Now;
                SendCommand("usi");
                break;

            case UsiEngineState.UsiOk:
                // このタイミングで状態が変更になったことを通知すべき
                // エンジン設定時には、この状態で待たせておけば良い。

                // 対局時には、このあと "isready"を送信して readyokを待つ。
                if (!EngineSetting)
                {
                    // このタイミングでoptionを先に送らないとEvalDirの変更などが間に合わない。
                    SendSetOptionList();

                    // これ時間制限はなく、タイムアウトは監視しない。どこかでisreadyは完了するものとする。
                    SendCommand("isready");
                }
                break;

            case UsiEngineState.InTheGame:
                // "readyok"が来たのでusinewgameを送信して、対局の局面を送信できるようにしておく。
                SendCommand("usinewgame");
                break;

            case UsiEngineState.ConnectionTimeout:
                throw new Exception("エンジンからの応答がtimeoutになりました。エンジンのusiコマンドに対する応答が遅すぎます。");

                // これ以外の変化に対する応答は必要ない。
            }
        }
Пример #4
0
        public static string ToString(this UsiEngineState state)
        {
            switch (state)
            {
            case UsiEngineState.Init:              return("Init");

            case UsiEngineState.Connected:         return("Connected");

            case UsiEngineState.UsiOk:             return("UsiOk");

            case UsiEngineState.ReadyOk:           return("ReadyOk");

            case UsiEngineState.InTheGame:         return("InTheGame");

            case UsiEngineState.ConnectionFailed:  return("ConnectionFailed");

            case UsiEngineState.ConnectionTimeout: return("ConnectionTimeout");

            default: return("");
            }
        }