2013-10-05 29 views
-3

我正在嘗試爲基於這個algorithm的項目創建一個地下城發電機。我已經把所有東西都弄下來了,但是我的數組(圖1)似乎並沒有因爲某種原因持有地圖數據。我使用三種類型的數據來確定地圖中的單元格是空的(0),角色可以放置的空間(1),走廊(2)還是牆壁(3)。C#數組沒有保存數據

我已經有點卡住這部分,所以任何幫助表示讚賞!

編輯:問題是地圖對象沒有在圖1所示的循環中存儲數據。對不起,太模糊了。

(圖1)

 for (int i = 0; i < roomList.Count; i++) 
     { 
      for (int x = roomList[i].X; x < (roomList[i].X + roomList[i].W); x++) 
      { 
       for (int y = roomList[i].Y; y < (roomList[i].Y + roomList[i].H); y++) 
       { 
        map[x, y] = 1; 
       } 
      } 
     } 

(我的所有相關代碼)

namespace Project 
{ 
    } 
    public class Room 
    { 
     int xValue, yValue, widthValue, heightValue; 

     public int X 
     { 
      get { return xValue; } 
      set { xValue = value; } 
     } 
     public int Y 
     { 
      get { return yValue; } 
      set { yValue = value; } 
     } 
     public int W 
     { 
      get { return widthValue; } 
      set { widthValue = value; } 
     } 
     public int H 
     { 
      get { return heightValue; } 
      set { heightValue = value; } 
     } 
    } 
public class DungeonGenerate 
{ 
    public int baseWidth = 513; 
    public int baseHeight = 513; 
    public int width = 64; 
    public int height = 64; 
    Color[,] arrayColor; 
    Random rand = new Random(); 
    Room room = new Room(); 
    Rectangle[,] rectMap; 

