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); }
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); } } } } }
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; } } } } } } }
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); } }
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); }
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; } } }
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); } }
public void setParent(CoordTile tile) { this.parentTile = tile; }