Exemple #1
0
        /// <summary>
        /// Checks if node is still movable
        /// </summary>
        /// <param name="node"></param>
        /// <returns></returns>
        protected Boolean IsValid(MoveNode from, MoveNode to)
        {
            // There was no previous node, so it's valid
            if (from.Action == MoveNode.Type.None)
            {
                return(true);
            }

            // Already on the next node, so it's valid
            if (from.Equals(to))
            {
                return(true);
            }

            // Look up if to is still a neighbour of from (pre-calc)
            List <Node <MoveNode> > neighbours = null;

            if (_neighbours.TryGetValue(from, out neighbours))
            {
                return(neighbours.Any(n => n.Value.Equals(to)));
            }

            // Fetch and look up
            return(CreateMoveNodesFrom(new Node <MoveNode>()
            {
                Value = from
            }).Any(n => n.Value.Equals(to)));
        }
Exemple #2
0
    public void MoveLeft(int distance)
    {
        try {
            Debug.Log(gameObject.name + ": Moving West");
            //throw new System.NotImplementedException();
            int x = currentNode.x;
            int z = currentNode.z;

            if (x <= 0)
            {
                Debug.Log("You hit the left! node_id= " + x + " z = " + z);
                DestroyBullet();
                EndPhase();
                return;
            }

            MoveNode targetNode = nodes[x - distance, z];
            //remove from currentNode
            //add to targetNode
            currentNode.RemoveFromNode(gameObject);
            targetNode.AddToNode(gameObject);

            StartCoroutine(MoveToNode(targetNode));
            currentNode = targetNode;
        } catch (NullReferenceException e) {
            Console.WriteLine(e);
        }
    }
Exemple #3
0
        /// <summary>
        /// Expand the tree out to our maximum depth, only expanding leaf nodes with the best-possible score
        /// </summary>
        /// <param name="maxDepth"></param>
        public void Expand(int maxDepth)
        {
            NumLeaves             = 0;
            ConsideredBoardStates = new List <TakBoard>();
            List <TakMove> nextMoves = PlayerAI.EnumerateMoves(MyColor, Root.InitialState);

            foreach (TakMove m in nextMoves)
            {
                MoveNode n = new MoveNode(Root.InitialState, m);
                if (!ConsideredBoardStates.Contains(n.ResultingState.Board))
                {
                    ConsideredBoardStates.Add(n.ResultingState.Board);
                    n.Depth  = 1;
                    n.Parent = null;
                    n.Score  = n.ResultingState.Evaluate(MyColor);
                    Root.Children.Add(n);
                }
            }

            // recursively expand the tree
            MaxDepth = maxDepth;
            foreach (MoveNode n in Root.Children)
            {
                n.Score = ABPrune(n, (double)int.MinValue - 1, (double)int.MaxValue + 1, true);
            }
            Root.Children.Sort();
            PrintDebug(string.Format("Explored {0} board states", ConsideredBoardStates.Count));
            PrintDebug(string.Format("Explored {0} leaves", NumLeaves));
        }
Exemple #4
0
        public MovesTree()
        {
            root = new MoveNode();
            lastAttackCombo = -1;

            return;
        }
Exemple #5
0
    public List <MoveNode> GetPossInRange(Vector2Int pos, int range, bool canMoveThroughUnits = true)
    {
        var possInRange  = new List <MoveNode>();
        var existingPoss = new Dictionary <Vector2Int, bool>();

        var possToCheck = new List <MoveNode>();
        var newPoss     = new List <MoveNode>();

        possToCheck.Add(new MoveNode(pos, null));
        existingPoss[pos] = true;

        for (int i = 0; i < range; i++)
        {
            foreach (var posToCheck in possToCheck)
            {
                foreach (var adjacentPos in GridUtils.GetAdjacentPoss(posToCheck.pos))
                {
                    if (!existingPoss.ContainsKey(adjacentPos) && IsTileAt(adjacentPos) && (canMoveThroughUnits || !GetUnitAt(adjacentPos)))
                    {
                        existingPoss[adjacentPos] = true;

                        var newNode = new MoveNode(adjacentPos, posToCheck);
                        possInRange.Add(newNode);
                        newPoss.Add(newNode);
                    }
                }
            }

            possToCheck = newPoss;
            newPoss     = new List <MoveNode>();
        }

        return(possInRange);
    }
