示例#1
0
    public static void LookForRailWayPath(FieldRoadStation roadStationT, List <FieldRoadPath> paths, List <int> usedStations, int currentR, int max)
    {
        if (paths.Count < 1)
        {
            return;
        }
        List <FieldRoadPath> pathsNext = new List <FieldRoadPath>();
        FieldRoadPath        path;
        FieldRoadStation     roadStationS;

        for (int i = paths.Count - 1; i >= 0; i--)
        {
            path = paths[i];
            if (path.pathStations.Count < currentR)
            {
                break;
            }
            int startId = path.pathStations[path.pathStations.Count - 1];
            if (startId == roadStationT.id)
            {
                continue;                            //找到的不找了
            }
            roadStationS = App.Package.ChessGame.GetFieldRoadStationById(startId);
            for (int j = 0; j < roadStationS.connectedPointIds.Length; j++)
            {
                int id = roadStationS.connectedPointIds[j];
                FieldRoadStation roadStationC = App.Package.ChessGame.GetFieldRoadStationById(id);
                if (roadStationC.type == FieldRoadStationType.Rail)
                {
                    if (path.pathStations.IndexOf(id) == -1)
                    {
                        FieldRoadPath pathNext = new FieldRoadPath(path);
                        pathNext.pathStations.Add(id);
                        pathsNext.Add(pathNext);
                    }
                }
            }
        }
        paths.AddRange(pathsNext);
        if (currentR + 1 <= max)
        {
            LookForRailWayPath(roadStationT, paths, usedStations, currentR + 1, max);
        }
    }
示例#2
0
    public static ChessMoveData ChessHeroCanMoveTo(ChessHeroData heroData, ChessPoint point)
    {
        ChessMoveData    moveData     = new ChessMoveData();
        FieldRoadStation roadStationS = App.Package.ChessGame.GetFieldRoadStationByPoint(heroData.point);
        FieldRoadStation roadStationT = App.Package.ChessGame.GetFieldRoadStationByPoint(point);

        if (ChessHeroCanMove(heroData))//检测棋子本身,地雷、军旗不能走
        {
            //检测目的地是否禁止

            /*for(int i = 0; i < roadStationT.forbidChessHeros.Length; i++)
             * {
             *  if(heroData.heroTypeId == roadStationT.forbidChessHeros[i])
             *  {
             *      moveData.crashType = 2;
             *      moveData.crashHero = heroData;
             *      return moveData;
             *  }
             * }*/

            ///
            for (int i = 0; i < roadStationS.connectedPointIds.Length; i++)
            {
                FieldRoadStation roadStation = App.Package.ChessGame.GetFieldRoadStationById(roadStationS.connectedPointIds[i]);
                if (roadStation == roadStationT)
                {
                    moveData.crashType = 0;
                    moveData.points    = new ChessPoint[] { roadStationS.point, roadStationT.point };
                    return(moveData);
                }
            }
            if (roadStationS.type == FieldRoadStationType.Rail && roadStationT.type == FieldRoadStationType.Rail)
            {
                if (heroData.heroTypeId == 2)//工兵行走
                {
                    List <FieldRoadPath> paths        = new List <FieldRoadPath>();
                    List <int>           usedStations = new List <int>();
                    usedStations.Add(roadStationS.id);
                    FieldRoadPath pathStart = new FieldRoadPath();
                    pathStart.pathStations.Add(roadStationS.id);
                    paths.Add(pathStart);
                    LookForRailWayPath(roadStationT, paths, usedStations, 1, 32);
                    for (int i = 0; i < paths.Count; i++)
                    {
                        FieldRoadPath path = paths[i];
                        if (path.pathStations[path.pathStations.Count - 1] != roadStationT.id)
                        {
                            continue;
                        }
                        ChessPoint[]  points    = path.ToChessPoints();
                        ChessHeroData crashHero = HasChessHeroOnPathPoints(points);
                        if (crashHero == null)
                        {
                            moveData.crashType = 0;
                            moveData.crashHero = null;
                            moveData.points    = points;
                            return(moveData);
                        }
                        else
                        {
                            moveData.crashHero = heroData;
                        }
                    }
                    moveData.crashType = 3;
                    moveData.crashHero = heroData;
                    return(moveData);
                }
                else if (roadStationS.point.x == roadStationT.point.x)//这里要特别注意
                {
                    ChessPoint[] points = new ChessPoint[Mathf.Abs(roadStationS.point.y - roadStationT.point.y) + 1];
                    int          d      = (roadStationS.point.y < roadStationT.point.y) ? 1 : -1;
                    points[0] = roadStationS.point;
                    for (int i = 1; i < points.Length; i++)
                    {
                        points[i] = new ChessPoint(roadStationS.point.x, roadStationS.point.y + d * i);
                        if (!IsConnected(points[i - 1], points[i]) || !IsRailWay(points[i - 1], points[i]))//要判断是否相连啊,且都是铁路
                        {
                            moveData.crashType = 2;
                            return(moveData);
                        }
                    }
                    ChessHeroData crashHero = HasChessHeroOnPathPoints(points);
                    if (crashHero == null)
                    {
                        moveData.crashType = 0;
                        moveData.points    = points;
                    }
                    else
                    {
                        moveData.crashType = 3;
                        moveData.crashHero = crashHero;
                    }
                    return(moveData);
                }
                else if (roadStationS.point.y == roadStationT.point.y)
                {
                    ChessPoint[] points = new ChessPoint[Mathf.Abs(roadStationS.point.x - roadStationT.point.x) + 1];
                    int          d      = (roadStationS.point.x < roadStationT.point.x) ? 1 : -1;
                    points[0] = roadStationS.point;
                    for (int i = 1; i < points.Length; i++)
                    {
                        points[i] = new ChessPoint(roadStationS.point.x + d * i, roadStationS.point.y);
                        if (!IsConnected(points[i - 1], points[i]) || !IsRailWay(points[i - 1], points[i]))//要判断是否相连啊,且都是铁路
                        {
                            moveData.crashType = 2;
                            return(moveData);
                        }
                    }
                    ChessHeroData crashHero = HasChessHeroOnPathPoints(points);
                    if (crashHero == null)
                    {
                        moveData.crashType = 0;
                        moveData.points    = points;
                    }
                    else
                    {
                        moveData.crashType = 3;
                        moveData.crashHero = crashHero;
                    }
                    return(moveData);
                }
                else
                {
                    //不能走直角
                }
            }
        }
        moveData.crashType = 1;
        moveData.crashHero = heroData;
        return(moveData);
    }
示例#3
0
 public static ChessHeroData HasChessHeroOnPath(FieldRoadPath path)
 {
     return(HasChessHeroOnPathPoints(path.ToChessPoints()));
 }
示例#4
0
 public FieldRoadPath(FieldRoadPath path)
 {
     this.pathStations = new List <int>(path.pathStations.ToArray());
 }