Exemplo n.º 1
0
        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);
            }
        }
Exemplo n.º 2
0
        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);
            }
        }
Exemplo n.º 3
0
        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();
        }
Exemplo n.º 4
0
        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--;
                }
            }
        }
Exemplo n.º 5
0
 public void AddRoomEdgePos(Pos roomEdgeSpot)
 {
     roomEdgePos.Add(roomEdgeSpot);
 }
Exemplo n.º 6
0
 public static void FillRoad(Pos emptyPos)
 {
     maps[emptyPos.x, emptyPos.y] = '=';
 }
Exemplo n.º 7
0
 public void AddRoomPos(Pos roomSpot)
 {
     roomPos.Add(roomSpot);
 }
Exemplo n.º 8
0
        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);
        }