2010-08-26 65 views
15

那麼我已經通過很多網站教學如何解決它,但想知道如何創建它。我對它的編碼方面不感興趣,但想知道更多關於它的算法。例如,當網格生成10個左右的地雷時,我會使用任意隨機函數將其自身分佈在網格中,但是又如何設置與其關聯的數字並決定打開哪個框?我無法構建任何通用算法,我將如何去做這件事。掃雷後代算法的算法是什麼

+1

每個礦井應該增加每個不是礦井的鄰居單元。 – cthom06 2010-08-26 18:51:57

+0

,解決所有的問題..但是3和4。我將如何合併這些數字。如果我解析的方式只適用於單一的工作 – Rahul 2010-08-26 19:00:11

+0

[掃雷算法](http:// stackoverflow。com/questions/1738128/minesweeper-algorithm) – BoltClock 2010-08-26 19:09:49

回答

13

也許東西的線路:

grid = [n,m] // initialize all cells to 0 
for k = 1 to number_of_mines 
    get random mine_x and mine_y where grid(mine_x, mine_y) is not a mine 
    for x = -1 to 1 
     for y = -1 to 1 
     if x = 0 and y = 0 then 
      grid[mine_x, mine_y] = -number_of_mines // negative value = mine 
     else 
      increment grid[mine_x + x, mine_y + y] by 1 

這幾乎是它...

** 編輯 **

因爲這種算法可能到創建有些地雷集結在一起,或者更糟糕的是很分散(因此無聊解決),那麼在生成mine_x時可以添加額外的驗證和mine_y號碼。例如,要確保至少3個相鄰小區都沒有地雷,甚至可能有利於限制地雷是彼此太遠, **

我的號碼等

** UPDATE已經採取了與JS斌玩一點點的自由這裏想出了一個功能Minesweeper game demo。這只是爲了演示本答案中描述的算法。我沒有優化生成的地雷位置的隨機性,因此有些遊戲可能不可能或太容易。此外,沒有驗證網格中有多少個地雷,所以實際上可以創建一個包含1000個地雷的2乘2網格......但這隻會導致無限循環:)享受!

+2

這會在已經放置的地雷上增加,所以你會希望地雷可以用數量足夠負,以至於不會遞增到零,就像我的= -20。然後,每個負數都是我的。 – 2010-08-26 19:04:01

+0

修改後的答案更加精確 – 2010-08-26 19:05:28

+0

我沒有放置地雷的問題,但是如何獲得生成這些數字的線索來識別地雷?我沒有想法在那 – Rahul 2010-08-26 19:26:09

4

你只是種下地雷,然後你遍歷每一個細胞並計算鄰近的地雷。或者您將每個計數器設置爲0,並且每個種子礦都將增加所有相鄰的單元格計數器。

2

如果要將m地雷放在N方格上,並且您可以訪問隨機數發生器,則只需穿過剩餘的方格,並對每個方形計算(剩餘#個地雷)/(剩餘的#個方格)和地點如果您的隨機數等於或低於該值,則爲礦。現在

,如果你要標註與鄰近煤礦的數量每平方,你可以做它直接:

count(x,y) = sum(
    for i = -1 to 1 
    for j = -1 to 1 
     1 if (x+i,y+j) contains a mine 
     0 otherwise 
) 

,或者如果你喜歡,你可以用零數組開始,並增加各在3x3的廣場中有一個在中心有一個地雷。 (對地雷編號不會造成傷害)

這會產生一個純粹隨機且正確標註的掃雷遊戲。然而,一些隨機遊戲可能不是好玩的遊戲,選擇隨機但有趣的遊戲是一項更具挑戰性的任務。

+0

我可以創建網格並使用任意隨機函數放置地雷,但挑戰在於未來,當我嘗試將數字與這些地雷關聯時,我沒有關於如何去做這些地雷的想法。 – Rahul 2010-08-26 19:24:35

+0

我提供了僞代碼(無邊界檢查),確實如此。 (注意總和 - 你加起來9個值是1或0,這取決於那裏是否有地雷。) – 2010-08-26 19:26:54