public bool MakeMove(User user, string movestr)
        {
            int            playerid = this.users.IndexOf(user);
            MorabarabaMove move     = board.ParseAndValidateMove(playerid, movestr);

            if (move != null)
            {
                bool playerWon = board.MakeMove(playerid, move);
                board.addToHistory(movestr);
                if (playerWon)
                {
                    //Player won
                    MorabarabaController.EndGame(user);
                }
                return(true);
            }
            else
            {
                return(false);
            }
        }
 public MorabarabaMove ParseAndValidateMove(int playerid, string move)
 {
     if (playerid < 0 || playerid > 1)
     {
         return(null);                              //invalid player id
     }
     if (turn != playerid)
     {
         return(null);                  //not player's turn
     }
     if (move.Length == 2)
     {
         //Place a cow (no shooting)
         if (this.playerContexts[playerid].phase == MorabarabaPhase.PLACING)
         {
             if (this.playerContexts[playerid].placingCowsLeft > 0)
             {
                 if (this.fields.ContainsKey(move))
                 {
                     if (this.fields[move].value == -1)
                     {
                         MorabarabaMove moveObj = new MorabarabaMove();
                         moveObj.moveType    = MoveType.PLACE;
                         moveObj.destination = this.fields[move];
                         return(moveObj);
                     }
                 }
             }
         }
     }
     else if (move.Length == 5 && move.Contains('-'))
     {
         //Move a cow (no shooting)
         if (this.playerContexts[playerid].phase == MorabarabaPhase.MOVING || this.playerContexts[playerid].phase == MorabarabaPhase.FLYING)
         {
             var moveFields = move.Split('-');
             if (this.fields.ContainsKey(moveFields[0]) && this.fields.ContainsKey(moveFields[1]))
             {
                 if (this.fields[moveFields[0]].value == playerid && this.fields[moveFields[1]].value == -1)
                 {
                     if (this.fieldGraphMatrix[sortFieldnames(moveFields[0], moveFields[1])] || this.playerContexts[playerid].phase == MorabarabaPhase.FLYING) //are the fields connected?
                     {
                         MorabarabaMove moveObj = new MorabarabaMove();
                         moveObj.moveType    = MoveType.MOVE;
                         moveObj.source      = this.fields[moveFields[0]];
                         moveObj.destination = this.fields[moveFields[1]];
                         return(moveObj);
                     }
                 }
             }
         }
     }
     else if (move.Length == 5 && move.Contains('x'))
     {
         //Place a cow and shoot
         if (this.playerContexts[playerid].phase == MorabarabaPhase.PLACING)
         {
             if (this.playerContexts[playerid].placingCowsLeft > 0)
             {
                 var shotspl = move.Split('x');
                 if (this.fields.ContainsKey(shotspl[0]) && this.fields.ContainsKey(shotspl[1]))
                 {
                     if (this.fields[shotspl[0]].value == -1 && this.fields[shotspl[1]].value != playerid && this.fields[shotspl[1]].value != -1)
                     {
                         if (isPotentialMill(this.fields[shotspl[0]], playerid)) //does the placed cow form a mill?
                         {
                             bool canPlaceShoot = false;
                             if (!isPotentialMill(this.fields[shotspl[1]], GetEnemyId(playerid))) //make sure that the enemy cow is not a part of a mill
                             {
                                 canPlaceShoot = true;
                             }
                             else
                             {
                                 //check if all enemy cows are in mills
                                 var enemyId = GetEnemyId(playerid);
                                 canPlaceShoot = true;
                                 foreach (var boardField in this.fields.Values)
                                 {
                                     if (boardField.value == enemyId)
                                     {
                                         if (!isPotentialMill(boardField, enemyId))
                                         {
                                             canPlaceShoot = false;
                                             break;
                                         }
                                     }
                                 }
                             }
                             if (canPlaceShoot)
                             {
                                 MorabarabaMove moveObj = new MorabarabaMove();
                                 moveObj.moveType    = MoveType.PLACESHOOT;
                                 moveObj.destination = this.fields[shotspl[0]];
                                 moveObj.target      = this.fields[shotspl[1]];
                                 return(moveObj);
                             }
                         }
                     }
                 }
             }
         }
     }
     else if (move.Length == 8 && move.Contains('-') && move.Contains('x'))
     {
         //Move a cow and shoot
         if (this.playerContexts[playerid].phase == MorabarabaPhase.MOVING || this.playerContexts[playerid].phase == MorabarabaPhase.FLYING)
         {
             var shotspl    = move.Split('x');
             var moveFields = shotspl[0].Split('-');
             if (this.fields.ContainsKey(moveFields[0]) && this.fields.ContainsKey(moveFields[1]) && this.fields.ContainsKey(shotspl[1]))
             {
                 if (this.fields[moveFields[0]].value == playerid && this.fields[moveFields[1]].value == -1 && this.fields[shotspl[1]].value != playerid && this.fields[shotspl[1]].value != -1)
                 {
                     if (this.fieldGraphMatrix[sortFieldnames(moveFields[0], moveFields[1])] || this.playerContexts[playerid].phase == MorabarabaPhase.FLYING) //are the fields connected?
                     {
                         if (isPotentialMill(this.fields[moveFields[1]], playerid))                                                                            //does the placed cow form a mill?
                         {
                             bool canMoveShoot = false;
                             if (!isPotentialMill(this.fields[shotspl[1]], GetEnemyId(playerid)))//make sure that the enemy cow is not a part of a mill
                             {
                                 canMoveShoot = true;
                             }
                             else
                             {
                                 //check if all enemy cows are in mills
                                 var enemyId = GetEnemyId(playerid);
                                 canMoveShoot = true;
                                 foreach (var boardField in this.fields.Values)
                                 {
                                     if (boardField.value == enemyId)
                                     {
                                         if (!isPotentialMill(boardField, enemyId))
                                         {
                                             canMoveShoot = false;
                                             break;
                                         }
                                     }
                                 }
                             }
                             if (canMoveShoot)
                             {
                                 MorabarabaMove moveObj = new MorabarabaMove();
                                 moveObj.moveType    = MoveType.MOVESHOOT;
                                 moveObj.source      = this.fields[moveFields[0]];
                                 moveObj.destination = this.fields[moveFields[1]];
                                 moveObj.target      = this.fields[shotspl[1]];
                                 return(moveObj);
                             }
                         }
                     }
                 }
             }
         }
     }
     return(null);
 }
        public bool MakeMove(int playerid, MorabarabaMove move)
        {
            int enemyid = GetEnemyId(playerid);

            if (move.moveType == MoveType.PLACE)
            {
                move.destination.value = playerid;
            }
            else if (move.moveType == MoveType.MOVE)
            {
                move.source.value      = -1;
                move.destination.value = playerid;
            }
            else if (move.moveType == MoveType.PLACESHOOT)
            {
                move.destination.value = playerid;
                move.target.value      = -1;
            }
            else if (move.moveType == MoveType.MOVESHOOT)
            {
                move.source.value      = -1;
                move.destination.value = playerid;
                move.target.value      = -1;
            }
            if (move.moveType == MoveType.PLACE || move.moveType == MoveType.PLACESHOOT)
            {
                this.playerContexts[playerid].placingCowsLeft--;
                if (this.playerContexts[playerid].placingCowsLeft == 0)
                {
                    this.playerContexts[playerid].phase = MorabarabaPhase.MOVING;
                }
                this.playerContexts[playerid].cows++;
            }
            if (move.moveType == MoveType.PLACESHOOT || move.moveType == MoveType.MOVESHOOT)
            {
                this.playerContexts[playerid].mills++;
                this.playerContexts[enemyid].cows--;
                if (this.playerContexts[enemyid].cows <= 3 && this.playerContexts[enemyid].phase == MorabarabaPhase.MOVING)
                {
                    this.playerContexts[enemyid].phase = MorabarabaPhase.FLYING;
                }
            }
            if (this.turn == 0)
            {
                this.turn = 1;
            }
            else
            {
                this.turn = 0;
            }
            if (this.playerContexts[enemyid].cows <= 2 && this.playerContexts[enemyid].placingCowsLeft == 0)
            {
                //Player won
                return(true);
            }
            if (this.playerContexts[enemyid].phase == MorabarabaPhase.MOVING)
            {
                bool enemyHasNowhereToMove = true;
                foreach (var boardField in this.fields.Values)
                {
                    if (boardField.value == enemyid)
                    {
                        foreach (var kvp in this.fieldGraphMatrix)
                        {
                            if (kvp.Key.Contains(boardField.name) && kvp.Value)
                            {
                                var adjField = this.fields[kvp.Key.Replace(boardField.name, "")];
                                if (adjField.value == -1)
                                {
                                    enemyHasNowhereToMove = false;
                                    break;
                                }
                            }
                        }
                    }
                }
                if (enemyHasNowhereToMove)
                {
                    return(true);
                }
            }
            return(false);
        }