Exemple #6
0
    public Direction?GetTargetDirection(MoveNode node)
    {
        int x = currentNode.x;
        int z = currentNode.z;

        if (node.x == x && node.z == z + 1)
        {
            return(Direction.North);
        }
        else if (node.x == x && node.z == z - 1)
        {
            return(Direction.South);
        }
        else if (node.x == x + 1 && node.z == z)
        {
            return(Direction.East);
        }
        else if (node.x == x - 1 && node.z == z)
        {
            return(Direction.West);
        }
        else
        {
            return(null);
        }
    }
Exemple #7
0
        public List <Move> GetPath(int x, int y, int rot)
        {
            MoveNode node = field[x, y, rot];

            if (!node.valid)
            {
                return(null);
            }
            List <Move> moves    = new List <Move>();
            bool        skipping = true;

            while (!node.root)
            {
                if (node.move != Move.SONIC_DROP)
                {
                    skipping = false;
                }
                if (!skipping)
                {
                    moves.Add(node.move);
                }
                node = field[node.parent.x, node.parent.y, node.parent.rot];
            }
            moves.Reverse();
            return(moves);
        }
Exemple #8
0
        public static MoveNode BuildMoveTree(BeamCoreState g, Vector2 curPos, Heading curHead, int depth, List <Vector2> otherBadPos = null)
        {
            Vector2  nextPos = UpcomingGridPoint(curPos, curHead);
            MoveNode root    = MoveNode.GenerateTree(g, nextPos, curHead, 1, otherBadPos);

            return(root);
        }
Exemple #9
0
        /// <summary>
        /// Checks if we have debut answer for moves
        /// </summary>
        /// <param name="moves">List of all moves</param>
        /// <returns>MoveIterator that points on certain node, or End iterator if there no answer</returns>
        public MoveIterator CheckMoves(List<Move> moves)
        {
            //there no so long combinations in tree :(
            if (moves.Count > 10)
                return MoveIterator.End;

            MoveNode temp = new MoveNode(moves[0]);

            if (!rootMoves.ContainsKey(temp))
                return MoveIterator.End;

            MoveIterator iter = new MoveIterator(rootMoves[temp]);

            for (int i = 1; i < moves.Count; ++i)
            {
                if (iter == MoveIterator.End)
                    break;

                temp.Move = moves[i];

                if (!iter.CurrentNode.Replies.ContainsKey(temp))
                    return MoveIterator.End;

                iter.CurrentNode = iter.CurrentNode.Replies[temp];
            }

            return iter;
        }
Exemple #10
0
    public void SpawnEnemy(int nodeX, int nodeZ, EnemyType type)
    {
        MoveNode node = Nodes[nodeX, nodeZ];

        if (node.objectsOnNode.Count == 0)
        {
            GameObject enemy  = (GameObject)Instantiate(EnemyTransforms[(int)type].gameObject);
            int        enemyX = nodeX;
            int        enemyZ = nodeZ;
            enemy.GetComponent <EnemyMover>().currentNode = Nodes[enemyX, enemyZ];
            EnemyController.totalEnemies++;
            Nodes[enemyX, enemyZ].AddToNode(enemy);
            EnemiesController.ec.Enemies.Add(enemy.GetComponent <EnemyController>());
            enemy.transform.position = Nodes[enemyX, enemyZ].transform.position;
            enemy.name = "Enemy " + EnemyController.totalEnemies;
            foreach (Transform t in enemy.transform)
            {
                Renderer[] renderers = t.GetComponentsInChildren <Renderer>();
                foreach (Renderer r in renderers)
                {
                    r.enabled = false;
                }
            }
            FallingSpawn fs = enemy.GetComponent <FallingSpawn>();
            //StartCoroutine(fs.FallIntoPlace());
            fs.FallIntoPlaceTweened();
        }
        else
        {
            Debug.Log("Node (" + nodeX + "," + nodeZ + ") full, can't spawn here!");
        }
    }
Exemple #11
0
    public void MoveDown(int distance)
    {
        try {
            Debug.Log(gameObject.name + ": Moving South");
            //throw new System.NotImplementedException();
            int x = currentNode.x;
            int z = currentNode.z;

            if (z <= 0)
            {
                Debug.Log("You hit the bottom! node_id= " + x + " z = " + z);
                _ec.EndPhase();
                return;
            }

            MoveNode targetNode = nodes [x, z - distance];
            //remove from currentNode
            //add to targetNode
            currentNode.RemoveFromNode(gameObject);
            targetNode.AddToNode(gameObject);

            MoveToNodeTweened(targetNode);
            currentNode = targetNode;
        } catch (NullReferenceException e) {
            Console.WriteLine(e);
        }
    }