    public void Generate() 
    { 
     rectMap = new Rectangle[baseWidth, baseHeight]; 
     //Creates a 2-D Array/Grid for the Dungeon 
     int[,] map = new int[baseWidth, baseHeight]; 
     //Determines all the cells to be empty until otherwise stated 
     for (int x = 0; x < width; x++) 
     { 
      for (int y = 0; y < height; y++) 
      { 
       map[x, y] = 0; 
      } 
     } 

     //Determines the amount of rooms in the dungeon 
     int minRooms = (width * height)/300; 
     int maxRooms = (width * height)/150; 
     int amountOfRooms = rand.Next(minRooms, maxRooms); 

     //Room dimensions 
     int widthRoot = Convert.ToInt32(Math.Round(Math.Sqrt(width * 2))); 
     int heightRoot = Convert.ToInt32(Math.Round(Math.Sqrt(height * 2))); 
     int minWidth = Convert.ToInt32(Math.Round((width * .5)/widthRoot)); 
     int maxWidth = Convert.ToInt32((width * 2)/widthRoot); 
     int minHeight = Convert.ToInt32(Math.Round(height * .5)/heightRoot); 
     int maxHeight = Convert.ToInt32((height * 2)/heightRoot); 

     //Creates the rooms 
     List<Room> roomList = new List<Room>(amountOfRooms); 

     for (int i = 0; i < amountOfRooms; i++) 
     { 
      bool ok = false; 
      do 
      { 
       room.X = rand.Next(width); 
       room.Y = rand.Next(height); 
       room.W = (rand.Next(maxWidth)) + minWidth; 
       room.H = (rand.Next(maxHeight)) + minHeight; 

       if (room.X + room.W >= width && room.Y + room.H >= height) 
       { 
        continue; 
       } 
       for (int q = 0; q < roomList.Count; q++) 
       { 
        if (room.X > roomList[q].X && room.X < roomList[q].X + room.W && room.Y > roomList[q].Y && room.Y < roomList[q].Y + room.H) 
        { 
         ok = false; 
         break; 
        } 
       } 
       ok = true; 
       roomList.Add(room); 
      } while (!ok); 
     } 
     //This will create hallways that lead to and from the rooms 
     int connectionCount = roomList.Count; 
     List<Point> connectedCells = new List<Point>((width * height)); 
     for (int i = 0; i < connectionCount; i++) 
     { 
      Room roomA = roomList[i]; 
      int roomNum = i; 

      while (roomNum == i) 
      { 
       roomNum = rand.Next(roomList.Count); 
      } 

      Room roomB = roomList[roomNum]; 

      //Increasing this will make the hallway more straight, decreasing it will make the hallway more skewed 
      int sidestepChance = 10; 

      Point pointA = new Point(x: (rand.Next(roomA.W)) + roomA.X, y: (rand.Next(roomA.H)) + roomA.Y); 
      Point pointB = new Point(x: (rand.Next(roomB.W)) + roomB.X, y: (rand.Next(roomB.H)) + roomB.Y); 

      while (pointA != pointB) 
      { 
       int num = rand.Next() * 100; 

       if (num < sidestepChance) 
       { 
        if (pointB.X != pointA.X) 
        { 
         if (pointB.X > pointA.X) 
         { 
          pointB.X--; 
         } 
         else 
         { 
          pointB.X++; 
         } 
        } 
       } 
       else if(pointB.Y != pointA.Y) 
       { 
        if (pointB.Y > pointA.Y) 
        { 
         pointB.Y--; 
        } 
        else 
        { 
         pointB.Y++; 
        } 
       } 
      } 

      if (pointB.X < width && pointB.Y < height) 
      { 
       connectedCells.Add(pointB); 
      } 
     } 

     //Fills the room with data 
     for (int i = 0; i < roomList.Count; i++) 
     { 
      for (int x = roomList[i].X; x < (roomList[i].X + roomList[i].W); x++) 
      { 
       for (int y = roomList[i].Y; y < (roomList[i].Y + roomList[i].H); y++) 
       { 
        map[x, y] = 1; 
       } 
      } 
     } 

     for (int y = 0; y < height; y++) 
     { 
      for (int x = 0; x < width; x++) 
      { 
       if (map[x, y] == 0) 
       { 
        bool wall = false; 
        for (int yy = y - 2; yy < y + 2; yy++) 
        { 
         for (int xx = x - 2; xx < x + 2; xx++) 
         { 
          if (xx > 0 && yy > 0 && xx < width && yy < height) 
          { 
           if (map[xx, yy] == 1 || map[xx, yy] == 2) 
           { 
            map[x, y] = 3; 
            wall = true; 
           } 
          } 
         } 
         if (wall) 
         { 
          break; 
         } 
        } 
       } 
      } 
     } 

     //Rendering the Map and giving it some Color (Sort of)! 
     int scaler = baseWidth/width; 

     for (int x = 0; x < baseWidth; x++) 
     { 
      for (int y = 0; y < baseHeight; y++) 
      { 
       rectMap[x, y] = new Rectangle(x, y, 1, 1); 
       arrayColor = new Color[baseWidth, baseHeight]; 
       switch (map[x, y]) 
       { 
        case 0: 
         arrayColor[x, y] = new Color(0,0,0); 
         break; 
        case 1: 
         arrayColor[x, y] = new Color(0,0,0); 
         break; 
        case 2: 
         arrayColor[x, y] = new Color(0,0,0); 
         break; 
        case 3: 
         arrayColor[x, y] = new Color (0,0,0); 
         break; 
       } 
      } 
     } 
    } 
    public Rectangle[,] GetMap() 
    { 
     return rectMap; 
    } 
    public Color[,] GetColors() 
    { 
     return arrayColor; 
    } 
} 
+1

你是什麼意思它不保值?究竟哪一部分? – Szymon

+2

你可以嘗試更具體地瞭解問題的原因嗎?一個大的代碼列表和一個關於不保存值的神祕問題並不能真正幫助我們來幫助你! –

回答

2

for -loop你在哪裏填充roomList,你沒有實例化一個新Room每一次。你只是操縱同一個對象並將其重新添加到列表中,所以roomList將只包含許多對同一對象的引用。嘗試從您的DungeonGenerate類取出room字段並使用一個局部變量來代替:

for (int i = 0; i < amountOfRooms; i++) 
{ 
    bool ok = false; 
    do 
    { 
     var room = new Room(); 
     ... 
     roomList.Add(room); 
    } while (!ok); 
} 
+0

好的,+1。 – Brian