Example #1
0
    public string UpdateBoardDisplay()
    {
        string output = "";
        string charForCurrentType;

        for (int r = 0; r < model.mapSize; r++)
        {
            for (int c = 0; c < model.mapSize; c++)
            {
                BoardModel.SquareType currentSquareType = model.map[r, c];
                charForCurrentType = model.GetTypeToChar(currentSquareType);
                if (r == model.playerX)
                {
                    if (c == model.playerY)
                    {
                        charForCurrentType = model.GetTypeToCharPlayer(model.currentPlayerSquareType);
                    }
                }
                output += charForCurrentType + " ";
            }
            output += "\n";
        }
        output += "\n";
        output += "     Player at (" + model.playerX + ", " + model.playerY + ")";
        output += "\n last acction success = " + model.GetLastActionSuccess();
        return(output);
    }
Example #2
0
    /*
     * Make a move
     * @param position Board coordinates
     */
    private void play(Coordinates position)
    {
        model.setPositionTo(position, turn);
        viewer.setPositionTo(position, turn);

        turn = BoardModel.swapType(turn);
        checkEndGame();
    }
Example #3
0
    /*
     * Constructor
     * param boardViewer Reference to its viewer
     */
    public BoardPresenter(BoardViewer boardViewer)
    {
        model  = new BoardModel();
        viewer = boardViewer;
        turn   = BoardModel.SquareType.CROSS;

        // Starts robot as opposite player
        robot = new RobotPlayer(BoardModel.swapType(GameSettings.Instance.humanSide));
    }
Example #4
0
    // Minmax recursive analysis
    private int getMinMaxScore(BoardModel board, BoardModel.SquareType nextTurn)
    {
        List <Coordinates> possibleMoves = board.getEmptyPositions();

        BoardModel.SquareType winner = board.computeWinner();

        // Case robot wins, it's a positive score relative to decision tree depth
        if (winner == this.side)
        {
            return(possibleMoves.Count + 1);
        }
        // Case robot loses, it's a negative score relative to decision tree depth
        if (winner == BoardModel.swapType(side))
        {
            return(-possibleMoves.Count - 1);
        }
        // Case it's a draw leaf
        if (possibleMoves.Count == 0)
        {
            return(0);
        }

        // Robot turn, maximizes score
        if (nextTurn == this.side)
        {
            int maxScore = Int32.MinValue;
            foreach (Coordinates move in possibleMoves)
            {
                BoardModel predictedBoard = new BoardModel(board);
                predictedBoard.setPositionTo(move, nextTurn);
                int score = getMinMaxScore(predictedBoard, BoardModel.swapType(nextTurn));
                if (score > maxScore)
                {
                    maxScore = score;
                }
            }
            return(maxScore);
        }
        // Opponent turn, minimizes score
        else
        {
            int minScore = Int32.MaxValue;
            foreach (Coordinates move in possibleMoves)
            {
                BoardModel predictedBoard = new BoardModel(board);
                predictedBoard.setPositionTo(move, nextTurn);
                int score = getMinMaxScore(predictedBoard, BoardModel.swapType(nextTurn));
                if (score < minScore)
                {
                    minScore = score;
                }
            }
            return(minScore);
        }
    }
Example #5
0
    // Decides next play analysing one play forward
    private Coordinates decidesShallow(BoardModel board)
    {
        List <Coordinates> winningMoves       = new List <Coordinates>();
        List <Coordinates> preventLosingMoves = new List <Coordinates>();
        List <Coordinates> neutralMoves       = new List <Coordinates>();

        foreach (Coordinates position in board.getPositions())
        {
            // Tests only possible moves
            if (board.at(position) != BoardModel.SquareType.EMPTY)
            {
                continue;
            }

            BoardModel testBoard = new BoardModel(board);

            // Tests for a winning move
            testBoard.setPositionTo(position, side);
            if (testBoard.computeWinner() == side)
            {
                winningMoves.Add(position);
                continue;
            }

            // Tests for a move preventing a losing
            BoardModel.SquareType opponentSide = BoardModel.swapType(side);
            testBoard.setPositionTo(position, opponentSide);
            if (testBoard.computeWinner() == opponentSide)
            {
                preventLosingMoves.Add(position);
                continue;
            }

            // Else it's just a neutral move
            neutralMoves.Add(position);
        }

        // Makes a random move in order of preference ( win > not lose )
        foreach (List <Coordinates> moves in new List <Coordinates>[] {
            winningMoves, preventLosingMoves, neutralMoves
        })
        {
            if (moves.Count > 0)
            {
                System.Random random = new System.Random();
                return(moves[random.Next(moves.Count)]);
            }
        }

        // Error
        return(new Coordinates(-1, -1));
    }
Example #6
0
    /*
     * Change the rendering of a square for a type ( cross or nought )
     * @param position The position on the board
     * @param type The type of the square ( cross or nought )
     */
    public void setPositionTo(Coordinates position, BoardModel.SquareType type)
    {
        SpriteRenderer renderer = squares[position.x, position.y].GetComponent <SpriteRenderer>();

        if (type == BoardModel.SquareType.CROSS)
        {
            renderer.sprite = crossSprite;
        }
        else if (type == BoardModel.SquareType.NOUGHT)
        {
            renderer.sprite = noughtSprite;
        }
    }