Exemple #12
0
    private Direction?GetDirectionToNode(MoveNode from, MoveNode to)
    {
        int deltaX = from.x - to.x;
        int deltaZ = from.z - to.z;

        if (Mathf.Abs(deltaX) > Mathf.Abs(deltaZ))
        {
            if (deltaX > 0)  //enemy is east of node, must move west
            {
                return(Direction.West);
            }
            if (deltaX < 0)
            {
                return(Direction.East);
            }
        }
        else if (Mathf.Abs(deltaZ) > Mathf.Abs(deltaX))
        {
            if (deltaZ > 0) //enemy is north of node, must move south
            {
                return(Direction.South);
            }
            if (deltaZ < 0)
            {
                return(Direction.North);
            }
        }

        return(null);
    }
Exemple #13
0
    public void MoveRight(int distance)
    {
        try {
            Debug.Log(gameObject.name + ": Moving East");
            //throw new System.NotImplementedException();
            int x = currentNode.x;
            int z = currentNode.z;

            if (x >= nodes.GetUpperBound(0))
            {
                Debug.Log("You hit the right! node_id= " + x + " z = " + z);
                _ec.EndPhase();
                return;
            }

            MoveNode targetNode = nodes [x + distance, z];
            //remove from currentNode
            //add to targetNode
            currentNode.RemoveFromNode(gameObject);
            targetNode.AddToNode(gameObject);

            MoveToNodeTweened(targetNode);
            currentNode = targetNode;
        } catch (NullReferenceException e) {
            Console.WriteLine(e);
        }
    }
Exemple #14
0
    public void MoveUp(int distance)
    {
        try {
            Debug.Log(gameObject.name + ": Moving North");
            //throw new System.NotImplementedException();
            int x = currentNode.x;
            int z = currentNode.z;

            if (z >= nodes.GetUpperBound(1))                //bust out early if you're at the top of the map
            {
                Debug.Log("You hit the top! node_id= " + x + " z = " + z);
                _ec.EndPhase();
                return;
            }

            MoveNode targetNode = nodes [x, z + distance];
            //remove from currentNode
            //add to targetNode
            currentNode.RemoveFromNode(gameObject);
            targetNode.AddToNode(gameObject);

            MoveToNodeTweened(targetNode);
            currentNode = targetNode;
        } catch (NullReferenceException e) {
            Console.WriteLine(e);
        }
    }
Exemple #15
0
        /// <summary>
        /// 指し手行を出力します。
        /// </summary>
        private void WriteMakeKif(TextWriter writer, MoveNode node,
                                  Board board, bool hasVariation)
        {
            var lmove = board.ConvertLiteralFromMove(node.Move, true);

            if (lmove == null || !lmove.Validate())
            {
                Log.Error("指し手'{0}'を出力できませんでした。", node.Move);
                return;
            }

            if (lmove.SpecialMoveType == SpecialMoveType.None)
            {
                // 半角文字相当の文字数で空白の数を計算します。
                var moveText = Stringizer.ToString(lmove, MoveTextStyle.KifFile);
                var hanLen   = moveText.HankakuLength();

                writer.WriteLine(
                    @"{0,4} {1}{2} ({3:mm\:ss} / {4:hh\:mm\:ss}){5}",
                    node.MoveCount,
                    moveText,
                    new string(' ', Math.Max(0, 14 - hanLen)),
                    node.Duration,
                    node.TotalDuration,
                    (hasVariation ? "+" : ""));
            }
            else
            {
                // とりあえず空にしておく
            }
        }
Exemple #16
0
    //HELPER METHODS
    public MoveNode GetDistantNode(MoveNode currentNode, int newX, int newZ)
    {
        int thisX = currentNode.x;
        int thisZ = currentNode.z;

        return(Nodes[thisX + newX, thisZ + newZ]);
    }
Exemple #17
0
    public void SpawnPhone(int nodeX, int nodeZ)
    {
        //Relies on the calling method having checked for a clear space
        MoveNode node = Nodes[nodeX, nodeZ];

        GameObject phone  = Instantiate(PhoneTransform.gameObject);
        int        phoneX = nodeX;
        int        phoneZ = nodeZ;

        phone.GetComponent <Phone>().currentNode = Nodes[phoneX, phoneZ];
        PhoneController.pc.currentPhone          = phone.GetComponent <Phone>();
        Nodes[phoneX, phoneZ].AddToNode(phone);
        phone.transform.position = Nodes[phoneX, phoneZ].transform.position;
        foreach (Transform t in phone.transform)
        {
            Renderer[] renderers = t.GetComponentsInChildren <Renderer>();
            foreach (Renderer r in renderers)
            {
                r.enabled = false;
            }
        }
        FallingSpawn fs = phone.GetComponent <FallingSpawn>();

        //StartCoroutine(fs.FallIntoPlace());
        fs.FallIntoPlaceTweened();
    }
