示例#1
0
文件: PlayerLogic.cs 项目: m-s-z/SE2
        public List <List <Field> > CreateInitialBoard(int goalsHeight, int tasksHeight, int boardWidth)
        {
            List <List <Field> > board = new List <List <Field> >();

            for (int i = 0; i < boardWidth; i++)
            {
                board.Add(new List <Field>());
                for (int j = 0; j < tasksHeight + 2 * goalsHeight; j++)
                {
                    if (j >= goalsHeight && j < goalsHeight + tasksHeight)
                    {
                        TaskField tF = new TaskField();
                        tF.x = (uint)i;
                        tF.y = (uint)j;
                        tF.pieceIdSpecified = false;
                        tF.distanceToPiece  = -3;
                        board[i].Add(tF);
                    }
                    else
                    {
                        GoalField gF = new GoalField();
                        gF.x    = (uint)i;
                        gF.y    = (uint)j;
                        gF.type = GoalFieldType.unknown;
                        gF.team = (i < goalsHeight) ? TeamColour.blue : TeamColour.red;
                        board[i].Add(gF);
                    }
                }
            }
            return(board);
        }
示例#2
0
        public void PlayerMovesFromTaskFieldToEmptyTaskField()
        {
            // from (2, 4) to (2, 5)
            InitGameMaster();
            var Player = GetPlayer("testGUID-0004", 10, TeamColour.blue, ActionType.Move);

            Player.SetLocation(2, 4);

            RegisterPlayer(Player, Player.GUID);

            var taskField = new TaskField(2, 5)
            {
                pieceIdSpecified = true,
                pieceId          = 250,
                timestamp        = DateTime.Now,
            };

            DataAgent data = new DataAgent(Player.ID)
            {
                PlayerGUID     = guid,
                GameFinished   = false,
                PlayerLocation = new GameArea.GameObjects.Location(2, 5),
                Tasks          = new GameArea.GameObjects.TaskField[] { new GameArea.GameObjects.TaskField(taskField) }
            };

            // action: Player moves up to (2,5)
            data.Process(Player.Controller);

            // assert
            Assert.AreEqual(new GameArea.GameObjects.Location(2, 5), Player.Location);
            Assert.IsNull(Player.GetBoard.GetField(2, 4).Player);
            Assert.IsNull(Player.GetBoard.GetField(2, 5).Player);
            Assert.AreEqual(taskField.pieceId, Player.GetBoard.GetTaskField(2, 5).Piece.ID);
        }
示例#3
0
        public async Task <IHttpActionResult> PutTaskField(int id, TaskField taskField)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            if (id != taskField.Id)
            {
                return(BadRequest());
            }

            db.Entry(taskField).State = EntityState.Modified;

            try
            {
                await db.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!TaskFieldExists(id))
                {
                    return(NotFound());
                }
                else
                {
                    throw;
                }
            }

            return(StatusCode(HttpStatusCode.NoContent));
        }
示例#4
0
        public async Task TestDestroyAsync()
        {
            var conf         = GenerateConfiguration();
            var socketClient = GenerateSocketClient();
            var player       = GenerateGMPlayer(conf, socketClient);
            var piece        = new ShamPiece();

            player.Holding = piece;
            var field = new TaskField(0, 0);

            Assert.True(field.MoveHere(player));

            // Act
            bool detroyed = await player.DestroyHoldingAsync(CancellationToken.None);

            Assert.True(detroyed);
            Assert.True(player.Holding is null);
            Assert.Equal(MessageID.DestructionAnswer, lastSended.MessageID);
            Assert.Null(prevSended);

            // delay
            await Task.Delay(conf.DestroyPenalty * 2);

            lastSended = null;
            detroyed   = await player.DestroyHoldingAsync(CancellationToken.None);

            Assert.False(detroyed);
        }
