Exemplo n.º 1
0
        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();
        }
Exemplo n.º 2
0
        void ProcessStoneSpawn(ref State state, SimultaneousTurn turn)
        {
            state.inStoneProcessCount++;

            if (state.stoneCount >= Const.MaxStones)
            {
                return;
            }
            state.inStoneContinueCount++;
            Random rand         = new Random(turn.randomSeed);
            double randomDouble = rand.NextDouble();

            var xxx = new List <int>();
            var yyy = new List <int>();

            //for (int i = 0; i < state.Stones.Length; i++)
            //{
            //    if (state.Stones[i] >= 1)
            //    {

            //    }
            //}
            if (turn.stoneRespawnPos == null)
            {
                turn.stoneRespawnPos  = new List <int>();
                turn.stoneRespawnLine = new List <int>();
                if (Utility.doubleLessOrEqual(randomDouble, Const.StoneSpawnProbabilityPerTurn))
                {
                    int line = rand.Next(Const.NumberOfLines);
                    while (state.Stones[line] != -1)
                    {
                        line = rand.Next(Const.NumberOfLines);
                    }
                    int x = (Const.NumberOfColumns + 2) / 2 - Const.StoneRadius + (Const.NumberOfColumns % 2 == 0 ? 0 : 1) + rand.Next(2 * Const.StoneRadius);

                    xxx.Add(x);
                    yyy.Add(line);
                    turn.stoneRespawnLine.Add(line);
                    turn.stoneRespawnPos.Add(x);
                    state.TryAddStone(line, x);
                }
            }
            else
            {
                for (int i = 0; i < turn.stoneRespawnPos.Count; i++)
                {
                    state.TryAddStone(turn.stoneRespawnLine[i], turn.stoneRespawnPos[i]);
                }
            }
            state.stonePositionsX.Add(xxx);
            state.stonePositionsY.Add(yyy);
        }
Exemplo n.º 3
0
        void ProcessStoneSpawn(ref State state, SimultaneousTurn turn)
        {
            Random rand = new Random(turn.randomSeed);

            if (Utility.doubleLessOrEqual(rand.NextDouble(), Const.StoneSpawnProbabilityPerTurn))
            {
                int line = rand.Next(Const.NumberOfLines);
                while (state.Stones[line] != -1)
                {
                    line = rand.Next(Const.NumberOfLines);
                }
                int x = (Const.NumberOfColumns + 2) / 2 - Const.StoneRadius + (Const.NumberOfColumns % 2 == 0 ? 0 : 1) + rand.Next(2 * Const.StoneRadius);
                state.AddStone(line, x);
            }
        }
Exemplo n.º 4
0
        /// <summary>
        /// если false, надо подождать, хода пока нет
        /// если true и turn == null, значит возникла ошибка, надо смотреть comment
        /// </summary>
        public bool GetNextTurnAndComment(State state, IGetKeyboardState keyboard, out SimultaneousTurn turn, ref Frame frame)
        {
            turn = null;


            //тут, опять же, две ситуации - либо оба игрока являются программами - тогда мы берем ход из
            //recordedTurns, либо делаем ход здесь и сейчас

            if (takeTurnsFromRecordedTurns)
            {
                //     if (recordedTurns.Count < 200)
                //        return false;
                return(recordedTurns.TryGetValue(state.turn, out turn));
            }


            int  weWantHisTurnNow = _savedFirstPlayerTurn == null ? 0 : 1;
            Turn smallTurn;
            bool received = GetTurn(state, state.players[weWantHisTurnNow], keyboard, out smallTurn, ref frame);

            if (received)
            {
                if (weWantHisTurnNow == 1)
                {
                    turn = new SimultaneousTurn {
                        FirstPlayerTurn = _savedFirstPlayerTurn, SecondPlayerTurn = smallTurn
                    };
                    _savedFirstPlayerTurn = null;
                    state.players.ForEach(x => x.moneySpent = 0);
                    return(true);
                }
                else
                {
                    _savedFirstPlayerTurn = smallTurn;
                    return(false);
                }
            }
            else
            {
                return(false);
            }
        }
