2013-02-01 65 views
2

我怎樣才能防止這種地圖生成器從創建接觸角是這樣的:防止接觸角(JS遊戲)

-X 
X- 

或者

X- 
-X 

這裏是發電機的一個簡單的例子:http://jsfiddle.net/fDv9C/2/

+1

http://whathaveyoutried.com? – Gareth

+0

@Gareth很多東西。這是手頭問題的一個小規模簡化例子。我已經嘗試過濾後發現一個角落時添加和刪除塊,但不能完全正確。 – Petah

+0

在jsfiddle中沒有任何javascript!你甚至放棄了它嗎? –

回答

1

你的問題幾乎可以回答。

這裏的小提琴:http://jsfiddle.net/qBJVY/

if (!!grid[y][x] && !!grid[y+1][x+1] && !grid[y+1][x] && !grid[y][x+1]) { 
    good=false; 
    grid[y+1][x]=2; 
} 

它只是簡單地檢查你不想要的組合和修補起來。它總是添加一個網格點,以免斷開地圖的任何部分。

這反過來可能會導致出現問題的另一種情況,但如果它改變了任何事情(即,如果發現問題),它會再次檢查。這可以進行優化,例如通過遞歸調整任何改變,但通常它只需要1或2遍。在那裏有一個限制器,不允許超過100次傳球,以防萬一有一些無法預知的情況發生(我想不出這種情況,儘管:))。

+0

謝謝,這是解決這個問題,雖然我已經整理它的第一個答案。但是你得到賞金。 http://jsfiddle.net/fDv9C/19 – Petah

+0

耶!我現在可以評論!謝謝。 – DDS

0

這就是我所做的:http://jsfiddle.net/fDv9C/13/

哪裏有魔法發生了什麼?向下滾動至第53行至第53行:

var bottom = y_next + 1; 
var left = x_next - 1; 
var right = x_next + 1; 
var top = y_next - 1; 

if (grid[top][left] || grid[top][right] || 
    grid[bottom][left] || grid[bottom][right]) continue; 

總之,您的觸摸角點只能出現在計算的下一個位置。因此,如果存在下一個位置的四個角落鄰居中的任何一個,則必須計算另一個下一個位置。

你甚至可以遞減計數器i發生這種情況時,以獲得儘可能多的路徑儘可能(儘管它並不真正使一個很大的區別):

var bottom = y_next + 1; 
var left = x_next - 1; 
var right = x_next + 1; 
var top = y_next - 1; 

if (grid[top][left] || grid[top][right] || 
    grid[bottom][left] || grid[bottom][right]) { 
    i--; 
    continue; 
} 

在這裏看到演示:http://jsfiddle.net/fDv9C/12/

編輯:我無法抗拒。我必須創建一個自動地圖生成器,以便我不需要繼續點擊運行:http://jsfiddle.net/fDv9C/14/

+0

在兩個小提琴,我得到'遺漏的類型錯誤:無法讀取屬性「24」未定義fiddle.jshell.net/fDv9C/6/show/:88 遺漏的類型錯誤的:不能叫null' – Petah

+0

@Petah的方法「GET」 - 這是奇怪的。這對我來說可以。向我顯示錯誤控制檯的屏幕截圖,或嘗試使用其他瀏覽器。你在使用哪一個? –

+0

http://www.dumpt.com/img/viewer.php?file=ubn3mhu5q36wxsmcrz7x.png(chrome 24.0.1312.57)。另外http://jsfiddle.net/fDv9C/8/似乎沒有錯誤。但是它刪除了「房間」,所以它只會形成走廊。 – Petah

1

由於您創建電路板的方式,在生成過程中執行此檢查非常困難。我創建了簡單的功能,以後檢查板。它使用洪水算法。這裏是小提琴http://jsfiddle.net/jzTEX/8/(藍色背景是原始地圖,紅色背景是地圖後檢查)

基本上我們創建第二個陣列grid2。填充grid後,我們與檢查功能

function checkV(x,y) { 
    var checkVarr = [[-1,-1], [-1,1], [1,1], [1,-1]]; 
    for(var k=0;k<4;k++) { 
     if(grid[y+checkVarr[k][0]][x+checkVarr[k][1]] == 1 && grid[y+checkVarr[k][0]][x] == 0 && grid[y][x+checkVarr[k][1]] == 0 && grid2[y+checkVarr[k][0]][x+checkVarr[k][1]] == 1) 
      return false; 
    } 
    return true; 
} 

這不是完美的,因爲我們有時可以扔地圖客場大的部分,但如果我們試圖開始添加新的遞歸函數floodV

function floodV(x,y) { 
    var shiftArray = [[0,1],[0,-1],[1,0],[-1,0]]; 
    grid2[y][x]=1; 
    for(var k=0;k<4;k++) { 
     var x1=x+shiftArray[k][0]; 
     var y1=y+shiftArray[k][1]; 
     if(grid[y1][x1] == 1 && grid2[y1][x1] == 0 && checkV(x1,y1)) { 
      grid2[y1][x1] = 1; 
      floodV(x1,y1); 
     } 
    } 
} 

運行元素,我們必須再次檢查整個地圖(有價值的情況下)。

+0

感謝工作得很好,儘管它錯誤地識別這種情況下:http://www.dumpt.com/img/viewer.php?file=cmud3yfkzcq3iulg2vx0.png – Petah

+0

我修改'check'功能(小提琴鏈接也更新),請測試它現在。 – abc667

+0

還是不太對勁:http://www.dumpt.com/img/viewer.php?file=5m5mk0hyh6d4k56i7noo.png但是我覺得我haved整理它作爲每http://jsfiddle.net/fDv9C/19/ – Petah