Example #7
0
 /*
  * Check if there is a winner and stops the game if so
  */
 private void checkEndGame()
 {
     BoardModel.SquareType winner = model.computeWinner();
     if (winner != BoardModel.SquareType.EMPTY)
     {
         turn = BoardModel.SquareType.EMPTY;
         viewer.endGame(winner);
     }
     else if (model.getEmptyPositions().Count == 0)
     {
         turn = BoardModel.SquareType.EMPTY;
         viewer.endGame(BoardModel.SquareType.EMPTY);
     }
 }
Example #8
0
    public void Test02_Square_Type_Enum_Array_Setting_Values()
    {
        //Arrange
        BoardModel m = new BoardModel(4);

        m.map[0, 0] = BoardModel.SquareType.EDGE_OF_BOARD;

        BoardModel.SquareType expectedResult = BoardModel.SquareType.EDGE_OF_BOARD;

        //Act
        BoardModel.SquareType result = m.map[0, 0];

        //Assert
        Assert.AreEqual(expectedResult, result);
    }
Example #9
0
    public void test11_Player_Can_Light_Tile_From_Provider
        (int playPositionX, int playPositionY, int mapSize, bool expectedResult, BoardModel.SquareType squareType)
    {
        //Arrange
        BoardModel m = new BoardModel(mapSize);

        m.map[2, 2] = squareType;

        m.playerX = playPositionX;
        m.playerY = playPositionY;

        m.LightSquare();

        //Act
        bool result = m.GetLastActionSuccess();

        //Assert
        Assert.AreEqual(expectedResult, result);
    }
Example #10
0
    public void test08_Out_Of_Bounds_ImpassableVolcano_ImpassablePit_Move
        (int playPositionX, int playPositionY, int mapSize, bool expectedResult, BoardModel.SquareType squareType, BoardModel.CompassDirection direction)
    {
        //Arrange
        BoardModel m = new BoardModel(mapSize);

        m.playerX = playPositionX;
        m.playerY = playPositionY;

        //Out of bounds...
        m.map[2, 3] = squareType;

        m.PlayerWalk(direction);

        //Act
        bool result = m.GetLastActionSuccess();

        //Assert
        Assert.AreEqual(expectedResult, result);
    }
Example #11
0
    /*
     * Modify the winning text according to result
     * @param winner Who is the winner: cross, nought or draw (EMPTY)
     */
    public void setWinner(BoardModel.SquareType winner)
    {
        string text = "";

        switch (winner)
        {
        case BoardModel.SquareType.EMPTY:
            text = "It's a draw!";
            break;

        case BoardModel.SquareType.CROSS:
            text = "Crosses are the winners!";
            break;

        case BoardModel.SquareType.NOUGHT:
            text = "Noughts are the winners!";
            break;
        }

        winnerText.GetComponent <Text>().text = text;
    }
Example #12
0
    public void test09_Player_Can_Jump_From_Provider
        (int playPositionX, int playPositionY, int mapSize, bool expectedResult, BoardModel.SquareType squareType1, BoardModel.SquareType squareType2, BoardModel.CompassDirection direction)
    {
        //Arrange
        BoardModel m = new BoardModel(mapSize);

        m.playerX = playPositionX;
        m.playerY = playPositionY;

        //Setup Map tiles(mock level)
        m.map[3, 3] = squareType1;
        m.map[2, 3] = squareType2;

        m.PlayerJump(direction);

        //Act
        bool result = m.GetLastActionSuccess();

        //Assert
        Assert.AreEqual(expectedResult, result);
    }
    private string GetTypeToCharPlayer(BoardModel.SquareType currentPlayerSquareType)
    {
        string P = Player[(int)currentPlayerSquareType];

        return(P);
    }
Example #14
0
 /*
  * Popups the winner canvas
  * @param winner Who is the winner: cross, nought or draw (EMPTY)
  */
 public void endGame(BoardModel.SquareType winner)
 {
     endGameCanvas.SetActive(true);
     endGameCanvas.GetComponent <EndGameUI>().setWinner(winner);
 }
    private string GetTypeToChar(BoardModel.SquareType currentSquareType)
    {
        string t = SquareTypeToChar[(int)currentSquareType];

        return(t);
    }
Example #16
0
 /*
  * Constructor
  * @param type Side of the robot
  */
 public RobotPlayer(BoardModel.SquareType side)
 {
     this.side = side;
 }
Example #17
0
 /*
  * Constructor
  */
 private GameSettings()
 {
     // Default settings
     humanSide  = BoardModel.SquareType.CROSS;
     difficulty = Difficulty.NORMAL;
 }
Example #18
0
    public void test07_Player_Can_Walk_NORTH_SOUTH_EAST_WEST_From_Provider
        (int playPositionX, int playPositionY, int mapSize, bool expectedResult, BoardModel.CompassDirection direction, BoardModel.SquareType mockLevelSquareType)
    {
        //Arrange
        BoardModel m = new BoardModel(mapSize);

        m.map[4, 5] = mockLevelSquareType; //North
        m.map[5, 6] = mockLevelSquareType; //East
        m.map[5, 5] = mockLevelSquareType; //Start Position
        m.map[6, 5] = mockLevelSquareType; //South
        m.map[5, 4] = mockLevelSquareType; //West

        m.playerX = playPositionX;
        m.playerY = playPositionY;

        m.PlayerWalk(direction);

        //Act
        bool result = m.GetLastActionSuccess();

        //Assert
        Assert.AreEqual(expectedResult, result);
    }