예제 #1
0
 /// <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;
 }
예제 #2
0
    /// <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);
                        }
                    }
                }
            }
        }