2014-12-07 43 views
0

我開始學習C和我想做一個帳篷和樹木遊戲,我在使一些矩陣級別設計的一部分(4×4, 5x5,6x6,7x7),例如,數字8表示一棵樹,數字4表示一個帳篷,數字0表示一個空格,但是我試圖通過隨機樹(8)位置來製作關卡每次打開遊戲都會有所不同。試圖做一個帳篷和樹木遊戲在C

http://www.brainbashers.com/tentshelp.asp < - 更多信息

我需要怎麼你們做驗證系統樹提示,一棵樹已經分配了一個棚,但我得到了如何使工作方式感到困惑,我的意思是樹木(8)號碼是由矩陣上的一個隨機位置創建的,所有樹木(8)號碼都需要一個帳篷(4)號碼,但帳篷不能永遠不會彼此相鄰(垂直,水平地或對角地),它們總是水平或垂直地靠近一棵樹,這就是我所困惑的部分,爲生成的樹木設置帳篷。

希望你們明白我的意思,我真的很想學習,所以我只是需要提示,請提前謝謝你有一個美好的一天。

+2

你已經有什麼代碼了?如果你還沒有任何實際的代碼,可能是一些關於你如何解決問題的僞代碼? – kevinsa5 2014-12-07 05:15:23

回答

0

下面是一些雜感,可以幫助你安排的事情:

  1. 在C/C++二維數組是一個真正的一維結構(連續內存塊)。在C和C++中,二維數組存儲在行主要的窗體中,這意味着我們將整個第一行放在內存中,然後整個第二行等等。因此,例如,如果我們有以下 2-d陣列

    0 1 2 <--- columns 
    0 a b c 
    1 d e f 
    2 g h i 
    ^ 
    +-- rows 
    

,將在存儲器(假設我們使用炭作爲我們的基本數據類型),其表示:

+---+---+---+---+---+---+---+---+---+ 
    | a | b | c | d | e | f | g | h | i | 
    +---+---+---+---+---+---+---+---+---+ 

這種安排很有用,因爲我們可以很容易地在一維存儲器陣列中的索引與我們的二維數組的概念之間進行轉換。在下面的等式中,R表示在我們的2-D數組中的最大行數(在這個例子中是3),並且C表示在我們的2-D數組中的最大列數(在這個例子中再次是3)。最後說明,我們對行和列使用零基數;因此元素'a'在行0,列0,在下面縮寫爲[0,0]。

所以如果我們對[r,c]中的內容感興趣,我們需要生成一個索引,n,via;

n = r * C + c 

例如,如果我們感興趣的是[1,1],我們將計算:

n = 1 * 3 + 1 = 4 
換句話說

,在[1,1]位於第四索引處的元素(再次記住該數組是從零開始的)。

我們也可以通過使用從索引n轉換回行列表示法;

r = n/C and c = n % C 

例如在第六存儲器位置的元件(索引= 5)將是

r = 5/3 and c = 5 % 3 or [1,2] 
  • 樹放置是相當直截了當的,因爲如果我們正在處理焦慮數組,然後我們知道我們的索引從[0,n $^2 $ -1]開始運行,所以我們只是在該範圍內生成隨機數,只是確保不要使用相同的數字兩次。一些僞代碼可能會安排牛逼樹:

    // assume that our game board is in a data-structure called `world' 
    len <- n*n;     // maximum number in our range 
    trees <- t;      // number of trees to place 
    do 
        ndx <- rand() % len   // generate random number in range [0,len-1] 
        if (world[ndx] == 0)  // picked an empty space 
         world[ndx] = 8;   // plant a tree 
         trees -= 1;    // decrement tree's remaining 
    while (trees > 0); 
    
  • 哪裏可能把帳篷很容易爲好。即將內存模型的2-d陣列之間的關係的思考,如果一棵樹位於定索引處,NDX,可能10噸位置的名單是:

    L = ndx - 1;    // this is due left of the tree 
        R = ndx + 1;    // this is due right of the tree 
        B = ndx + C;    // this is below the tree 
        A = ndx - C;    // this is above the tree 
    
  • 當然,我們必須確保我們不會離開世界。就個人而言,我會將它們存儲在一個數組中,而不是四個變量。

    1. 帳篷約束實際上只是說明在八個相鄰單元中的任何一箇中都不能有帳篷。考慮下圖,我們在單元格中標有一個帳篷。如果這個單元格的索引是n,那麼周圍的單元格會顯示我們需要檢查的索引。

       +---+---------+-----+----------+---+ 
           | |   |  |   | | 
           +---+---------+-----+----------+---+ 
           | | n-C - 1 | n-C | n-C + 1 | | 
           +---+---------+-----+----------+---+ 
           | | n-1  | T | n +1  | | 
           +---+---------+-----+----------+---+ 
           | | n+C -1 | n+C | n+C +1 | | 
           +---+---------+-----+----------+---+ 
      
    2. 讓我們把3和4放在一起。我們首先創建一個函數placeTents,它獲取樹木放置位置的索引數組。這是一個簡單的函數,只要它的任何位置超出邊界,我們就會在{top,left,right,bottom}的順序中創建一個潛在樹位置數組,我們在數組中設置一個負值。最後,我們嘗試爲函數placeTent(P)中的帳篷生成 的可行位置;如果placeTent失敗,我們不能滿足約束,從您的問題描述,它是在你想在這一點上做什麼不清楚,這個討論中,我只是指出該方案

      placeTents(trees): 
          max <- R * C -1    // max index 
          for each tree in trees   
           if (tree - C) > 0 then P[0] = tree - C else P[0] = -1; 
           if (tree - 1) > 0 then P[1] = tree - 1 else P[1] = -1; 
           if (tree + 1) < max then P[2] = tree + 1 else P[2] = -1; 
           if (tree + C) < max then P[3] = tree + C else P[3] = -1; 
           if (!placeTent(P)) 
            exitError; 
      

    的出口對於placeTent,我們需要檢查所有八鄰居(可能不存在),爲了簡單起見,我們只在第一個可用位置放置一個帳篷。再次記住,placeTent接受可能放置帳篷的地方列表,然後檢查每個地點的可行性。同樣,我們認爲遊戲板是在一個名爲world

     bool placeTent(P) 
         ret <- false; 
         max <- R * C - 1; 
         for each loc in P 
          if loc == -1 continue; 
          // calculate indexes we want to look at.... 
          trial[0] <- loc - Col - 1; 
          trial[1] <- loc - Col; 
            ..... 
          trial[6] <- loc + Col; 
          trial[7] <- loc + Col + 1; 
          for each t in trial 
           if ((t < 0) || (t > max)) continue; // we fell of the world.....splat! 
           if (world[t] == 0) 
            world[t] = 4; 
            return true; 
         return false;        // failed to find a place to pitch our tent 
    

    最後,真正的挑戰是找到帳篷可行的位置的陣列,爲了這個,我倒是對遞歸的事情,所以,當我失敗找到一個可行的位置,我們可以放鬆地點,並嘗試不同的路徑。

    而且看到了這個旋轉成的長度....對不起,可能是漫無邊途的方式,太多了......我將在稍後離開遞歸部分。

    編輯/添加:

    一個我忘了提及其他的東西,上面是非常確定的,即我們可以嘗試把一棵樹上面一頂帳篷,然後移動逆時針旋轉。在某些時候,人們會弄清楚這一點,所以你可能想隨機選擇要檢查的地方的順序(即在每個樹的P數組上創建一個排列)。

    +0

    哇哥們謝謝你!這真的幫助我了!我完成了哈哈感謝! – CryoCodex 2014-12-08 10:29:19