示例#5
0
        public async Task TestCheckHoldingAsync()
        {
            var conf         = GenerateConfiguration();
            var socketClient = GenerateSocketClient();
            var player       = GenerateGMPlayer(conf, socketClient);
            var piece        = new ShamPiece();
            var field        = new TaskField(0, 0);

            Assert.True(field.MoveHere(player));
            Assert.True(player.Holding is null);

            // Act
            await player.CheckHoldingAsync(CancellationToken.None);

            Assert.True(player.Holding is null);
            Assert.Null(prevSended);

            await Task.Delay(conf.CheckForShamPenalty * 2);

            player.Holding = piece;
            lastSended     = null;
            await player.CheckHoldingAsync(CancellationToken.None);

            Assert.Equal(MessageID.CheckAnswer, lastSended.MessageID);
        }
示例#6
0
        public async Task TestMoveAsyncToFull()
        {
            var gm = GenerateGM();
            Func <AbstractField, int?> getClosestPiece = (AbstractField pos) => InvokeGetClosestPiece(gm, pos);
            var firstPlayer      = GenerateGMPlayer();
            var firstPlayerField = new TaskField(0, 0);

            Assert.True(firstPlayerField.MoveHere(firstPlayer));

            var secondPlayer      = GenerateGMPlayer();
            var secondPlayerField = new TaskField(0, 1);

            Assert.True(secondPlayerField.MoveHere(secondPlayer));

            // Act
            bool moved = await firstPlayer.MoveAsync(secondPlayerField, getClosestPiece, CancellationToken.None);

            Assert.False(moved);
            Assert.Equal(firstPlayerField, firstPlayer.Position);
            Assert.Equal(secondPlayerField, secondPlayer.Position);
            Assert.Equal(MessageID.MoveAnswer, lastSended.MessageID);
            Assert.Null(prevSended);

            var payload = (MoveAnswerPayload)lastSended.Payload;

            Assert.False(payload.MadeMove);
            Position expectedPos = firstPlayerField.GetPosition();

            Assert.True(payload.CurrentPosition.Equals(expectedPos));
        }
示例#7
0
文件: GameState.cs 项目: m-s-z/SE2
        public List <List <Field> > SetInitialBoard(int goalAreaLength, int taskAreaLength, int boardWidth)
        {
            List <List <Field> > boardList = new List <List <Field> >();

            for (int i = 0; i < boardWidth; i++)
            {
                boardList.Add(new List <Field>());

                for (int j = 0; j < taskAreaLength + 2 * goalAreaLength; j++)
                {
                    if (j >= goalAreaLength && j < goalAreaLength + taskAreaLength)
                    {
                        TaskField tF = new TaskField();
                        tF.x = (uint)i;
                        tF.y = (uint)j;
                        tF.pieceIdSpecified = false;
                        boardList[i].Add(tF);
                    }
                    else
                    {
                        GoalField gF = new GoalField();
                        gF.x    = (uint)i;
                        gF.y    = (uint)j;
                        gF.type = GoalFieldType.nongoal;
                        gF.team = (i < goalAreaLength) ? TeamColour.blue : TeamColour.red;
                        boardList[i].Add(gF);
                    }
                }
            }
            return(boardList);
        }
示例#8
0
        public async Task TestMoveAsyncToRelease()
        {
            var gm = GenerateGM();
            Func <AbstractField, int?> getClosestPiece = (AbstractField pos) => InvokeGetClosestPiece(gm, pos);
            var firstPlayer      = GenerateGMPlayer();
            var firstPlayerField = new TaskField(0, 0);

            Assert.True(firstPlayerField.MoveHere(firstPlayer));

            var secondPlayer         = GenerateGMPlayer();
            var secondPlayerField    = new TaskField(0, 1);
            var secondPlayerEndField = new TaskField(1, 1);

            Assert.True(secondPlayerField.MoveHere(secondPlayer));

            // Act
            bool moved = await secondPlayer.MoveAsync(secondPlayerEndField, getClosestPiece, CancellationToken.None);

            Assert.True(moved);
            Assert.Equal(MessageID.MoveAnswer, lastSended.MessageID);
            var payload = (MoveAnswerPayload)lastSended.Payload;

            Assert.True(payload.MadeMove);
            Assert.Null(prevSended);

            lastSended = null;
            moved      = await firstPlayer.MoveAsync(secondPlayerField, getClosestPiece, CancellationToken.None);

            Assert.True(moved);
            Assert.Equal(MessageID.MoveAnswer, lastSended.MessageID);
            payload = (MoveAnswerPayload)lastSended.Payload;
            Assert.True(payload.MadeMove);
        }