Exemple #18
0
        /// <summary>
        /// Adds all moves to Tree
        /// </summary>
        /// <param name="whitePos">Position of white figures on board</param>
        /// <param name="moves">Pairs of moves and replies e.g. ("e2-e4", "e7-e5")</param>
        public void AddMoves(PlayerPosition whitePos, params string[] moves)
        {
            Move temp = new Move(moves[0]);
            MoveNode tempNode = new MoveNode(temp);

            //iterator, that will add move to tree
            MoveIterator pushingIterator = null;

            MoveNode next = null;

            if (!rootMoves.ContainsKey(tempNode))
            {
                rootMoves.Add(tempNode, tempNode);
                next = rootMoves[tempNode].Add(new Move(moves[1]));
            }
            else
            {
                next = rootMoves[tempNode].Add(new Move(moves[1]));
            }

            pushingIterator = GetIterator(tempNode);
            //next answer
            pushingIterator.CurrentNode = next;

            int i = 2;
            while (i < moves.Length)
            {
                pushingIterator.CurrentNode = pushingIterator.CurrentNode.Add(moves[i], whitePos);
                ++i;
            }
        }
Exemple #19
0
 private Tuple<MoveNode, double> getChild(Square square)
 {
     instances++;
     MoveNode node = new MoveNode(board, square, evaluator);
     if (square.number == 2) return Tuple.Create(node, 0.9);
     else return Tuple.Create(node, 0.1);
 }
Exemple #20
0
 public MoveNode(int x, int y, double rank)
 {
     group = new Group(x, y, 0);
     this.rank = rank;
     ply = 0;
     board = null;
     previousMove = null;
 }
Exemple #21
0
 public MoveNode()
 {
     group = new Group(0, 0, 0);
     rank = 0;
     ply = 0;
     board = null;
     previousMove = null;
 }
Exemple #22
0
    public IEnumerator MoveUnit(Unit unit, MoveNode moveNode)
    {
        unitsByPos[unit.GetPosition()] = null;

        yield return(StartCoroutine(unit.Move(moveNode)));

        unitsByPos[unit.GetPosition()] = unit;
    }
Exemple #23
0
 public MoveNode(Group m, double rank, int ply, Grid board, MoveNode last)
 {
     this.group = m;
     this.rank = rank;
     this.ply = ply;
     this.board = board;
     previousMove = last;
 }
Exemple #24
0
 public void Clear()
 {
     // TODO: Dispose Moves
     FirstMove  = null;
     NextMove   = null;
     MovesCount = 0;
     StartingState.Clear();
 }
Exemple #25
0
    public void FlagNewLOSNodes()
    {
        //unflag all nodes
        foreach (MoveNode node in Nodes)
        {
            node.LOSToPlayer = false;
        }

        MoveNode currentNode = PlayerController.pc.Mover.currentNode;

        //flag player's node
        currentNode.LOSToPlayer = true;

        //find LOS nodes in each direction
        //Check North, stop at first obstacle
        for (int i = currentNode.z; i < mapLength; i++)
        {
            MoveNode node = Nodes[currentNode.x, i];
            if (node.blocksLOS)
            {
                break;
            }
            node.LOSToPlayer = true;
        }

        //Check South
        for (int i = currentNode.z; i >= 0; i--)
        {
            MoveNode node = Nodes[currentNode.x, i];
            if (node.blocksLOS)
            {
                break;
            }
            node.LOSToPlayer = true;
        }

        //Check East
        for (int i = currentNode.x; i < mapWidth; i++)
        {
            MoveNode node = Nodes[i, currentNode.z];
            if (node.blocksLOS)
            {
                break;
            }
            node.LOSToPlayer = true;
        }

        //Check West
        for (int i = currentNode.x; i >= 0; i--)
        {
            MoveNode node = Nodes[i, currentNode.z];
            if (node.blocksLOS)
            {
                break;
            }
            node.LOSToPlayer = true;
        }
    }
Exemple #26
0
    private void addIndex(SquareIndex index)
    {
        MoveNode endNode = nodeList[0];

        nodeList.Add(instantiateMoveNode(moveNodePrefab, endNode.index, 10));

        endNode.index = index;
        endNode.gameObject.transform.localPosition = board.squareIndexToWorld(index);
    }
