public static void RandomRoom() { int roomlength = r.Next(3, 8); int roomWidth = r.Next(3, 8); //随机房间的大小 int randomStratX = r.Next(1, 48); int randomStratY = r.Next(1, 48); //随机房间的开始生成位置 if (randomStratX % 2 == 0 || randomStratY % 2 == 0) { return; } if (roomlength % 2 == 0 || roomWidth % 2 == 0) { return; } int roomEdgeMinX = randomStratX - 1; int roomEdgeMinY = randomStratY - 1;//计算房间边缘最小的点的坐标 int roomMaxX = randomStratX + roomlength - 1; int roomMaxY = randomStratY + roomWidth - 1; //计算房间的最大XY int roomEdgeMaxX = roomEdgeMinX + roomlength + 1; int roomEdgeMaxY = roomEdgeMinY + roomWidth + 1; //计算房间边缘的最大的XY if (roomEdgeMaxX < 49 && roomEdgeMaxY < 49) { for (int i = roomEdgeMinX; i <= roomEdgeMaxX; i++)//判断房间是否重叠 { for (int j = roomEdgeMinY; j <= roomEdgeMaxY; j++) { if (maps[i, j] == '1') { return; } } } Room tmp_Room = new Room(); #region//房间边填充石块 for (int i = roomEdgeMinX; i <= roomEdgeMaxX; i++) { if (i != roomEdgeMinX && i != roomEdgeMaxX) { Pos tmp_EdgePosLeft = new Pos(i, roomEdgeMinY); Pos tmp_EdgePosRight = new Pos(i, roomEdgeMaxY); tmp_Room.AddRoomEdgePos(tmp_EdgePosLeft); tmp_Room.AddRoomEdgePos(tmp_EdgePosRight);//将房间边缘的点添加进房间类的列表中进行保存 } maps[i, roomEdgeMinY] = '#'; maps[i, roomEdgeMaxY] = '#'; } for (int j = roomEdgeMinY; j <= roomEdgeMaxY; j++) { if (j != roomEdgeMinY && j != roomEdgeMaxY) { Pos tmp_EdgePosUp = new Pos(roomEdgeMinX, j); Pos tmp_EdgePosDown = new Pos(roomEdgeMaxX, j); tmp_Room.AddRoomEdgePos(tmp_EdgePosUp); tmp_Room.AddRoomEdgePos(tmp_EdgePosDown); maps[roomEdgeMinX, j] = '#'; maps[roomEdgeMaxX, j] = '#'; } } #endregion for (int i = randomStratX; i <= roomMaxX; i++)//房间填充 { for (int j = randomStratY; j <= roomMaxY; j++) { Pos roomSpot = new Pos(i, j); tmp_Room.AddRoomPos(roomSpot); maps[i, j] = '1'; } } roomS.Add(tmp_Room); } }
public static Pos InitPoint(Pos stairs, string dir)//设置上下楼层的初始点 { int sign = 0; if (dir == "Down") { if (maps[stairs.x - 1, stairs.y] == '1') { maps[stairs.x - 1, stairs.y] = '9'; sign = 1; } else if (maps[stairs.x + 1, stairs.y] == '1') { maps[stairs.x + 1, stairs.y] = '9'; sign = 2; } else if (maps[stairs.x, stairs.y - 1] == '1') { maps[stairs.x, stairs.y - 1] = '9'; sign = 3; } else if (maps[stairs.x, stairs.y + 1] == '1') { maps[stairs.x, stairs.y + 1] = '9'; sign = 4; } } else { if (maps[stairs.x - 1, stairs.y] == '1') { maps[stairs.x - 1, stairs.y] = '6'; sign = 1; } else if (maps[stairs.x + 1, stairs.y] == '1') { maps[stairs.x + 1, stairs.y] = '6'; sign = 2; } else if (maps[stairs.x, stairs.y - 1] == '1') { maps[stairs.x, stairs.y - 1] = '6'; sign = 3; } else if (maps[stairs.x, stairs.y + 1] == '1') { maps[stairs.x, stairs.y + 1] = '6'; sign = 4; } } if (sign == 1) { Pos tmp_Pos = new Pos(stairs.x - 1, stairs.y); return(tmp_Pos); } else if (sign == 2) { Pos tmp_Pos = new Pos(stairs.x + 1, stairs.y); return(tmp_Pos); } else if (sign == 3) { Pos tmp_Pos = new Pos(stairs.x, stairs.y - 1); return(tmp_Pos); } else { Pos tmp_Pos = new Pos(stairs.x, stairs.y + 1); return(tmp_Pos); } }
static void Main(string[] args) { Fill(); int randomRoomFrequency = 0; while (randomRoomFrequency < 800) { RandomRoom(); randomRoomFrequency++; } FillEmpty(); Pos startPos = Carving(); while (emptyPosList.Count > 5) { startPos = Painting(startPos); if (startPos == null) { if (roadPos.Count > 0) { for (int i = roadPos.Count - 1; i >= 0; i--) { ChoiceDir(roadPos[i]); if (roadPos[i].dirt.Count > 0)//IsDir(roadPos[i]) && { startPos = roadPos[i]; break; } } } if (startPos == null) { startPos = Carving(); } } } for (int i = 0; i < roomS.Count; i++)//选出合适的连接点 { Connect(roomS[i].roomEdgePos); int road = r.Next(0, roomS[i].roomEdgePos.Count); maps[roomS[i].roomEdgePos[road].x, roomS[i].roomEdgePos[road].y] = 'g';//选出连接点 } FillRoad(); DeletRoad(); while (deletPos.Count > 0)//去死路 { foreach (var deletSpot in deletPos) { maps[deletSpot.x, deletSpot.y] = ' '; } deletPos.Clear(); FillRoad(); DeletRoad(); } for (int i = 0; i < roomS.Count; i++) { RandomMonster(roomS[i].roomPos); RandomProp(roomS[i].roomPos); } FillRoad(); //重新填充道路列表 RandomStairs(); //生成楼梯 RandomRoadKey(); RandomRoomKey(); Print(); Console.ReadKey(); }
public static void RandomProp(List <Pos> roomSpot)//房间随机生成道具 { if (roomSpot.Count >= 25) { int propNumber = r.Next(2, 6); while (propNumber > 0) { Pos propSpot = roomSpot[r.Next(0, roomSpot.Count)]; int prop = Chance(); if (prop == 1) { maps[propSpot.x, propSpot.y] = 't'; roomSpot.Remove(propSpot); } else if (prop == 2) { maps[propSpot.x, propSpot.y] = 'y'; roomSpot.Remove(propSpot); } else if (prop == 3) { maps[propSpot.x, propSpot.y] = 'z'; roomSpot.Remove(propSpot); } else if (prop == 4) { maps[propSpot.x, propSpot.y] = 'b'; roomSpot.Remove(propSpot); } else if (prop == 5) { maps[propSpot.x, propSpot.y] = 'j'; roomSpot.Remove(propSpot); } propNumber--; } } else { int propNumber = r.Next(1, 3); while (propNumber > 0) { Pos propSpot = roomSpot[r.Next(0, roomSpot.Count)]; int prop = Chance(); if (prop == 1) { maps[propSpot.x, propSpot.y] = 't'; roomSpot.Remove(propSpot); } else if (prop == 2) { maps[propSpot.x, propSpot.y] = 'y'; roomSpot.Remove(propSpot); } else if (prop == 3) { maps[propSpot.x, propSpot.y] = 'z'; roomSpot.Remove(propSpot); } else if (prop == 4) { maps[propSpot.x, propSpot.y] = 'b'; roomSpot.Remove(propSpot); } else if (prop == 5) { maps[propSpot.x, propSpot.y] = 'j'; roomSpot.Remove(propSpot); } propNumber--; } } }
public void AddRoomEdgePos(Pos roomEdgeSpot) { roomEdgePos.Add(roomEdgeSpot); }
public static void FillRoad(Pos emptyPos) { maps[emptyPos.x, emptyPos.y] = '='; }
public void AddRoomPos(Pos roomSpot) { roomPos.Add(roomSpot); }
public static Pos Painting(Pos startPos)//画点 { ChoiceDir(startPos); ForwardDirection dirt2 = ForwardDirection.None; if (startPos.dirt.Count > 0) { if (nowDirct == ForwardDirection.None) { nowDirct = startPos.dirt[0]; } //bool isCanDir = IsDir(startPos); if (startPos.dirt.Count == 1) { dirt2 = startPos.dirt[0]; } if (startPos.dirt.Count > 1) { bool isDir = r.Next(1, 4) == 2 ? true : false;//是否转向 if (isDir) { dirt2 = startPos.dirt[r.Next(0, startPos.dirt.Count)]; } else { if (startPos.dirt.Contains(nowDirct)) { dirt2 = nowDirct; } else { dirt2 = startPos.dirt[0]; } } } FillRoad(startPos); //画点 roadPos.Add(startPos); //添加到道路列表 DeltEmptyPos(startPos); startPos.dirt.Clear(); } else { FillRoad(startPos);//画点 return(null); } nowDirct = dirt2; Pos tmp_ForwardPos;//声明临时POS用于接取下一个点的引用 switch (dirt2) { case ForwardDirection.Up: tmp_ForwardPos = new Pos(startPos.x - 1, startPos.y); //从空列表获取这个点表示的POS引用 return(tmp_ForwardPos); //传出这个点的引用 case ForwardDirection.Down: tmp_ForwardPos = new Pos(startPos.x + 1, startPos.y); return(tmp_ForwardPos); case ForwardDirection.Left: tmp_ForwardPos = new Pos(startPos.x, startPos.y - 1); return(tmp_ForwardPos); case ForwardDirection.Right: tmp_ForwardPos = new Pos(startPos.x, startPos.y + 1); return(tmp_ForwardPos); } return(null); }