示例#9
0
 private void ClearPieceFromField(TaskField taskField)
 {
     if (taskField.PieceId.HasValue)
     {
         taskField.PieceId = null;
     }
 }
示例#10
0
        public async Task TestMoveAsyncToEmpty()
        {
            var gm = GenerateGM();
            Func <AbstractField, int?> getClosestPiece =
                (AbstractField pos) => gm.Invoke <GM, int?>("FindClosestPiece", new object[] { pos });

            var player           = GenerateGMPlayer();
            var playerStartField = new TaskField(0, 0);
            var playerEndField   = new TaskField(0, 1);

            Assert.True(playerStartField.MoveHere(player));

            bool moved = await player.MoveAsync(playerEndField, getClosestPiece, CancellationToken.None);

            Assert.True(moved);
            Assert.Equal(playerEndField, player.Position);
            Assert.Equal(MessageID.MoveAnswer, lastSended.MessageID);
            Assert.Null(prevSended);

            var payload = (MoveAnswerPayload)lastSended.Payload;

            Assert.True(payload.MadeMove);
            Position expectedPos = playerEndField.GetPosition();

            Assert.True(payload.CurrentPosition.Equals(expectedPos));
        }
示例#11
0
        private TaskField FindFieldWithPiece(int pieceId)
        {
            TaskField result = null;

            for (var i = 0; i < Width; ++i)
            {
                for (var j = GoalAreaSize; j < TaskAreaSize + GoalAreaSize; ++j)
                {
                    var field = Content[i, j];
                    if (!IsLocationInTaskArea(field))
                    {
                        continue;
                    }

                    var taskFiled = (TaskField)field;
                    if (taskFiled.PieceId != pieceId)
                    {
                        continue;
                    }

                    result = taskFiled;
                    break;
                }
            }

            return(result);
        }
示例#12
0
        private void HandlePieceInField(int playerId, TaskField taskField)
        {
            if (!taskField.PieceId.HasValue)
            {
                return;
            }

            var oldPieceField = FindFieldWithPiece(taskField.PieceId.Value);

            if (oldPieceField != null)
            {
                if (taskField.IsNewerThan(oldPieceField))
                {
                    oldPieceField.PieceId = null;
                }
                else
                {
                    taskField.PieceId = null;
                }
            }

            //place piece
            if (Players[playerId].Piece != null && taskField.PieceId == Players[playerId].Piece.Id)
            {
                Players[playerId].Piece = null;
            }
        }
示例#13
0
        public async Task TestPickAsync()
        {
            var conf         = GenerateConfiguration();
            var socketClient = GenerateSocketClient();
            var player       = GenerateGMPlayer(conf, socketClient);
            var piece        = new ShamPiece();
            var field        = new TaskField(0, 0);

            Assert.True(field.MoveHere(player));
            Assert.True(player.Holding is null);

            // Act
            bool picked = await player.PickAsync(CancellationToken.None);

            Assert.False(picked);
            Assert.True(player.Holding is null);
            Assert.Equal(MessageID.PickError, lastSended.MessageID);
            var payload = (PickErrorPayload)lastSended.Payload;

            Assert.Equal(PickError.NothingThere, payload.ErrorSubtype);
            Assert.Null(prevSended);

            // delay
            await Task.Delay(conf.PickupPenalty * 2);

            field.Put(piece);
            lastSended = null;
            picked     = await player.PickAsync(CancellationToken.None);

            Assert.True(picked);
            Assert.Equal(piece, player.Holding);
            Assert.Equal(MessageID.PickAnswer, lastSended.MessageID);

            // delay
            await Task.Delay(conf.PickupPenalty * 2);

            lastSended = null;
            picked     = await player.PickAsync(CancellationToken.None);

            Assert.False(picked);
            Assert.Equal(piece, player.Holding);
            Assert.Equal(MessageID.PickError, lastSended.MessageID);
            payload = (PickErrorPayload)lastSended.Payload;
            Assert.Equal(PickError.Other, payload.ErrorSubtype);

            // delay
            await Task.Delay(conf.PickupPenalty * 2);

            var secondPiece = new NormalPiece();

            field.Put(secondPiece);
            lastSended = null;
            picked     = await player.PickAsync(CancellationToken.None);

            Assert.False(picked);
            Assert.Equal(piece, player.Holding);
            Assert.Equal(MessageID.PickError, lastSended.MessageID);
            payload = (PickErrorPayload)lastSended.Payload;
            Assert.Equal(PickError.Other, payload.ErrorSubtype);
        }
