Esempio n. 1
0
    List <CoordTile> getPureFourTiles(CoordTile myRefTile, CoordTile[,] myMapArray = null)
    {
        List <CoordTile> fourTiles = new List <CoordTile>();
        int x = myRefTile.x;
        int y = myRefTile.y;

        if (myMapArray == null)
        {
            myMapArray = mapTileArray;
        }

        for (int i = x - 1; i <= x + 1; i++)
        {
            for (int j = y - 1; j <= y + 1; j++)
            {
                if (!(i < 0 || i >= width || j < 0 || j >= height))
                {
                    if ((i == x || j == y) && (!(i == x && j == y)))
                    {
                        fourTiles.Add(myMapArray[i, j]);
                    }
                }
            }
        }
        return(fourTiles);
    }
Esempio n. 2
0
    void getAreaList(int[,] myMap, List <List <CoordTile> > targetList)
    {
        resetMapArray(checkedMap, 0);
        if (myMap.GetLength(0) == 0 || myMap.GetLength(1) == 0)
        {
            return;
        }

        //iterate map[,], get the unchecked tiles, get the area list that connected to the tile
        //遍历map[,] 取得on uncked 点, 为它取得连续区域
        for (int i = 0; i < width; i++)
        {
            for (int j = 0; j < height; j++)
            {
                if (checkedMap[i, j] == 0 /* && map[i, j]==1需要动态建立type*/) // uncheck and on ,
                {
                    CoordTile refTile = new CoordTile(i, j);
                    // 只要有这个点,必然有至少有一点的连续区域,新建一个新List
                    List <CoordTile> areaTiles = new List <CoordTile>();
                    getAreaTile2(refTile, areaTiles);
                    if (areaTiles.Count > 0)
                    {
                        targetList.Add(areaTiles);
                    }
                }
            }
        }
    }
Esempio n. 3
0
    void getAreaTile2(CoordTile myRefTile, List <CoordTile> resultTileList)
    {
        int areaType = map[myRefTile.x, myRefTile.y];
        Queue <CoordTile> tileQueue = new Queue <CoordTile>();

        tileQueue.Enqueue(myRefTile);
        while (tileQueue.Count > 0)
        {
            CoordTile refTile = tileQueue.Dequeue();
            //put refTile in list, set checkedmap
            resultTileList.Add(refTile);
            checkedMap[refTile.x, refTile.y] = 1;
            //get neighbor tiles ,put into queue
            for (int i = refTile.x - 1; i <= refTile.x + 1; i++)
            {
                for (int j = refTile.y - 1; j <= refTile.y + 1; j++)
                {
                    // in map range
                    if (!(i < 0 || i >= width || j < 0 || j >= height))
                    {
                        //get four neighbor tiles
                        if (i == refTile.x || j == refTile.y)
                        {
                            if (map[i, j] == areaType && checkedMap[i, j] == 0)
                            {
                                //qualified tile into the queue
                                tileQueue.Enqueue(new CoordTile(i, j));
                                checkedMap[i, j] = 1;
                            }
                        }
                    }
                }
            }
        }
    }
Esempio n. 4
0
    void getRoutList2()
    {
        Room startRoom;
        int  enlargeCount = linkedRoomLists.Count;

        if (linkedRoomLists.Count == 0)
        {
            startRoom = pickRandomRoom(roomLists);
            linkedRoomLists.Add(startRoom);
        }

        while (linkedRoomLists.Count < roomLists.Count)
        {
            //扩展一个房间

            //复制tempTileArray列表
            CoordTile[,] tempTileArray = new CoordTile[mapTileArray.GetLength(0), mapTileArray.GetLength(1)];
            for (int i = 0; i < mapTileArray.GetLength(0); i++)
            {
                for (int j = 0; j < mapTileArray.GetLength(1); j++)
                {
                    CoordTile newTile = new CoordTile(i, j, mapTileArray[i, j].tileType, mapTileArray[i, j].areaCode);
                    tempTileArray[i, j] = newTile;
                }
            }

            Room baseRoom = pickRandomRoom(linkedRoomLists);
            enlargeRoom(baseRoom, tempTileArray);
        }
    }
Esempio n. 5
0
    void getRout(CoordTile contactTile, CoordTile[,] mapArray)
    {
        List <CoordTile> routTile = new List <CoordTile>();
        CoordTile        findTile = contactTile;

        routTile.Add(contactTile);

        while (findTile.parentTile != null)
        {
            CoordTile nextTile = findTile.parentTile;
            routTile.Add(mapTileArray[nextTile.x, nextTile.y]);
            findTile = nextTile;
        }

        newRoutList.Add(routTile);
    }
Esempio n. 6
0
 void synchMapTileArray()
 {
     if (map == null)
     {
         return;
     }
     if (mapTileArray == null)
     {
         mapTileArray = new CoordTile[map.GetLength(0), map.GetLength(1)];
     }
     for (int i = 0; i < width; i++)
     {
         for (int j = 0; j < height; j++)
         {
             CoordTile tile = new CoordTile(i, j);
             tile.tileType      = map[i, j];
             mapTileArray[i, j] = tile;
         }
     }
 }
Esempio n. 7
0
    void enlargeRoom(Room baseRoom, CoordTile[,] mapTileArray)//新地图列表)
    {
        // 从 baseRoom 得到一个contact点
        bool foundContact = false;

        //映射room 的expandtile 到新的 mapTileArray 上
        List <CoordTile> toExpand = new List <CoordTile>();

        foreach (CoordTile sourceTile in baseRoom.expandTiles)
        {
            CoordTile targetTile = mapTileArray[sourceTile.x, sourceTile.y];
            toExpand.Add(targetTile);
        }



        while (!foundContact /*&& enlarge room 没有撑满*/)
        {
            //放新一轮的expand
            List <CoordTile> expandNewList = new List <CoordTile>();
            foreach (CoordTile expandTile in toExpand)
            {
                List <CoordTile> fourTiles = getPureFourTiles(expandTile, mapTileArray);
                if (fourTiles.Count > 0)
                {
                    foreach (CoordTile tile in fourTiles)
                    {
                        //自己房间内
                        if (tile.areaCode == baseRoom.areaCode)
                        {
                            continue;
                        }
                        //空tile
                        if (tile.areaCode == -1)
                        {
                            tile.areaCode = baseRoom.areaCode;
                            tile.setParent(expandTile);
                            if (!expandNewList.Contains(tile))
                            {
                                expandNewList.Add(tile);
                            }
                        }
                        //contact point
                        else
                        {
                            // room is not linked room
                            bool isLinked = false;
                            foreach (Room linkedRoom in linkedRoomLists)
                            {
                                if (linkedRoom.areaCode == tile.areaCode)
                                {
                                    isLinked = true;
                                    break;
                                }
                            }
                            if (!isLinked)
                            {
                                foreach (Room room in roomLists)
                                {
                                    if (room.areaCode == tile.areaCode)
                                    {
                                        linkedRoomLists.Add(room);
                                        foundContact = true;
                                        //必须在这个时候得到routList下一轮回被清洗掉
                                        getRout(mapTileArray[expandTile.x, expandTile.y], mapTileArray);
                                        return;
                                    }
                                }
                            }
                        }
                    }
                }
            }
            toExpand = new List <CoordTile>(expandNewList);
        }
    }
Esempio n. 8
0
 public void setParent(CoordTile tile)
 {
     this.parentTile = tile;
 }