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 }
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); } }