Exemple #27
0
 public void TakeTurn(Piece[,] board, Piece[,] WhiteTaken, Piece[,] BlackTaken, int[] whiteTakenIndeces, int[] blackTakenIndeces, int depth)
 {
     topNode = new MoveNode(board);
     think(depth, topNode);
     bool mate = false;
     AvailableMove move = selectMove(allMovesList, board, ref mate, currentColour);
     if (!mate)
         makeMove(move, board, WhiteTaken, BlackTaken, whiteTakenIndeces, blackTakenIndeces);
 }
Exemple #28
0
 /// <summary>
 /// CSA形式の指し手を出力します。
 /// </summary>
 private void WriteMoveNode(TextWriter writer, MoveNode node)
 {
     // 各指し手行を出力します。
     for (node = node.NextNode; node != null; node = node.NextNode)
     {
         writer.WriteLine(node.Move.ToCsa());
         writer.WriteLine("T" + node.DurationSeconds);
     }
 }
        public SymmetryEnvironment(MoveNode.GradeNode lowestNode)
        {
            this.lowestNode = lowestNode;
            config = lowestNode.MoveNode.config;

            colorFalse = new bool[config.colors];
            colorUsed = new bool[config.colors];
            init();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            textBox3.Text = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + "\\New";
            moveNode1     = new MoveNode(treeView1);


            //RELOAD

            Reload();
        }
Exemple #31
0
 public void UnTagMovableNodes()
 {
     for (int i = 0; i < movableNodes.Count; i++)
     {
         MoveNode    node           = movableNodes[i];
         MovableNode nodeController = node.transform.parent.GetComponentInChildren <MovableNode>();
         nodeController.currentState = MovableNode.NodeState.Off;
         node.movable = false;
     }
     movableNodes.Clear();
 }
Exemple #32
0
        private void analysis()
        {
            Console.WriteLine("Starting Root Analysis...");
            Type      assessClass = typeof(MaxSizeAssessor);
            Stopwatch st          = Stopwatch.StartNew();
            MoveNode  mn          = mm.runOneStepAheadAnalysis(assessClass);

            Console.WriteLine("Time Taken: " + st.ElapsedMilliseconds + " ms");
            printResultMove(mn);
            gradePrompt();
        }
Exemple #33
0
        /// <summary>
        /// コメント行を出力します。
        /// </summary>
        private void WriteCommentKif(TextWriter writer, MoveNode node)
        {
            var commentList = node.Comment.Split(
                new char[] { '\n' },
                StringSplitOptions.RemoveEmptyEntries);

            foreach (var comment in commentList)
            {
                writer.WriteLine("*{0}", comment);
            }
        }
Exemple #34
0
    /// <summary>
    /// Instantiates a new move node
    /// </summary>
    /// <returns>The move node.</returns>
    /// <param name="prefab">The prefab for the node (there could be different nodes).</param>
    /// <param name="index">The index for the node.</param>
    /// <param name="numMoves">Number of moves left to show on the node.</param>
    private MoveNode instantiateMoveNode(GameObject prefab, SquareIndex index, int numMoves)
    {
        MoveNode moveNode = (GameObject.Instantiate(prefab) as GameObject).GetComponent <MoveNode>();

        moveNode.init(numMoves, index);

        moveNode.transform.parent        = transform;
        moveNode.transform.localPosition = board.squareIndexToWorld(index);

        return(moveNode);
    }
        public virtual bool checkSymmetry(MoveNode move)
        {
            StringBuilder SymmetryString = new StringBuilder(config.pegs);
            int UnusedNumber = 0;
            bool anySymmetries = false;
            bool allUnused = true;
            int[] currentSet = move.SinglePegs;

            for (int i = 0; i < currentSet.Length; i++) // loop through
            {
                // the currently
                // tested move
                int peg = currentSet[i]; // select a peg
                if (!colorUsed[peg]) // if that color hasn't been used yet
                {
                    // --> free color
                    anySymmetries = true;
                    for (int z = 0; z < i; z++) // check whether we already had
                    {
                        // that color marked unused
                        if (alphabet.Contains(SymmetryString[z] + "") && currentSet[z] == peg)
                        {
                            SymmetryString.Append(SymmetryString[z]);
                            goto pegLoopContinue;
                        }
                    }
                    SymmetryString.Append(alphabet[UnusedNumber]);
                    UnusedNumber++;
                }
                else if (colorFalse[peg])
                {
                    SymmetryString.Append("z");
                    anySymmetries = true;
                    allUnused = false;
                }
                else
                {
                    SymmetryString.Append(peg);
                    allUnused = false;
                }
                pegLoopContinue:;
            }
            if (anySymmetries)
            {
                string sym = SymmetryString.ToString();
                if (!SymmetrySet.TryAdd(sym, 0))
                    return false;
                if (allUnused)
                {
                    permutation("", sym);
                }
            }
            return true;
        }