Exemplo n.º 5
0
        public void DoTurn(ref State previousState, SimultaneousTurn turn)
        {
            timer.Restart();

            State state = previousState;

            //должен осуществить ход, изменив состояние
            state.inEngineCount++;


            ProcessStoneSpawn(ref state, turn);



            state.players[0].Money += Const.MoneyPerTurn;
            state.players[1].Money += Const.MoneyPerTurn;

            if (turn.FirstPlayerTurn != null)
            {
                ProcessTurn(ref state, state.players[0], turn.FirstPlayerTurn);
            }
            if (turn.SecondPlayerTurn != null)
            {
                ProcessTurn(ref state, state.players[1], turn.SecondPlayerTurn);
            }

            ProcessUnitsState(ref state, state.players[0], false);
            ProcessUnitsState(ref state, state.players[1], true); //worth=1ms

            ProcessUnitsCollisions(ref state);                    //worth=1ms

            ProcessFireControl(ref state);                        //worth=1ms

            ProcessMovingAnimation(ref state);                    //worth=0ms

            ProcessFire(ref state);                               //average time = 9ms, worth = 100 ms

            #region missile_test
            //AddProjectile(ref state, new Point2(Const.FieldOriginX, Const.FieldOriginY), new Point2(turn.x, turn.y), 0.5, true, 0);

            //AddProjectile(ref state, new Point2(Const.FieldOriginX, Const.FieldOriginY), new Point2(turn.x - 10, turn.y - 10), 0.5, true, 0);
            //AddProjectile(ref state, new Point2(Const.FieldOriginX, Const.FieldOriginY), new Point2(turn.x - 10, turn.y + 10), 0.5, true, 0);
            //AddProjectile(ref state, new Point2(Const.FieldOriginX, Const.FieldOriginY), new Point2(turn.x + 10, turn.y - 10), 0.5, true, 0);
            //AddProjectile(ref state, new Point2(Const.FieldOriginX, Const.FieldOriginY), new Point2(turn.x + 10, turn.y + 10), 0.5, true, 0);
            #endregion

            #region animation_test
            //Effect eff = new Effect();
            //DynamicObject obj = new DynamicObject(new Sprite(ESprite.shell1, 20, 20,
            //                                                 new Vector2(0, 0)));
            //DynamicObject explsn = new DynamicObject(new Sprite(ESprite.explosion, 40, 40,
            //                                                    new Vector2(0, 0)));
            //eff.AddNextStep(obj);
            //eff.AddAnimationToLastStep(turn.x, turn.y, 360, 1.0);
            //eff.AddAnimationToLastStep(turn.x / 2, turn.y / 2, -360, 1.5);
            //eff.AddAnimationToLastStep(-turn.x / 2, -turn.y / 2, 0, 0.75);
            //eff.AddAnimationToLastStep(turn.x, turn.y, 360, 1.0);
            //eff.AddAnimationToLastStep(turn.x / 2, turn.y / 2, -360, 1.5);
            //eff.AddAnimationToLastStep(-turn.x / 2, -turn.y / 2, 0, 0.75);
            //eff.AddAnimationToLastStep(turn.x, turn.y, 360, 1.0);
            //eff.AddAnimationToLastStep(turn.x / 2, turn.y / 2, -360, 1.5);
            //eff.AddAnimationToLastStep(-turn.x / 2, -turn.y / 2, 0, 0.75);
            //eff.AddAnimationToLastStep(turn.x, turn.y, 360, 1.0);
            //eff.AddAnimationToLastStep(turn.x / 2, turn.y / 2, -360, 1.5);
            //eff.AddAnimationToLastStep(-turn.x / 2, -turn.y / 2, 0, 0.75);
            //eff.AddNextStep(explsn);
            //eff.AddAnimationToLastStep(0, 0, 0, 1.0);
            //state.effects.AddEffect(eff);
            #endregion



            timeOfRunning.Add((int)timer.ElapsedMilliseconds);
            if (state.turn == 190)
            {
                double average = timeOfRunning.Average();
                double worth   = timeOfRunning.Max();
                int    e       = -1;
            }
            //....
        }
Exemplo n.º 6
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();
        }