回答
你的問題幾乎可以回答。
這裏的小提琴: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次傳球,以防萬一有一些無法預知的情況發生(我想不出這種情況,儘管:))。
這就是我所做的: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/
在兩個小提琴,我得到'遺漏的類型錯誤:無法讀取屬性「24」未定義fiddle.jshell.net/fDv9C/6/show/:88 遺漏的類型錯誤的:不能叫null' – Petah
@Petah的方法「GET」 - 這是奇怪的。這對我來說可以。向我顯示錯誤控制檯的屏幕截圖,或嘗試使用其他瀏覽器。你在使用哪一個? –
http://www.dumpt.com/img/viewer.php?file=ubn3mhu5q36wxsmcrz7x.png(chrome 24.0.1312.57)。另外http://jsfiddle.net/fDv9C/8/似乎沒有錯誤。但是它刪除了「房間」,所以它只會形成走廊。 – Petah
由於您創建電路板的方式,在生成過程中執行此檢查非常困難。我創建了簡單的功能,以後檢查板。它使用洪水算法。這裏是小提琴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);
}
}
}
運行元素,我們必須再次檢查整個地圖(有價值的情況下)。
- 1. 槳遊戲 - 球接觸槳
- 2. 防止遊戲包在我的iPhone遊戲超過一次
- 3. 適用於遊戲UI的角度JS
- 4. 防止AJAX作弊的網頁遊戲
- 5. 防止作弊JavaScript的遊戲
- 6. 如何防止網頁遊戲作弊?
- 7. 防止角JS指令在移動元素時觸發兩次
- 8. 遊戲中的玩家停止遊戲
- 9. 角js輸入防止提交
- 10. -JS - 觸摸防止水平滾動
- 11. 防止LibGDX遊戲在暫停時完全停止
- 12. Javascript遊戲黑客預防
- 13. 遊戲中心 - 重新連接遊戲
- 14. 防止角
- 15. 基本JS帆布遊戲
- 16. 節點JS的HTML遊戲
- 17. p5.js乒乓遊戲
- 18. HTML/JS單機遊戲
- 19. Java角色扮演遊戲
- 20. 角狀記憶遊戲
- 21. 角的tic tac toe遊戲
- 22. N遊戲角色物理
- 23. Android多點觸控遊戲
- 24. RaycastHit2D - 觸摸2D遊戲
- 25. 如何停止jMonkeyEngine遊戲?
- 26. 在js的突圍遊戲中觸摸事件
- 27. Cocos2d iPhone遊戲觸摸屏讓角色移動
- 28. 如何防止遊戲客戶端發送假玩家ID?
- 29. 如何防止切換選項卡時的HTML遊戲暫停
- 30. 如何防止java遊戲中的滯後
http://whathaveyoutried.com? – Gareth
@Gareth很多東西。這是手頭問題的一個小規模簡化例子。我已經嘗試過濾後發現一個角落時添加和刪除塊,但不能完全正確。 – Petah
在jsfiddle中沒有任何javascript!你甚至放棄了它嗎? –