Exemplo n.º 1
0
    public void ProcessComputerTurn(int compDifficulty)
    {
        #region  EASY - randomly input empty space
        if (compDifficulty == 1)
        {
            Random random      = new Random();
            int    randomIndex = random.Next(0, Grid.EmptyGridPoints.Count);

            Console.WriteLine("I choose Row " + Grid.EmptyGridPoints[randomIndex].yCoord + " and Column " + Grid.EmptyGridPoints[randomIndex].xCoord);

            Grid.InputGridPoint(Grid.EmptyGridPoints[randomIndex].xCoord, Grid.EmptyGridPoints[randomIndex].yCoord, Grid.GridPoint.InputType.O);
        }
        #endregion

        #region  MEDIUM - Computer checks if it can win next move
        else if (compDifficulty == 2)
        {
            //  Go through each empty cell
            Grid.GridPoint mostPotentialGridPoint = Grid.EmptyGridPoints[0];
            int            curHighestWeight       = 0;

            //  For each empty space, find the a gridpoint with neighboring O's
            for (int i = 0; i < Grid.EmptyGridPoints.Count; i++)
            {
                //  Create a weight of the gridpoint based on neighboring inputs
                int weight = 0;
                weight += GetLength(Grid.GridPoints[Grid.EmptyGridPoints[i].xCoord, Grid.EmptyGridPoints[i].yCoord], Direction.Top, Grid.GridPoint.InputType.O);
                weight += GetLength(Grid.GridPoints[Grid.EmptyGridPoints[i].xCoord, Grid.EmptyGridPoints[i].yCoord], Direction.Right, Grid.GridPoint.InputType.O);
                weight += GetLength(Grid.GridPoints[Grid.EmptyGridPoints[i].xCoord, Grid.EmptyGridPoints[i].yCoord], Direction.Bottom, Grid.GridPoint.InputType.O);
                weight += GetLength(Grid.GridPoints[Grid.EmptyGridPoints[i].xCoord, Grid.EmptyGridPoints[i].yCoord], Direction.Left, Grid.GridPoint.InputType.O);
                weight += GetLength(Grid.GridPoints[Grid.EmptyGridPoints[i].xCoord, Grid.EmptyGridPoints[i].yCoord], Direction.DiagonalTopToBottomRight, Grid.GridPoint.InputType.O);
                weight += GetLength(Grid.GridPoints[Grid.EmptyGridPoints[i].xCoord, Grid.EmptyGridPoints[i].yCoord], Direction.DiagonalTopToBottomLeft, Grid.GridPoint.InputType.O);
                weight += GetLength(Grid.GridPoints[Grid.EmptyGridPoints[i].xCoord, Grid.EmptyGridPoints[i].yCoord], Direction.DiagonalBottomToTopRight, Grid.GridPoint.InputType.O);
                weight += GetLength(Grid.GridPoints[Grid.EmptyGridPoints[i].xCoord, Grid.EmptyGridPoints[i].yCoord], Direction.DiagonalBottomToTopLeft, Grid.GridPoint.InputType.O);

                //  if the gridpoints weight is higher then the current, update the most potential gridpoint and current weight
                if (weight > curHighestWeight)
                {
                    mostPotentialGridPoint = Grid.EmptyGridPoints[i];
                    curHighestWeight       = weight;
                }
            }

            //  Input the new gridpoint
            Grid.InputGridPoint(mostPotentialGridPoint.xCoord, mostPotentialGridPoint.yCoord, Grid.GridPoint.InputType.O);
        }
        #endregion

        #region HARD - Computer always tries to pick spots to win game & block player cells
        else if (compDifficulty == 3)
        {
            //  Go through each empty cell
            Grid.GridPoint mostPotentialGridPoint = Grid.EmptyGridPoints[0];
            int            curHighestWeight       = 0;

            //  For each empty space, find the a gridpoint with neighboring O's
            for (int i = 0; i < Grid.EmptyGridPoints.Count; i++)
            {
                //  Create a weight of the gridpoint based on neighboring inputs
                int weight     = 0;
                int oWeight    = 15;
                int nullWeight = 5;
                int xWeight    = 10;
                weight += oWeight + GetLength(Grid.GridPoints[Grid.EmptyGridPoints[i].xCoord, Grid.EmptyGridPoints[i].yCoord], Direction.Top, Grid.GridPoint.InputType.O);
                weight += oWeight + GetLength(Grid.GridPoints[Grid.EmptyGridPoints[i].xCoord, Grid.EmptyGridPoints[i].yCoord], Direction.Right, Grid.GridPoint.InputType.O);
                weight += oWeight + GetLength(Grid.GridPoints[Grid.EmptyGridPoints[i].xCoord, Grid.EmptyGridPoints[i].yCoord], Direction.Bottom, Grid.GridPoint.InputType.O);
                weight += oWeight + GetLength(Grid.GridPoints[Grid.EmptyGridPoints[i].xCoord, Grid.EmptyGridPoints[i].yCoord], Direction.Left, Grid.GridPoint.InputType.O);
                weight += oWeight + GetLength(Grid.GridPoints[Grid.EmptyGridPoints[i].xCoord, Grid.EmptyGridPoints[i].yCoord], Direction.DiagonalTopToBottomRight, Grid.GridPoint.InputType.O);
                weight += oWeight + GetLength(Grid.GridPoints[Grid.EmptyGridPoints[i].xCoord, Grid.EmptyGridPoints[i].yCoord], Direction.DiagonalTopToBottomLeft, Grid.GridPoint.InputType.O);
                weight += oWeight + GetLength(Grid.GridPoints[Grid.EmptyGridPoints[i].xCoord, Grid.EmptyGridPoints[i].yCoord], Direction.DiagonalBottomToTopRight, Grid.GridPoint.InputType.O);
                weight += oWeight + GetLength(Grid.GridPoints[Grid.EmptyGridPoints[i].xCoord, Grid.EmptyGridPoints[i].yCoord], Direction.DiagonalBottomToTopLeft, Grid.GridPoint.InputType.O);
                //  Add weights for empty spaces
                weight += nullWeight + GetLength(Grid.GridPoints[Grid.EmptyGridPoints[i].xCoord, Grid.EmptyGridPoints[i].yCoord], Direction.Top, Grid.GridPoint.InputType.NULL);
                weight += nullWeight + GetLength(Grid.GridPoints[Grid.EmptyGridPoints[i].xCoord, Grid.EmptyGridPoints[i].yCoord], Direction.Right, Grid.GridPoint.InputType.NULL);
                weight += nullWeight + GetLength(Grid.GridPoints[Grid.EmptyGridPoints[i].xCoord, Grid.EmptyGridPoints[i].yCoord], Direction.Bottom, Grid.GridPoint.InputType.NULL);
                weight += nullWeight + GetLength(Grid.GridPoints[Grid.EmptyGridPoints[i].xCoord, Grid.EmptyGridPoints[i].yCoord], Direction.Left, Grid.GridPoint.InputType.NULL);
                weight += nullWeight + GetLength(Grid.GridPoints[Grid.EmptyGridPoints[i].xCoord, Grid.EmptyGridPoints[i].yCoord], Direction.DiagonalTopToBottomRight, Grid.GridPoint.InputType.NULL);
                weight += nullWeight + GetLength(Grid.GridPoints[Grid.EmptyGridPoints[i].xCoord, Grid.EmptyGridPoints[i].yCoord], Direction.DiagonalTopToBottomLeft, Grid.GridPoint.InputType.NULL);
                weight += nullWeight + GetLength(Grid.GridPoints[Grid.EmptyGridPoints[i].xCoord, Grid.EmptyGridPoints[i].yCoord], Direction.DiagonalBottomToTopRight, Grid.GridPoint.InputType.NULL);
                weight += nullWeight + GetLength(Grid.GridPoints[Grid.EmptyGridPoints[i].xCoord, Grid.EmptyGridPoints[i].yCoord], Direction.DiagonalBottomToTopLeft, Grid.GridPoint.InputType.NULL);
                //  Add weights for player spaces to block them
                weight += xWeight + GetLength(Grid.GridPoints[Grid.EmptyGridPoints[i].xCoord, Grid.EmptyGridPoints[i].yCoord], Direction.Top, Grid.GridPoint.InputType.X);
                weight += xWeight + GetLength(Grid.GridPoints[Grid.EmptyGridPoints[i].xCoord, Grid.EmptyGridPoints[i].yCoord], Direction.Right, Grid.GridPoint.InputType.X);
                weight += xWeight + GetLength(Grid.GridPoints[Grid.EmptyGridPoints[i].xCoord, Grid.EmptyGridPoints[i].yCoord], Direction.Bottom, Grid.GridPoint.InputType.X);
                weight += xWeight + GetLength(Grid.GridPoints[Grid.EmptyGridPoints[i].xCoord, Grid.EmptyGridPoints[i].yCoord], Direction.Left, Grid.GridPoint.InputType.X);
                weight += xWeight + GetLength(Grid.GridPoints[Grid.EmptyGridPoints[i].xCoord, Grid.EmptyGridPoints[i].yCoord], Direction.DiagonalTopToBottomRight, Grid.GridPoint.InputType.X);
                weight += xWeight + GetLength(Grid.GridPoints[Grid.EmptyGridPoints[i].xCoord, Grid.EmptyGridPoints[i].yCoord], Direction.DiagonalTopToBottomLeft, Grid.GridPoint.InputType.X);
                weight += xWeight + GetLength(Grid.GridPoints[Grid.EmptyGridPoints[i].xCoord, Grid.EmptyGridPoints[i].yCoord], Direction.DiagonalBottomToTopRight, Grid.GridPoint.InputType.X);
                weight += xWeight + GetLength(Grid.GridPoints[Grid.EmptyGridPoints[i].xCoord, Grid.EmptyGridPoints[i].yCoord], Direction.DiagonalBottomToTopLeft, Grid.GridPoint.InputType.X);

                //  if the gridpoints weight is higher then the current, update the most potential gridpoint and current weight
                if (weight > curHighestWeight)
                {
                    mostPotentialGridPoint = Grid.EmptyGridPoints[i];
                    curHighestWeight       = weight;
                }
            }

            //  Input the new gridpoint
            Grid.InputGridPoint(mostPotentialGridPoint.xCoord, mostPotentialGridPoint.yCoord, Grid.GridPoint.InputType.O);
        }
        #endregion
    }
