Ejemplo n.º 1
0
    /// <summary>
    /// Calculates the shortest path between grid node <paramref name="i"/>
    /// and <paramref name="j"/>.
    /// </summary>
    private void calcShortestPath(int i, int j)
    {
        Queue <int> fifo_i, fifo_j, dist;

        fifo_i = new Queue <int>();
        fifo_j = new Queue <int>();
        dist   = new Queue <int>();

        int sourceNode = gridNodeLabel[i, j];

        // init found vector
        Utilities.Populate <bool>(found, false);

        fifo_i.Enqueue(i);
        fifo_j.Enqueue(j);
        dist.Enqueue(0);

        found[sourceNode] = true;

        while (fifo_i.Count > 0)
        {
            int curr_i = fifo_i.Dequeue();
            int curr_j = fifo_j.Dequeue();

            int currNode = gridNodeLabel[curr_i, curr_j];
            int currDist = dist.Dequeue();

            shortestPath[sourceNode, currNode] = currDist;

            for (GameConstants.actions k = GameConstants.actions.east;
                 k <= GameConstants.actions.north; k++)
            {
                // k = 0 is noop move
                if (gridNodeLabel[curr_i + GameConstants.RelativeDirX[(int)k], curr_j +
                                  GameConstants.RelativeDirY[(int)k]] >= 0)
                {
                    int neighbour = gridNodeLabel[curr_i + GameConstants.RelativeDirX[(int)k], curr_j
                                                  + GameConstants.RelativeDirY[(int)k]];

                    if (!found[neighbour])
                    {
                        found[neighbour] = true;
                        fifo_i.Enqueue(curr_i + GameConstants.RelativeDirX[(int)k]);
                        fifo_j.Enqueue(curr_j + GameConstants.RelativeDirY[(int)k]);
                        dist.Enqueue(currDist + 1);
                    }
                }
            }
        }
    }
Ejemplo n.º 2
0
    /// <summary>
    /// Returns valid actions at point <paramref name="xCoord"/>, <paramref name="yCoord"/>.
    /// </summary>
    /// <param name='actions'>
    /// Returned list of valid actions.
    /// </param>
    public void getValidActions(List <int> actions, int xCoord, int yCoord)
    {
        actions.Clear();
        // nochanged is always a valid action
        actions.Add((int)GameConstants.actions.unchanged);

        // check the movement actions
        for (GameConstants.actions i = GameConstants.actions.east; i <= GameConstants.actions.north; i++)
        {
            //if (levelData.map[xCoord + GameConstants.RelativeDirX[(int)i], yCoord + GameConstants.RelativeDirY[(int)i]]
            //	> GameConstants.Wall)
            if (isFreeSpace(xCoord + GameConstants.RelativeDirX[(int)i], yCoord + GameConstants.RelativeDirY[(int)i]))
            {
                actions.Add((int)i);
            }
        }
    }
Ejemplo n.º 3
0
    /// <summary>
    /// Returns valid actions at point <paramref name="xCoord"/>, <paramref name="yCoord"/>
    /// that do not move into the point <paramref name="exX"/>, <paramref name="exY"/>.
    /// </summary>
    /// <param name='actions'>
    /// Returned list of valid actions.
    /// </param>
    public void getValidActionsExcludePoint(List <int> actions,
                                            int xCoord, int yCoord,
                                            int exX, int exY)
    {
        actions.Clear();

        // nochanged is always a valid action
        actions.Add((int)GameConstants.actions.unchanged);

        // check the movement actions
        for (GameConstants.actions i = GameConstants.actions.east; i <= GameConstants.actions.north; i++)
        {
            if (isFreeSpace(xCoord + GameConstants.RelativeDirX[(int)i], yCoord + GameConstants.RelativeDirY[(int)i]) &&
                (xCoord + GameConstants.RelativeDirX[(int)i] != exX || yCoord + GameConstants.RelativeDirY[(int)i] != exY))
            {
                actions.Add((int)i);
            }
        }
    }