示例#14
0
        public async Task TestMoveAsyncAfterPenalty()
        {
            var gm = GenerateGM();
            Func <AbstractField, int?> getClosestPiece = (AbstractField pos) => InvokeGetClosestPiece(gm, pos);
            var conf         = GenerateConfiguration();
            var socketClient = GenerateSocketClient();
            var player       = GenerateGMPlayer(conf, socketClient);
            var startField   = new TaskField(0, 0);
            var firstField   = new TaskField(0, 1);
            var secondField  = new TaskField(1, 1);

            Assert.True(startField.MoveHere(player));

            // Act
            var moved = await player.MoveAsync(firstField, getClosestPiece, CancellationToken.None);

            Assert.True(moved);
            Assert.Equal(MessageID.MoveAnswer, lastSended.MessageID);
            Assert.Null(prevSended);

            await Task.Delay(conf.MovePenalty * 2);

            lastSended = null;
            moved      = await player.MoveAsync(secondField, getClosestPiece, CancellationToken.None);

            Assert.True(moved);
            Assert.Equal(MessageID.MoveAnswer, lastSended.MessageID);
        }
示例#15
0
        private int GetPieceCount(TaskField taskField)
        {
            var taskFieldInfo = typeof(AbstractField).GetProperty("Pieces",
                                                                  BindingFlags.NonPublic | BindingFlags.Instance);
            var pieces = (HashSet <AbstractPiece>)taskFieldInfo.GetValue(taskField);

            return(pieces.Count);
        }
示例#16
0
        public TaskAssert AssertField(TaskField field, object value)
        {
            var actualValue = _task.GetValue(field);
            var equals      = Equals(value, actualValue);

            Assert.True(equals, $"Task {_task.Ordinal + 1} {field.Name} should have been '{value}' but was '{actualValue}'");
            return(this);
        }
示例#17
0
        public async Task <IHttpActionResult> GetTaskField(int id)
        {
            TaskField taskField = await db.TaskFields.FindAsync(id);

            if (taskField == null)
            {
                return(NotFound());
            }

            return(Ok(taskField));
        }
示例#18
0
        public async Task <IHttpActionResult> PostTaskField(TaskField taskField)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            db.TaskFields.Add(taskField);
            await db.SaveChangesAsync();

            return(CreatedAtRoute("DefaultApi", new { id = taskField.Id }, taskField));
        }
示例#19
0
        public void DiscoverTest(TaskField field, int pieceCount)
        {
            var conf       = new MockGameConfiguration();
            var queue      = new BufferBlock <Message>();
            var lifetime   = Mock.Of <IApplicationLifetime>();
            var client     = new TcpSocketClient <Message, Message>(logger);
            var gameMaster = new GM(lifetime, conf, queue, client, logger);

            gameMaster.Invoke("InitGame");
            for (int i = 0; i < pieceCount; ++i)
            {
                gameMaster.Invoke("GeneratePiece");
            }

            // Act
            var discoveryActionResult = gameMaster.Invoke <GM, Dictionary <Direction, int?> >("Discover", field);

            // Assert
            var board = gameMaster.GetValue <GM, AbstractField[][]>("board");
            List <(AbstractField field, int dist, Direction dir)> neighbours = GetNeighbours(field, board, conf.Height, conf.Width);

            for (int k = 0; k < neighbours.Count; k++)
            {
                for (int i = conf.GoalAreaHeight; i < conf.Height - conf.GoalAreaHeight; i++)
                {
                    for (int j = 0; j < board[i].Length; j++)
                    {
                        int dist = ManhattanDistance(neighbours[k].field, board[i][j]);
                        if (dist < neighbours[k].dist)
                        {
                            neighbours[k] = (neighbours[k].field, dist, neighbours[k].dir);
                        }
                    }
                }
                if (discoveryActionResult[neighbours[k].dir] != neighbours[k].dist)
                {
                    Assert.False(discoveryActionResult[neighbours[k].dir] == neighbours[k].dist,
                                 $"Incorect value for distance: {discoveryActionResult[neighbours[k].dir]} != {neighbours[k].dist}");
                }
            }

            int discoveredFields = 0;

            foreach (var distance in discoveryActionResult)
            {
                if (distance.Value >= 0)
                {
                    ++discoveredFields;
                }
            }
            Assert.Equal(neighbours.Count, discoveredFields);
        }
