/// <summary> /// Create root Node /// </summary> /// <param name="player"></param> /// <param name="opponentPlayer"></param> public Node(Player player, Player opponentPlayer) { board = AIHandler.CloneBoard(_GameManager.board); this.player = AIHandler.ClonePlayer(player); this.opponentPlayer = AIHandler.ClonePlayer(opponentPlayer); captureBoxesPlayer = (player == _GameManager.players[0] ? AIHandler.CloneCaptureBoxesInitial(_GameManager.players[0].captureBench) : AIHandler.CloneCaptureBoxesInitial(_GameManager.players[1].captureBench)); captureBoxesOpponentPlayer = (opponentPlayer == _GameManager.players[0] ? AIHandler.CloneCaptureBoxesInitial(_GameManager.players[0].captureBench) : AIHandler.CloneCaptureBoxesInitial(_GameManager.players[1].captureBench)); isInitialPlayer = true; }
/// <summary> /// Create a children node, and apply the move given to get to the new state of the game /// </summary> /// <param name="parentNode">the parent node of this node</param> /// <param name="move">the move to get to the new state from parentNode</param> /// <param name="player">the current player in this node</param> /// <param name="opponentPlayer">the opponent player</param> /// <param name="makeTree"> will parent and children be insitialised</param> public Node(Node parentNode, Move move, Player player, Player opponentPlayer) { board = AIHandler.CloneBoard(parentNode.board); this.player = AIHandler.ClonePlayer(player); this.opponentPlayer = AIHandler.ClonePlayer(opponentPlayer); captureBoxesPlayer = AIHandler.CloneCaptureBoxesNode(parentNode.captureBoxesPlayer); captureBoxesOpponentPlayer = AIHandler.CloneCaptureBoxesNode(parentNode.captureBoxesOpponentPlayer); isInitialPlayer = parentNode.isInitialPlayer; Move m = AIHandler.CloneMove(move); m.play(this); _GameManager.AIupdateAllTokenMoves(this); isInitialPlayer = isInitialPlayer == true ? false : true; }
/// <summary> /// Met à jour les informations d'états et d'actions à partir du tableau courant. /// </summary> public void UpdateSensors(Board board, FOXCSOptions fo) { this.states.Clear(); this.actions.Clear(); this.board = AIHandler.CloneBoard(board); this.tokenOnBoard.Clear(); List <Token> tokenList = _GameManager.GetAllTokens(); if (_GameManager.toPromoteToken != null) { this.actions.Add(new Attribute("promote", new string[] { _GameManager.toPromoteToken.ToPrologCode(), FOXCS.ToPrologCode(true) }, fo.actionPredicateOptions["promote"])); this.actions.Add(new Attribute("promote", new string[] { _GameManager.toPromoteToken.ToPrologCode(), FOXCS.ToPrologCode(false) }, fo.actionPredicateOptions["promote"])); } foreach (Token tok in tokenList) { Attribute acc; if (!tok.isCaptured) { tokenOnBoard.Add(tok.ToPrologCode()); this.states.Add(new Attribute("onTile", new string[] { tok.ToPrologCode(), "c" + tok.box.getCoord().x.ToString(), "l" + tok.box.getCoord().y.ToString() }, fo.statePredicateOptions["onTile"])); List <Coordinates> tokLegalMoves = !tok.isPromoted ? tok.legalMoves(this.board) : tok.legalMovesPlus(this.board); List <Coordinates> tokPossibleMoves = !tok.isPromoted ? tok.possibleMoves(this.board) : tok.possibleMovesPlus(this.board); foreach (Coordinates cord in tokLegalMoves) { acc = new Attribute("legalMove", new string[] { tok.ToPrologCode(), "c" + cord.x.ToString(), "l" + cord.y.ToString() }, fo.statePredicateOptions["legalMove"]); if (!states.Contains(acc)) { this.states.Add(acc); } if (tok.owner.Equals(_GameManager.players[_GameManager.currentPlayerIndex]) && _GameManager.toPromoteToken == null) { acc = new Attribute("move", new string[] { tok.ToPrologCode(), "c" + cord.x.ToString(), "l" + cord.y.ToString() }, fo.actionPredicateOptions["move"]); if (!actions.Contains(acc)) { this.actions.Add(acc); } } } /* * tok.getTokensToEat(); * foreach (Coordinates cord in tok.possibleEats) * { * acc = new Attribute("inRange", new string[] { tok.ToPrologCode(), this.board.boxes[cord.getIndex()].getToken().ToPrologCode(), "c" + cord.x.ToString(), "l" + cord.y.ToString() }, fo.statePredicateOptions["inRange"]); * if (!states.Contains(acc)) * this.states.Add(acc); * } */ } else { foreach (Coordinates cord in tok.legalDrops(board)) { if (tok.owner.Equals(_GameManager.players[_GameManager.currentPlayerIndex]) && _GameManager.toPromoteToken == null) { acc = new Attribute("drop", new string[] { tok.ToPrologCode(), "c" + cord.x.ToString(), "l" + cord.y.ToString() }, fo.actionPredicateOptions["drop"]); if (!actions.Contains(acc)) { this.actions.Add(acc); } } acc = new Attribute("legalDrop", new string[] { tok.ToPrologCode(), "c" + cord.x.ToString(), "l" + cord.y.ToString() }, fo.statePredicateOptions["legalDrop"]); if (!states.Contains(acc)) { this.states.Add(acc); } } } } }