Exemple #36
0
        /// <summary>
        /// CSA形式の指し手を出力します。
        /// </summary>
        private void WriteMoveNode(TextWriter writer, MoveNode node)
        {
            var csaList = KifuObject.Convert2List(node)
                          .Select(_ => _.ToCsa());

            // 各指し手行を出力します。
            foreach (var csa in csaList)
            {
                writer.WriteLine(csa);
            }
        }
Exemple #37
0
 //Set Active
 public void SetActive(int n, MoveNode m)
 {
     if (n != active)
     {
         active      = n;
         currentNode = m;
         if (active == 1)
         {
             Debug.Log("Follow Active");
         }
     }
 }
Exemple #38
0
        /// <summary>
        /// 指し手ツリーをリスト形式に変換します。
        /// </summary>
        public static IEnumerable<BoardMove> Convert2List(MoveNode root)
        {
            if (root == null)
            {
                throw new ArgumentNullException("root");
            }

            for (var node = root.NextNode; node != null; node = node.NextNode)
            {
                yield return node.Move;
            }
        }
Exemple #39
0
 public void UnTagShootableEnemies()
 {
     for (int i = 0; i < shootableEnemies.Count; i++)
     {
         EnemyController ec   = shootableEnemies[i];
         MoveNode        node = ec.Mover.currentNode;
         ec.shootable = false;
         ShootableNode nodeController = node.transform.parent.GetComponentInChildren <ShootableNode>();
         nodeController.currentState = ShootableNode.NodeState.Off;
     }
     shootableEnemies.Clear();
 }
Exemple #40
0
    public void TagMovableNodes()
    {
        movableNodes = new List <MoveNode>();
        MoveNode node = GetTargetNode(Direction.North, 1);

        if (node != null)
        {
            if (!node.blocksMovement)
            {
                node.movable = true;
                MovableNode nodeController = node.transform.parent.GetComponentInChildren <MovableNode>();
                nodeController.currentState = MovableNode.NodeState.MovableUnselected;
                movableNodes.Add(node);
            }
        }

        node = GetTargetNode(Direction.South, 1);
        if (node != null)
        {
            if (!node.blocksMovement)
            {
                node.movable = true;
                MovableNode nodeController = node.transform.parent.GetComponentInChildren <MovableNode>();
                nodeController.currentState = MovableNode.NodeState.MovableUnselected;
                movableNodes.Add(node);
            }
        }

        node = GetTargetNode(Direction.East, 1);
        if (node != null)
        {
            if (!node.blocksMovement)
            {
                node.movable = true;
                MovableNode nodeController = node.transform.parent.GetComponentInChildren <MovableNode>();
                nodeController.currentState = MovableNode.NodeState.MovableUnselected;
                movableNodes.Add(node);
            }
        }

        node = GetTargetNode(Direction.West, 1);
        if (node != null)
        {
            if (!node.blocksMovement)
            {
                node.movable = true;
                MovableNode nodeController = node.transform.parent.GetComponentInChildren <MovableNode>();
                nodeController.currentState = MovableNode.NodeState.MovableUnselected;
                movableNodes.Add(node);
            }
        }
    }
Exemple #41
0
 //Set Active
 public void SetActive(int n, MoveNode m)
 {
     if (n != active)
     {
         active      = n;
         currentNode = m;
         if (active == 1)
         {
             Debug.Log("Return Active");
             targetNode = p.getCurrrentNode();
         }
     }
 }
Exemple #42
0
        public MoveNode[] expandNodes(Grid board, MoveNode last, int ply)
        {
            List<MoveNode> nodes = new List<MoveNode>();
            List<Group> moves = board.calculateGroups();

            foreach(Group move in moves)
            {
                Grid b = board.copy();
                if (b.checkMove(move.X, move.Y))
                {
                    b.removeGroup(move.X, move.Y);
                    b.compressGrid();
                    nodes.Add(new MoveNode(move, rankGrid(b), ply, b, last));
                }
            }
            return nodes.ToArray();
        }