示例#20
0
        public async Task <IHttpActionResult> DeleteTaskField(int id)
        {
            TaskField taskField = await db.TaskFields.FindAsync(id);

            if (taskField == null)
            {
                return(NotFound());
            }

            db.TaskFields.Remove(taskField);
            await db.SaveChangesAsync();

            return(Ok(taskField));
        }
        public void TaskFieldTest()
        {
            TaskField message = new TaskField();

            message.distanceToPiece  = 5;
            message.pieceId          = 1;
            message.pieceIdSpecified = true;

            string    xml    = XmlMessageConverter.ToXml(message);
            TaskField result = (TaskField)XmlMessageConverter.ToObject(xml);

            Assert.AreEqual((int)5, result.distanceToPiece);
            Assert.AreEqual((ulong)1, result.pieceId);
            Assert.AreEqual(true, result.pieceIdSpecified);
        }
示例#22
0
        public void MoveHereTest(List <GMPlayer> players, bool expected)
        {
            // Arrange
            TaskField taskField = new TaskField(2, 2);
            bool      result    = false;

            // Act
            foreach (GMPlayer p in players)
            {
                result = taskField.MoveHere(p);
            }

            // Assert
            Assert.Equal(expected, result);
        }
示例#23
0
        public async Task TestDiscoverAsync()
        {
            var gm = GenerateGM();
            Func <AbstractField, Dictionary <Direction, int?> > discover = (AbstractField pos) => InvokeDiscover(gm, pos);
            var player = GenerateGMPlayer();
            var field  = new TaskField(2, 2);

            Assert.True(field.MoveHere(player));

            // Act
            await player.DiscoverAsync(discover, CancellationToken.None);

            Assert.Equal(MessageID.DiscoverAnswer, lastSended.MessageID);
            Assert.Null(prevSended);
        }
示例#24
0
        public TaskAssert AssertFieldCollection <T>(TaskField field, IEnumerable <T> value)
        {
            var actualValue = _task.GetValue(field);

            try
            {
                Assert.Equal(value, (IEnumerable <T>)actualValue);
            }
            catch (Exception ex)
            {
                Assert.True(false, $"Task {_task.Ordinal + 1} {field.Name} {ex.Message}'");
            }

            return(this);
        }
示例#25
0
        public void HandleTaskField(int playerId, TaskField taskField)
        {
            var oldTaskField = (TaskField)this[taskField];

            if (taskField.IsNewerThan(oldTaskField))
            {
                ClearPlayerFromField(oldTaskField);
                ClearPieceFromField(oldTaskField);

                HandlePlayerInField(taskField);
                HandlePieceInField(playerId, taskField);

                this[taskField] = new TaskField(taskField, taskField.DistanceToPiece, taskField.PieceId,
                                                taskField.PlayerId);
            }
        }
 public DataMessageBuilder AddTaskField(TaskField taskField)
 {
     if (taskFields == null)
     {
         taskFields = new TaskField[] { taskField }
     }
     ;
     else
     {
         var l = new List <TaskField>(taskFields)
         {
             taskField
         };
         taskFields = l.ToArray();
     }
     return(this);
 }
        public void DataTest()
        {
            Data message = new Data();

            message.playerId = 0;

            message.gameFinished = true;

            GoalField[] goalFieldsTab = new GoalField[3];
            goalFieldsTab[0] = new GoalField()
            {
                team = TeamColour.red
            };
            message.GoalFields = goalFieldsTab;

            Piece[] pieceTab = new Piece[2];
            pieceTab[0] = new Piece()
            {
                playerId = 2, playerIdSpecified = true
            };
            message.Pieces = pieceTab;

            message.PlayerLocation = new Location()
            {
                x = 3
            };

            TaskField[] taskFieldTab = new TaskField[3];
            taskFieldTab[0] = new TaskField()
            {
                x = 3
            };
            message.TaskFields = taskFieldTab;

            string xml    = XmlMessageConverter.ToXml(message);
            Data   result = (Data)XmlMessageConverter.ToObject(xml);

            Assert.AreEqual((ulong)0, result.playerId);
            Assert.AreEqual(true, result.gameFinished);
            Assert.AreEqual(TeamColour.red, result.GoalFields[0].team);
            Assert.AreEqual((ulong)2, result.Pieces[0].playerId);
            Assert.AreEqual((uint)3, result.PlayerLocation.x);
            Assert.AreEqual((ulong)3, result.TaskFields[0].x);
        }
