void FastGameInSecondThread()
        {
            var state = _currentStateInSecondThread;

            while (!state.IsFinished)
            {
                Turn firstPlayerTurn  = GetTurnFromProgramExecuter(state, state.players[0]);
                Turn secondPlayerTurn = GetTurnFromProgramExecuter(state, state.players[1]);



                SimultaneousTurn turn = new SimultaneousTurn();
                turn.FirstPlayerTurn  = firstPlayerTurn;
                turn.SecondPlayerTurn = secondPlayerTurn;
                //записываем ход и проигрываем его, чтоб можно было дальше программы вызывать

                _engine.DoTurn(ref state, turn);
                recordedTurns.TryAdd(state.turn, turn);
                state.turn++;
                if (state.turn == Const.NumberOfTurns)
                {
                    state.IsFinished = true;
                }
            }

            //сохраним игру полностью
            string file = startTime.ToString("yy-MM-dd-hh-mm-ss")
                          + "-" + (state.players[0].programAddress == null ? "человек" : Path.GetFileNameWithoutExtension(state.players[0].programAddress))
                          + "-" + (state.players[1].programAddress == null ? "человек" : Path.GetFileNameWithoutExtension(state.players[1].programAddress))
                          + "-" + state.players[0].Score.ToString() + "-" + state.players[1].Score.ToString();
            bool success = TrySaveReplay(Application.StartupPath + "\\..\\Replays\\" + file + ".rpl");

            ExternalProgramExecuter.DeleteTempSubdir();
        }
示例#2
0
        void FastGameInSecondThread()
        {
            var state = _currentStateInSecondThread;
            int turnWithExceptionCount = 0;

            GameForm.GameInSecondThreadIsRunning = true;
            while (!state.IsFinished)
            {
                Turn firstPlayerTurn = GetTurnFromProgramExecuter(state, state.players[0]);
                if (firstPlayerTurn != null && firstPlayerTurn.TurnStatus == ExternalProgramExecuteResult.InternalError)
                {
                    turnWithExceptionCount++;
                }
                Turn secondPlayerTurn = GetTurnFromProgramExecuter(state, state.players[1]);

                if (secondPlayerTurn != null && secondPlayerTurn.TurnStatus == ExternalProgramExecuteResult.InternalError)
                {
                    turnWithExceptionCount++;
                }

                bool stopGame = GameForm.UserWantsToClose;
                if (turnWithExceptionCount >= 2)
                {
                    var dialogResult = MessageBox.Show("Внешняя программа несколько раз завершилась с ошибкой. Остановить игру? Да = остановить, Нет = продолжить до следующей ошибки, Отмена = продолжить до конца игры, не обращая внимания на ошибки", "Внимание", MessageBoxButtons.YesNoCancel);
                    if (dialogResult == DialogResult.No)
                    {
                        turnWithExceptionCount = 1;
                    }
                    else if (dialogResult == DialogResult.Yes)
                    {
                        stopGame = true;
                    }
                    else
                    {
                        turnWithExceptionCount = -1000000;
                    }
                }



                SimultaneousTurn turn = new SimultaneousTurn();
                turn.FirstPlayerTurn  = firstPlayerTurn;
                turn.SecondPlayerTurn = secondPlayerTurn;
                //записываем ход и проигрываем его, чтоб можно было дальше программы вызывать

                _engine.DoTurn(ref state, turn);
                recordedTurns.TryAdd(state.turn, turn);
                state.turn++;
                if (state.turn == Const.NumberOfTurns || stopGame)
                {
                    state.IsFinished = true;
                }
            }
            Thread.Sleep(500); //чтобы удалить темп, надо подождать, пока программы отдадут права на редактирование директории
            GameForm.GameInSecondThreadIsRunning = false;

            //сохраним игру полностью
            string file = startTime.ToString("yy-MM-dd-hh-mm-ss")
                          + "-" + (state.players[0].programAddress == null ? "человек" : Path.GetFileNameWithoutExtension(state.players[0].programAddress))
                          + "-" + (state.players[1].programAddress == null ? "человек" : Path.GetFileNameWithoutExtension(state.players[1].programAddress))
                          + "-" + state.players[0].Score.ToString() + "-" + state.players[1].Score.ToString();
            bool success = TrySaveReplay(Application.StartupPath + "\\..\\Replays\\" + file + ".rpl");

            ExternalProgramExecuter.DeleteTempSubdir();
        }