public static void GenerateSuccessors(Node node) { //Player 1 prioritizes moving up -> left or right -> Wall -> Down (tentative Move Ordering) PlayerInfo[] playerStatus = board.playerStatus; int p = node.Player; int nextPlayer = (p + 1) % 2; ActionFunction undo = new ActionFunction(Board.UndoMovePawn, p, playerStatus[p].x, playerStatus[p].y); #region Player 1's Successors if (node.Player == PLAYER1) //first check in all if statemtents is the players position in relation to moving { //Move up if (board.IsPawnMoveLegal(playerStatus[p].x, playerStatus[p].y, playerStatus[p].x - 1, playerStatus[p].y)) { node.Children.Add(new Node(new ActionFunction(Board.MovePawn, p, playerStatus[p].x - 1, playerStatus[p].y), undo, nextPlayer)); } else { // going up jumping over 1 player directly if (board.IsPawnMoveLegal(playerStatus[p].x, playerStatus[p].y, playerStatus[p].x - 2, playerStatus[p].y)) { node.Children.Add(new Node(new ActionFunction(Board.MovePawn, p, playerStatus[p].x - 2, playerStatus[p].y), undo, nextPlayer)); } // going Up by 1 and Right by 1 if (board.IsPawnMoveLegal(playerStatus[p].x, playerStatus[p].y, playerStatus[p].x - 1, playerStatus[p].y + 1)) { node.Children.Add(new Node(new ActionFunction(Board.MovePawn, p, playerStatus[p].x - 1, playerStatus[p].y + 1), undo, nextPlayer)); } //going Left by 1 AND Up by 1 if (board.IsPawnMoveLegal(playerStatus[p].x, playerStatus[p].y, playerStatus[p].x - 1, playerStatus[p].y - 1)) { node.Children.Add(new Node(new ActionFunction(Board.MovePawn, p, playerStatus[p].x - 1, playerStatus[p].y - 1), undo, nextPlayer)); } } //Move Left if (board.IsPawnMoveLegal(playerStatus[p].x, playerStatus[p].y, playerStatus[p].x, playerStatus[p].y - 1)) { node.Children.Add(new Node(new ActionFunction(Board.MovePawn, p, playerStatus[p].x, playerStatus[p].y - 1), undo, nextPlayer)); } // going Left jumping over 1 player directly else if (board.IsPawnMoveLegal(playerStatus[p].x, playerStatus[p].y, playerStatus[p].x, playerStatus[p].y - 2)) { node.Children.Add(new Node(new ActionFunction(Board.MovePawn, p, playerStatus[p].x, playerStatus[p].y - 2), undo, nextPlayer)); } //Move Right if (board.IsPawnMoveLegal(playerStatus[p].x, playerStatus[p].y, playerStatus[p].x, playerStatus[p].y + 1)) { node.Children.Add(new Node(new ActionFunction(Board.MovePawn, p, playerStatus[p].x, playerStatus[p].y + 1), undo, nextPlayer)); } //going Right by jumping over 1 player directly else if (board.IsPawnMoveLegal(playerStatus[p].x, playerStatus[p].y, playerStatus[p].x, playerStatus[p].y + 2)) { node.Children.Add(new Node(new ActionFunction(Board.MovePawn, p, playerStatus[p].x, playerStatus[p].y + 2), undo, nextPlayer)); } //Move Down // going down by 1 (checks on location and for walls) if (board.IsPawnMoveLegal(playerStatus[p].x, playerStatus[p].y, playerStatus[p].x + 1, playerStatus[p].y)) { node.Children.Add(new Node(new ActionFunction(Board.MovePawn, p, playerStatus[p].x + 1, playerStatus[p].y), undo, nextPlayer)); } else { // going down jumping over 1 player directly if (board.IsPawnMoveLegal(playerStatus[p].x, playerStatus[p].y, playerStatus[p].x + 2, playerStatus[p].y)) { node.Children.Add(new Node(new ActionFunction(Board.MovePawn, p, playerStatus[p].x + 2, playerStatus[p].y), undo, nextPlayer)); } // going Down by 1 AND to the Left by 1 if (board.IsPawnMoveLegal(playerStatus[p].x, playerStatus[p].y, playerStatus[p].x + 1, playerStatus[p].y - 1)) { node.Children.Add(new Node(new ActionFunction(Board.MovePawn, p, playerStatus[p].x + 1, playerStatus[p].y - 1), undo, nextPlayer)); } // going Right by 1 AND Down by 1 if (board.IsPawnMoveLegal(playerStatus[p].x, playerStatus[p].y, playerStatus[p].x - 1, playerStatus[p].y + 1)) { node.Children.Add(new Node(new ActionFunction(Board.MovePawn, p, playerStatus[p].x - 1, playerStatus[p].y + 1), undo, nextPlayer)); } } } #endregion #region Player 2's Successors else { //Player 2 prioritizes moving down -> left or right -> Wall -> Up (tentative Move Ordering) //Move Down // going down by 1 (checks on location and for walls) if (board.IsPawnMoveLegal(playerStatus[p].x, playerStatus[p].y, playerStatus[p].x + 1, playerStatus[p].y)) { node.Children.Add(new Node(new ActionFunction(Board.MovePawn, p, playerStatus[p].x + 1, playerStatus[p].y), undo, nextPlayer)); } else { // going down jumping over 1 player directly if (board.IsPawnMoveLegal(playerStatus[p].x, playerStatus[p].y, playerStatus[p].x + 2, playerStatus[p].y)) { node.Children.Add(new Node(new ActionFunction(Board.MovePawn, p, playerStatus[p].x + 2, playerStatus[p].y), undo, nextPlayer)); } // going Down by 1 AND to the Left by 1 if (board.IsPawnMoveLegal(playerStatus[p].x, playerStatus[p].y, playerStatus[p].x + 1, playerStatus[p].y - 1)) { node.Children.Add(new Node(new ActionFunction(Board.MovePawn, p, playerStatus[p].x + 1, playerStatus[p].y - 1), undo, nextPlayer)); } // going Right by 1 AND Down by 1 if (board.IsPawnMoveLegal(playerStatus[p].x, playerStatus[p].y, playerStatus[p].x + 1, playerStatus[p].y + 1)) { node.Children.Add(new Node(new ActionFunction(Board.MovePawn, p, playerStatus[p].x + 1, playerStatus[p].y + 1), undo, nextPlayer)); } } //Move Left // if (playerStatus[p].y - 1 >= 0) // { if (board.IsPawnMoveLegal(playerStatus[p].x, playerStatus[p].y, playerStatus[p].x, playerStatus[p].y - 1)) { node.Children.Add(new Node(new ActionFunction(Board.MovePawn, p, playerStatus[p].x, playerStatus[p].y - 1), undo, nextPlayer)); } // going Left jumping over 1 player directly else if (board.IsPawnMoveLegal(playerStatus[p].x, playerStatus[p].y, playerStatus[p].x, playerStatus[p].y - 2)) { node.Children.Add(new Node(new ActionFunction(Board.MovePawn, p, playerStatus[p].x, playerStatus[p].y - 2), undo, nextPlayer)); } //} //Move Right if (board.IsPawnMoveLegal(playerStatus[p].x, playerStatus[p].y, playerStatus[p].x, playerStatus[p].y + 1)) { node.Children.Add(new Node(new ActionFunction(Board.MovePawn, p, playerStatus[p].x, playerStatus[p].y + 1), undo, nextPlayer)); } //going Right jumping over 1 player directly else if (board.IsPawnMoveLegal(playerStatus[p].x, playerStatus[p].y, playerStatus[p].x, playerStatus[p].y + 2)) { node.Children.Add(new Node(new ActionFunction(Board.MovePawn, p, playerStatus[p].x, playerStatus[p].y + 2), undo, nextPlayer)); } //Move up if (board.IsPawnMoveLegal(playerStatus[p].x, playerStatus[p].y, playerStatus[p].x - 1, playerStatus[p].y)) { node.Children.Add(new Node(new ActionFunction(Board.MovePawn, p, playerStatus[p].x - 1, playerStatus[p].y), undo, nextPlayer)); } else { // going up jumping over 1 player directly if (board.IsPawnMoveLegal(playerStatus[p].x, playerStatus[p].y, playerStatus[p].x - 2, playerStatus[p].y)) { node.Children.Add(new Node(new ActionFunction(Board.MovePawn, p, playerStatus[p].x - 2, playerStatus[p].y), undo, nextPlayer)); } // going Up by 1 and Right by 1 if (board.IsPawnMoveLegal(playerStatus[p].x, playerStatus[p].y, playerStatus[p].x - 1, playerStatus[p].y + 1)) { node.Children.Add(new Node(new ActionFunction(Board.MovePawn, p, playerStatus[p].x - 1, playerStatus[p].y + 1), undo, nextPlayer)); } //going Left by 1 AND Up by 1 if (board.IsPawnMoveLegal(playerStatus[p].x, playerStatus[p].y, playerStatus[p].x - 1, playerStatus[p].y - 1)) { node.Children.Add(new Node(new ActionFunction(Board.MovePawn, p, playerStatus[p].x - 1, playerStatus[p].y - 1), undo, nextPlayer)); } } } #endregion #region Wall Generation (for both players) taking too long if (playerStatus[p].wallsLeft == 0) // player has no wall left { return; } ActionFunction undoWall; for (int x = 0; x < Board.BOARD_SIZE - 1; x++) { for (int y = 0; y < Board.BOARD_SIZE - 1; y++) { //Horizontal Wall if (board.CheckWallH(x, y)) { undoWall = new ActionFunction(Board.UndoPlaceHorizontalWall, p, x, y); node.Children.Add(new Node(new ActionFunction(Board.PlaceHorizontalWall, p, x, y), undoWall, nextPlayer)); } //Vertical Wall if (board.CheckWallV(x, y)) { undoWall = new ActionFunction(Board.UndoPlaceVerticalWall, p, x, y); node.Children.Add(new Node(new ActionFunction(Board.PlaceVerticalWall, p, x, y), undoWall, nextPlayer)); } } } #endregion }
private IEnumerator PlayersTurn(int p) // Player Controls { MessageText.text = ""; //int p = playerNum - 1; //move or choose wall playerStatus[p].currentTurn = true; playersTurnText.text = "Player " + (p + 1) + "'s Turn!"; while (playerStatus[p].currentTurn) { // Passing Turn if (Input.GetKeyUp(KeyCode.X)) { playersTurnText.text = "Player " + (p + 1) + " Passes!"; playerStatus[p].currentTurn = false; yield return(m_StartWait); // Debug.Log("Player " + (p + 1) + "Passes."); } ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; bool collisionFound = Physics.Raycast(ray, out hit); // Moving Handler if (Input.GetMouseButtonUp(0)) { GameObject tempObj; if (collisionFound) { if (hit.transform.tag == "Board") { gameSquareInfo tempSquare; int xDiff; int yDiff; tempObj = hit.collider.gameObject; tempSquare = tempObj.GetComponent <gameSquareInfo>(); xDiff = tempSquare.x - playerStatus[p].x; yDiff = tempSquare.y - playerStatus[p].y; //no matter what, chosen board must be available if (tempSquare.isOpen) { // DOWN----------------------------------------------------------- // going down by 1 (checks on location and for walls) if (xDiff == 1 && yDiff == 0 && MainBoard.IsPawnMoveLegal(playerStatus[p].x, playerStatus[p].y, tempSquare.x, tempSquare.y)) { RenderPawnPosition(p, tempSquare.x, tempSquare.y); Board.MovePawn(MainBoard, p, tempSquare.x, tempSquare.y); playerStatus[p].currentTurn = false; } // going down jumping over 1 player directly else if (xDiff == 2 && yDiff == 0 && MainBoard.IsPawnMoveLegal(playerStatus[p].x, playerStatus[p].y, tempSquare.x, tempSquare.y)) { RenderPawnPosition(p, tempSquare.x, tempSquare.y); Board.MovePawn(MainBoard, p, tempSquare.x, tempSquare.y); playerStatus[p].currentTurn = false; } // going Down by 1 AND to the Left by 1 else if (xDiff == 1 && yDiff == -1 && MainBoard.IsPawnMoveLegal(playerStatus[p].x, playerStatus[p].y, tempSquare.x, tempSquare.y)) { RenderPawnPosition(p, tempSquare.x, tempSquare.y); Board.MovePawn(MainBoard, p, tempSquare.x, tempSquare.y); playerStatus[p].currentTurn = false; } // UP----------------------------------------------------------------------- // going up by 1 (checks on location and for walls) else if (xDiff == -1 && yDiff == 0 && MainBoard.IsPawnMoveLegal(playerStatus[p].x, playerStatus[p].y, tempSquare.x, tempSquare.y)) { RenderPawnPosition(p, tempSquare.x, tempSquare.y); Board.MovePawn(MainBoard, p, tempSquare.x, tempSquare.y); playerStatus[p].currentTurn = false; } // going up jumping over 1 player directly else if (xDiff == -2 && yDiff == 0 && MainBoard.IsPawnMoveLegal(playerStatus[p].x, playerStatus[p].y, tempSquare.x, tempSquare.y)) { RenderPawnPosition(p, tempSquare.x, tempSquare.y); Board.MovePawn(MainBoard, p, tempSquare.x, tempSquare.y); playerStatus[p].currentTurn = false; } // going Up by 1 AND Right by 1 else if (xDiff == -1 && yDiff == 1 && MainBoard.IsPawnMoveLegal(playerStatus[p].x, playerStatus[p].y, tempSquare.x, tempSquare.y)) { RenderPawnPosition(p, tempSquare.x, tempSquare.y); Board.MovePawn(MainBoard, p, tempSquare.x, tempSquare.y); playerStatus[p].currentTurn = false; } // LEFT----------------------------------------------------------------------- // going Left by 1 (checks on location and for walls) else if (xDiff == 0 && yDiff == -1 && MainBoard.IsPawnMoveLegal(playerStatus[p].x, playerStatus[p].y, tempSquare.x, tempSquare.y)) { RenderPawnPosition(p, tempSquare.x, tempSquare.y); Board.MovePawn(MainBoard, p, tempSquare.x, tempSquare.y); playerStatus[p].currentTurn = false; } // going Left jumping over 1 player directly else if (xDiff == 0 && yDiff == -2 && MainBoard.IsPawnMoveLegal(playerStatus[p].x, playerStatus[p].y, tempSquare.x, tempSquare.y)) { RenderPawnPosition(p, tempSquare.x, tempSquare.y); Board.MovePawn(MainBoard, p, tempSquare.x, tempSquare.y); playerStatus[p].currentTurn = false; } //going Left by 1 AND Up by 1 else if (xDiff == -1 && yDiff == -1 && MainBoard.IsPawnMoveLegal(playerStatus[p].x, playerStatus[p].y, tempSquare.x, tempSquare.y)) { RenderPawnPosition(p, tempSquare.x, tempSquare.y); Board.MovePawn(MainBoard, p, tempSquare.x, tempSquare.y); playerStatus[p].currentTurn = false; } // RIGHT----------------------------------------------------------------------- // going Right by 1 (checks on location and for walls) else if (xDiff == 0 && yDiff == 1 && MainBoard.IsPawnMoveLegal(playerStatus[p].x, playerStatus[p].y, tempSquare.x, tempSquare.y)) { RenderPawnPosition(p, tempSquare.x, tempSquare.y); Board.MovePawn(MainBoard, p, tempSquare.x, tempSquare.y); playerStatus[p].currentTurn = false; } else if (xDiff == 0 && yDiff == 2 && MainBoard.IsPawnMoveLegal(playerStatus[p].x, playerStatus[p].y, tempSquare.x, tempSquare.y)) { RenderPawnPosition(p, tempSquare.x, tempSquare.y); Board.MovePawn(MainBoard, p, tempSquare.x, tempSquare.y); playerStatus[p].currentTurn = false; } // going Right by 1 AND Down by 1 else if (xDiff == 1 && yDiff == 1 && MainBoard.IsPawnMoveLegal(playerStatus[p].x, playerStatus[p].y, tempSquare.x, tempSquare.y)) { RenderPawnPosition(p, tempSquare.x, tempSquare.y); Board.MovePawn(MainBoard, p, tempSquare.x, tempSquare.y); playerStatus[p].currentTurn = false; } } } //end of "Board" tag //PLACING HORIZONTAL WALLS via Left-Click-------------------------------------------------- if (hit.transform.tag == "Peg") { WallPeg tempPeg; tempObj = hit.collider.gameObject; tempPeg = tempObj.GetComponent <WallPeg>(); //if wall can be placed, place it and end turn if (playerStatus[p].wallsLeft > 0 && MainBoard.CheckWallH(tempPeg.x, tempPeg.y)) { RenderWall(tempPeg.x, tempPeg.y, true); Board.PlaceHorizontalWall(MainBoard, p, tempPeg.x, tempPeg.y); playerStatus[p].currentTurn = false; UpdateWallRemTxt(); } } } }//end of Left Click if-statement //PLACING VERTICAL WALLS via Right-Click--------------------------------------------------- if (Input.GetMouseButtonUp(1)) { if (collisionFound) { GameObject tempObj; if (hit.transform.tag == "Peg") { WallPeg tempPeg; tempObj = hit.collider.gameObject; tempPeg = tempObj.GetComponent <WallPeg>(); //if wall can be placed, place it and end turn if (playerStatus[p].wallsLeft > 0 && MainBoard.CheckWallV(tempPeg.x, tempPeg.y)) { RenderWall(tempPeg.x, tempPeg.y, false); Board.PlaceVerticalWall(MainBoard, p, tempPeg.x, tempPeg.y); playerStatus[p].currentTurn = false; UpdateWallRemTxt(); } } } }//end of Right Click if statement yield return(null); }// end of current turn while loop }