Exemple #43
0
        public Direction getDirection(GameBoard board)
        {
            Stopwatch timer = Stopwatch.StartNew();
            int level = 0;
            rootNode = new MoveNode(board, evaluator);

            List<GameNode> bottomNodes = new List<GameNode>();
            bottomNodes.Add(rootNode);
            while (timer.ElapsedMilliseconds < moveTimeInMs)
            {
                level++;
                List<GameNode> newNodes = new List<GameNode>();
                foreach (GameNode node in bottomNodes)
                {
                    node.calculateChildren();
                    newNodes.AddRange(node.getChildren());
                }
                bottomNodes = newNodes;
            }
            Console.WriteLine(level);
            return rootNode.bestDirection();
        }
Exemple #44
0
        /// <summary>
        /// 指し手リストをツリー形式に変換します。
        /// </summary>
        public static MoveNode Convert2Node(IEnumerable<BoardMove> moveList,
                                            int firstMoveCount)
        {
            if (moveList == null)
            {
                throw new ArgumentNullException("moveList");
            }

            var root = new MoveNode();
            var last = root;

            foreach (var move in moveList)
            {
                var node = new MoveNode()
                {
                    MoveCount = firstMoveCount++,
                    Move = move,
                };

                last.NextNodes.Add(node);
                last = node;
            }

            return root;
        }
Exemple #45
0
        /// <summary>
        /// 次の指し手ノードを追加します。
        /// </summary>
        public void AddNext(MoveNode node)
        {
            if (node == null)
            {
                throw new ArgumentNullException("node");
            }

            if (node.ParentNode != null)
            {
                throw new InvalidOperationException(
                    "すでに親ノードが登録されています。");
            }

            NextNodes.Add(node);
            node.ParentNode = this;
        }
Exemple #46
0
        /// <summary>
        /// コンストラクタ
        /// </summary>
        public KifuObject(KifuHeader header,
                          Board startBoard,
                          MoveNode root, Exception error = null)
        {
            Error = error;

            SetHeader(header);
            SetBoard(startBoard, true);
            SetRootNode(root);
        }
Exemple #47
0
            public MoveIterator(MoveIterator from)
            {
                if (from == MoveIterator.End)
                    return;

                iter = new MoveNode(from.iter);
                prev = new MoveIterator(from.prev);
            }
Exemple #48
0
        /// <summary>
        /// 変化ツリーのルートノードを設定します。
        /// </summary>
        public void SetRootNode(MoveNode root)
        {
            if (root == null)
            {
                throw new ArgumentNullException("root");
            }

            RootNode = root;
            MoveList = Convert2List(root).ToList();
        }
Exemple #49
0
        /// <summary>
        /// コンストラクタ
        /// </summary>
        public KifuObject(KifuHeader header,
                          Board startBoard,
                          Exception error = null)
        {
            MoveList = new List<BoardMove>();
            RootNode = new MoveNode();
            Error = error;

            SetHeader(header);
            SetBoard(startBoard, false);
        }
Exemple #50
0
 private double evaluateChildren(MoveNode currentNode, int depth)
 {
     List<double> ratings = new List<double>();
     foreach (MoveNode child in currentNode.Children)
         ratings.Add(child.Move.Rating);
     if (depth % 2 == 1)
         return ratings.Min();
     else
         return ratings.Max();
 }
Exemple #51
0
        /// <summary>
        /// ノード全体を比較します。
        /// </summary>
        public bool NodeEquals(MoveNode other, bool compareComment)
        {
            if (ReferenceEquals(other, null))
            {
                return false;
            }

            if (MoveCount != other.MoveCount)
            {
                return false;
            }

            if (Move != other.Move)
            {
                return false;
            }

            if (Duration != other.Duration)
            {
                return false;
            }

            if (NextNodeCount != other.NextNodeCount)
            {
                return false;
            }

            if (compareComment && Comment != other.Comment)
            {
                return false;
            }

            for (var i = 0; i < NextNodeCount; ++i)
            {
                if (!NextNodes[i].NodeEquals(other.NextNodes[i], compareComment))
                {
                    return false;
                }
            }

            return true;
        }
Exemple #52
0
 public MoveIterator(MoveNode node, MoveIterator prevIter)
 {
     iter = node;
     prev = prevIter;
 }
Exemple #53
0
        /// <summary>
        /// KifMoveNodeからMoveNodeへ構造を変換します。
        /// </summary>
        public MoveNode ConvertToMoveNode(Board board, KifMoveNode head,
                                          out Exception error)
        {
            var errors = new List<Exception>();
            var root =  new MoveNode
            {
                MoveCount = head.MoveCount,
                Duration = head.Duration,
                Comment = head.Comment,
            };
            // これでrootの子要素に指し手ツリーが設定されます。
            ConvertToMoveNode(board, root, errors);

            error = (
                !errors.Any() ? null :
                errors.Count() == 1 ? errors.FirstOrDefault() :
                new AggregateException(errors));

            return root;
        }
