C#:游戏机制问题?

时间:2018-01-21 19:09:47

标签: c# .net

我正在尝试计算游戏中一个目的地与另一个目的地之间的链接数量,第一个被调用的方法是CalculateRoute,它返回一个地图路线列表。

此时你可能正在思考"所以你所展示的代码有什么问题?"。

当链接超过1个房间时,它没有考虑到需要从前两个房间获取链接而忽略其余部分...

更好的解释是,它只从方法GetRoutesForRoom内部的房间获取链接指令,这对整个机制造成了很大的问题。

我已经对这段代码感到困惑,所以我只是想要一些帮助,让它计算GetRoutesForRoom方法内部链接的第一部分。

internal class MapRoute
{
    private List<int> _arrowLinks;

    public MapRoute(List<int> arrowLinks)
    {
        _arrowLinks = arrowLinks;
    }
}

以下是CalculateRoute方法......

public Dictionary<int, MapRoute> CalculateRoute(Player player, Room startLocation, Room endLocation)
{
    var possibleRoutes = new Dictionary<int, MapRoute>();

    var arrowsAtStart = startLocation.GetRoomItemHandler().GetFloor.Where(
        x => x.GetBaseItem().InteractionType == InteractionType.ARROW);

    foreach (var arrow in arrowsAtStart)
    {
        if (!ItemTeleporterFinder.IsTeleLinked(arrow.Id, startLocation))
        {
            continue;
        }

        var linkedRoomId = ItemTeleporterFinder.GetTeleRoomId(arrow.Id, startLocation);

        if (linkedRoomId == endLocation.RoomId)
        {
            possibleRoutes.Add(possibleRoutes.Count + 1, new MapRoute(new List<int> { arrow.Id }));
        }
        else if (PlusEnvironment.GetGame().GetRoomManager().TryGetRoom(linkedRoomId, out var secondRoom))
        {
            foreach (var mapRoute in GetRoutesForRoom(secondRoom, startLocation.RoomId))
            {
                possibleRoutes.Add(possibleRoutes.Count + 1, mapRoute);
            }
        }
    }

    return possibleRoutes;
}

为了计算链接下方的房间,我使用另一种方法......

public List<MapRoute> GetRoutesForRoom(Room room, int destination)
{
    var possibleRoutes = new List<MapRoute>();

    var arrowsInRoom = room.GetRoomItemHandler().GetFloor.Where(
        x => x.GetBaseItem().InteractionType == InteractionType.ARROW);

    foreach (var arrow in arrowsInRoom)
    {
        if (!ItemTeleporterFinder.IsTeleLinked(arrow.Id, room))
        {
            continue;
        }

        var linkedRoomId = ItemTeleporterFinder.GetTeleRoomId(arrow.Id, room);

        if (linkedRoomId == destination)
        {
            possibleRoutes.Add(new MapRoute(new List<int> { arrow.Id }));
        }
        else if (PlusEnvironment.GetGame().GetRoomManager().TryGetRoom(linkedRoomId, out var secondRoom))
        {
            foreach (var mapRoute in GetRoutesForRoom(secondRoom, destination))
            {
                possibleRoutes.Add(mapRoute);
            }
        }
    }

    return possibleRoutes;
}

0 个答案:

没有答案