Exemplo n.º 2
0
    private int GetLength(Grid.GridPoint gridPoint, Direction dir, Grid.GridPoint.InputType inputType)
    {
        #region Check Sides
        //  Recursivly count top neighbors
        if (dir == Direction.Top && gridPoint.yCoord - 1 >= 0 && Grid.GridPoints[gridPoint.xCoord, gridPoint.yCoord - 1].input == inputType)
        {
            return(1 + GetLength(gridPoint.GetTopNeighbor(), dir, inputType));
        }

        //  Recursivly count right neighbors
        else if (dir == Direction.Right && gridPoint.xCoord + 1 < Grid.GridSize && Grid.GridPoints[gridPoint.xCoord + 1, gridPoint.yCoord].input == inputType)
        {
            return(1 + GetLength(gridPoint.GetRightNeighbor(), dir, inputType));
        }

        //  Recursivly count bottom neighbors
        else if (dir == Direction.Bottom && gridPoint.yCoord + 1 < Grid.GridSize && Grid.GridPoints[gridPoint.xCoord, gridPoint.yCoord + 1].input == inputType)
        {
            return(1 + GetLength(gridPoint.GetBottomNeighbor(), dir, inputType));
        }

        //  Recursivly count left neighbors
        else if (dir == Direction.Left && gridPoint.xCoord - 1 >= 0 && Grid.GridPoints[gridPoint.xCoord - 1, gridPoint.yCoord].input == inputType)
        {
            return(1 + GetLength(gridPoint.GetLeftNeighbor(), dir, inputType));
        }
        #endregion

        #region Check Digonals
        //  Recursivly count diagonal top-to-bottom right neighbors
        else if (dir == Direction.DiagonalTopToBottomRight &&
                 gridPoint.xCoord + 1 < Grid.GridSize && gridPoint.yCoord + 1 < Grid.GridSize &&
                 Grid.GridPoints[gridPoint.xCoord + 1, gridPoint.yCoord + 1].input == inputType)
        {
            return(1 + GetLength(gridPoint.GetTopToBottomRightNeighbor(), dir, inputType));
        }

        //  Recursivly count diagonal top-to-bottom left neighbors
        else if (dir == Direction.DiagonalTopToBottomLeft &&
                 gridPoint.xCoord - 1 >= 0 && gridPoint.yCoord + 1 < Grid.GridSize &&
                 Grid.GridPoints[gridPoint.xCoord - 1, gridPoint.yCoord + 1].input == inputType)
        {
            return(1 + GetLength(gridPoint.GetTopToBottomLeftNeighbor(), dir, inputType));
        }

        //  Recursivly count diagonal bottom-to-top right neighbors
        else if (dir == Direction.DiagonalBottomToTopRight &&
                 gridPoint.xCoord + 1 < Grid.GridSize && gridPoint.yCoord - 1 >= 0 &&
                 Grid.GridPoints[gridPoint.xCoord + 1, gridPoint.yCoord - 1].input == inputType)
        {
            return(1 + GetLength(gridPoint.GetBottomToTopRightNeighbor(), dir, inputType));
        }

        //  Recursivly count diagonal bottom-to-top left neighbors
        else if (dir == Direction.DiagonalBottomToTopLeft &&
                 gridPoint.xCoord - 1 >= 0 && gridPoint.yCoord - 1 >= 0 &&
                 Grid.GridPoints[gridPoint.xCoord - 1, gridPoint.yCoord - 1].input == inputType)
        {
            return(1 + GetLength(gridPoint.GetBottomToTopLeftNeighbor(), dir, inputType));
        }
        #endregion

        else
        {
            return(0);
        }
    }