Exemple #54
0
 public MoveNode(MoveNode from)
 {
     if ((object)from == null)
     {
         currentMove = null;
         replies = new Dictionary<MoveNode, MoveNode>();
     }
     else
     {
         currentMove = new Move(from.currentMove);
         replies = new Dictionary<MoveNode, MoveNode>(from.replies);
     }
 }
Exemple #55
0
        /// <summary>
        /// Adds reply to certain move in moves map
        /// </summary>
        /// <param name="moveReply">Move-reply to add</param>
        /// <returns>Move node, that points to added move</returns>
        public MoveNode Add(Move moveReply)
        {
            MoveNode temp = new MoveNode(moveReply);

            if (!replies.ContainsKey(temp))
                replies.Add(temp, temp);

            return replies[temp];
        }
 MoveNode GetMover()
 {
     if (this.mover == null) {
         switch (dir) {
             case NudgeDirection.Up:
                 this.mover = GetNudgeUp();
                 break;
             case NudgeDirection.Down:
                 this.mover = GetNudgeDown();
                 break;
             case NudgeDirection.Left:
                 this.mover = GetNudgeLeft();
                 break;
             case NudgeDirection.Right:
                 this.mover = GetNudgeRight();
                 break;
         }
     }
     return this.mover;
 }
Exemple #57
0
        /// <summary>
        /// Adds reply to certain move in moves map
        /// </summary>
        /// <param name="moveReply">Move, represented by System.String</param>
        /// <param name="whitePos">Position of White figures on board</param>
        /// <returns>Move node, that points to added move</returns>
        public MoveNode Add(string moveReply, PlayerPosition whitePos)
        {
            MoveNode tempNode = new MoveNode(moveReply, whitePos);
            if (!replies.ContainsKey(tempNode))
                replies.Add(tempNode, tempNode);

            return replies[tempNode];
        }
Exemple #58
0
 private void think(int depth, MoveNode currentNode)
 {
     //get piece list for whoever is moving
     if (depth % 2 == 0)
         updatePieceList(pieceList, currentNode.Board, currentColour);
     else
         updatePieceList(pieceList, currentNode.Board, uf.OtherColour(currentColour));
     //get list of moveable pieces
     updateMoveList(pieceList, currentNode.Board);
     //make each move and add it to the tree
     foreach (AvailableMove move in allMovesList)
     {
         Piece[,] tmpBoard = makeTheoreticalMove(move, currentNode.Board);
         move.Rating = evaluateBoard(tmpBoard, currentColour);
         currentNode.AddChildren(currentNode, move, tmpBoard);
     }
     if (depth < depthOfThought)
         foreach (MoveNode nextNode in currentNode.Children)
         {
             think(depth + 1, nextNode);
             currentNode.Move.Rating = evaluateChildren(currentNode, depth);
         }
     if (depth == 0)
     {
         allMovesList.Clear();
         foreach (MoveNode child in currentNode.Children)
             allMovesList.Add(child.Move);
     }
 }
Exemple #59
0
        /// <summary>
        /// KifMoveNodeからMoveNodeへ構造を変換します。
        /// 結果は<paramref name="root"/>以下に設定されます。
        /// </summary>
        private void ConvertToMoveNode(Board board, MoveNode root,
                                       List<Exception> errors)
        {
            for (var node = this; node != null; node = node.Variation)
            {
                var cloned = board.Clone();

                // 指し手を実際に指してみます。
                var bmove = node.MakeMove(cloned, errors);
                if (bmove == null)
                {
                    continue;
                }

                var moveNode = new MoveNode
                {
                    Move = bmove,
                    MoveCount = node.MoveCount,
                    Duration = node.Duration,
                    Comment = node.Comment,
                };

                // 次の指し手とその変化を変換します。
                if (node.Next != null)
                {
                    node.Next.ConvertToMoveNode(cloned, moveNode, errors);
                }

                root.AddNext(moveNode);
            }
        }
Exemple #60
0
        /// <summary>
        /// KifMoveNodeからMoveNodeへ構造を変換します。
        /// </summary>
        public MoveNode ConvertToMoveNode(Board board, out Exception error)
        {
            var root = new MoveNode();
            var errors = new List<Exception>();

            ConvertToMoveNode(board, root, errors);

            error = (
                !errors.Any() ? null :
                errors.Count() == 1 ? errors.FirstOrDefault() :
                new AggregateException(errors));

            return root;
        }