示例#28
0
        public void PlayerPlacesShamPieceOnNotOccupiedTaskField()
        {
            InitGameMaster();
            var Player = GetPlayer("testGUID-0003", 10, TeamColour.blue, ActionType.PlacePiece);

            // equip an Player with a sham piece
            var messagePieceKnown = new Piece(PieceType.sham, 100)
            {
                timestamp = DateTime.Now,
            };

            EquipPlayerWithPiece(messagePieceKnown, Player);

            Player.SetLocation(1, 5); // we change a location of an original object

            var taskField = new TaskField(1, 5)
            {
                pieceIdSpecified  = true,
                pieceId           = messagePieceKnown.id,
                playerIdSpecified = true,
                playerId          = Player.ID,
                timestamp         = DateTime.Now,
            };

            DataAgent data = new DataAgent(Player.ID)
            {
                PlayerGUID     = guid,
                GameFinished   = false,
                PlayerLocation = Player.Location,
                Tasks          = new GameArea.GameObjects.TaskField[] { new GameArea.GameObjects.TaskField(taskField) }
            };

            // action: Player places a piece
            data.Process(Player.Controller);

            // assert
            Assert.IsNull(Player.GetPiece);
            Assert.IsNotNull(Player.GetBoard.GetTaskField(Player.Location));
            Assert.AreEqual(messagePieceKnown.id, Player.GetBoard.GetTaskField(Player.Location).Piece.ID);
            //Assert.AreEqual(PieceType.sham, Player.GetBoard.GetTaskField(Player.Location).Piece.Type);
        }
示例#29
0
        public void PickUpTaskTest(int numPut, int numPick, bool expected)
        {
            // Arrange
            var       conf         = Mock.Of <GameConfiguration>();
            var       socketClient = new TcpSocketClient <Message, Message>(logger);
            GMPlayer  gmPlayer     = new GMPlayer(1, conf, socketClient, Shared.Enums.Team.Red, logger);
            TaskField taskField    = new TaskField(2, 2);

            for (int i = 0; i < numPut; i++)
            {
                taskField.Put(new NormalPiece());
            }
            bool result = false;

            // Act
            for (int i = 0; i < numPick; i++)
            {
                result = taskField.PickUp(gmPlayer);
            }

            // Assert
            Assert.Equal(expected, result);
        }
示例#30
0
        public async Task TestMoveAsyncActivePenalty()
        {
            var gm = GenerateGM();
            Func <AbstractField, int?> getClosestPiece = (AbstractField pos) => InvokeGetClosestPiece(gm, pos);
            var player      = GenerateGMPlayer();
            var startField  = new TaskField(0, 0);
            var firstField  = new TaskField(0, 1);
            var secondField = new TaskField(1, 1);

            Assert.True(startField.MoveHere(player));

            // Act
            var moved = await player.MoveAsync(firstField, getClosestPiece, CancellationToken.None);

            Assert.True(moved);
            Assert.Equal(MessageID.MoveAnswer, lastSended.MessageID);
            Assert.Null(prevSended);

            lastSended = null;
            moved      = await player.MoveAsync(secondField, getClosestPiece, CancellationToken.None);

            Assert.False(moved);
            Assert.Equal(MessageID.NotWaitedError, lastSended.MessageID);
        }