public bool OpponentCanWin(Node currentPosition) { bool canWin = false; List <Piece> possiblePieceForcedToMove = currentPosition.gameState.ScanForAllForcedPiece(); if (possiblePieceForcedToMove.Count > 0) { foreach (Piece selectedPiece in possiblePieceForcedToMove) { CheckerBoard lookAhead = gameObject.AddComponent <CheckerBoard>(); lookAhead = currentPosition.gameState; List <Vector2> possiblePositionsToMoveTo = selectedPiece.possiblePositionForcedToMoveTo; startDrag = gameState.UpdateDrag(selectedPiece); foreach (Vector2 possiblePosition in possiblePositionsToMoveTo) { endDrag = possiblePosition; currentPosition.ChangeMovingInState((int)startDrag.x, (int)startDrag.y, (int)endDrag.x, (int)endDrag.y); if (lookAhead.CheckVictory(state) == 1) { canWin = true; break; } } } } else { List <Piece> possiblePieceToMove = gameState.ScanForAllPiecePossibleToMove(); if (possiblePieceToMove.Count > 0) { foreach (Piece selectedPiece in possiblePieceToMove) { CheckerBoard lookAhead = gameObject.AddComponent <CheckerBoard>(); lookAhead = currentPosition.gameState; List <Vector2> possiblePositionsToMoveTo = selectedPiece.possiblePositionForcedToMoveTo; startDrag = gameState.UpdateDrag(selectedPiece); foreach (Vector2 possiblePosition in possiblePositionsToMoveTo) { endDrag = possiblePosition; currentPosition.ChangeMovingInState((int)startDrag.x, (int)startDrag.y, (int)endDrag.x, (int)endDrag.y); if (lookAhead.CheckVictory(state) == 1) { canWin = true; break; } } } } } return(canWin); }
public void selectAction() { LinkedList <Node> visited = new LinkedList <Node>(); Node cur = this; visited.AddLast(this); // if not win and cur is a leaf if (gameState.CheckVictory(state) == -9) { cur.expand(); Node newNode = cur.select(); gameState.Moving((int)newNode.state[65], (int)newNode.state[66], (int)newNode.state[67], (int)newNode.state[68]); if (newNode != null) { //newNode.GetCurrentCheckerBoard(); visited.AddLast(newNode); // caculate value of all child node double value = rollOut(newNode); foreach (Node node in visited) { node.updateStats(value); } } else { Debug.LogError("select action selected a null node"); } } else { double value = 0; switch (cur.gameState.CheckVictory(state)) { case 8: value = 1.0; break; case -8: value = 0.0; break; default: break; } foreach (Node node in visited) { node.updateStats(value); } } //return }
public double rollOut(Node tn) { CheckerBoard rollGS = gameObject.AddComponent <CheckerBoard>(); rollGS = tn.gameState; bool stillPlaying = true; double rc = 0; int pos; int move; List <Piece> possiblePieceForcedToMove = rollGS.ScanForAllForcedPiece(); if (possiblePieceForcedToMove.Count > 0) { while ((possiblePieceForcedToMove.Count > 0) && stillPlaying) { pos = r.Next(possiblePieceForcedToMove.Count - 1); startDrag = gameState.UpdateDrag(possiblePieceForcedToMove[pos]); List <Vector2> possiblePositionsToMoveTo = possiblePieceForcedToMove[pos].possiblePositionForcedToMoveTo; move = r.Next(possiblePositionsToMoveTo.Count - 1); endDrag = possiblePositionsToMoveTo[move]; tn.ChangeMovingInState((int)startDrag.x, (int)startDrag.y, (int)endDrag.x, (int)endDrag.y); switch (rollGS.CheckVictory(state)) { case -9: // 1 won - ai stillPlaying = false; if (!rollGS.whoseMove()) { rc = 1.0; } break; default: /* keep playing */ possiblePieceForcedToMove = rollGS.ScanForAllForcedPiece(); break; } } } else { List <Piece> possiblePieceToMove = gameState.ScanForAllPiecePossibleToMove(); while ((possiblePieceToMove.Count > 0) && stillPlaying) { pos = r.Next(possiblePieceToMove.Count - 1); startDrag = gameState.UpdateDrag(possiblePieceToMove[pos]); List <Vector2> possiblePositionsToMoveTo = possiblePieceToMove[pos].possiblePositionToMoveTo; move = r.Next(possiblePositionsToMoveTo.Count - 1); endDrag = possiblePositionsToMoveTo[move]; tn.ChangeMovingInState((int)startDrag.x, (int)startDrag.y, (int)endDrag.x, (int)endDrag.y); switch (rollGS.CheckVictory(state)) { case -9: // 1 won - ai stillPlaying = false; if (!rollGS.whoseMove()) { rc = 1.0; } break; default: /* keep playing */ possiblePieceToMove = rollGS.ScanForAllForcedPiece(); break; } } } return(rc); }