這裏通過回溯生成一個迷宮工作正常,但事情是,我試圖在一個像素遊戲(我的世界)中實現...所以問題是在繪圖迷宮。在這個遊戲中,牆塊的尺寸應該與空塊/空間的尺寸完全相同,所以我唯一想到的解決方案是名爲totalmaze的額外二維數組。它的目的是存儲空的空間和牆塊,所以我做了它的大小(x * 3,y * 3)並嘗試輸出牆壁,但不幸的是這會導致很多問題,例如空間太多/路徑被阻塞。注意:X,Z是因爲它是一個3d迷宮。php - 回溯迷宮一代(將所有東西都轉換爲二維數組)
如果這是一個JavaScript和一個簡單的應用程序,我只是畫牆,但在Minecraft中,尺寸應該是相同的,因此即使算法是正確的,事情也會變得麻煩。請幫忙。
這是我正在試圖修復它,但也許是沒有辦法的辦法:https://prnt.sc/fbp88o
public function generateMaze($dim_x, $walls_height, $dim_z){
$maze = array();
$moves = array();
$cell_count = $dim_x*$dim_z;
for($position=0; $position<$cell_count; $position++){
$maze[$position] = "01111"; // visited, NSEW
}
$pos=0;
$maze[0]{0} = 1; /// initial
$visited = 1;
// determine possible directions
while($visited<$cell_count){
$possible = "";
if((floor($pos/$dim_x)==floor(($pos-1)/$dim_x)) and ($maze[$pos-1]{0}==0)){
$possible .= "W";
}
if((floor($pos/$dim_x)==floor(($pos+1)/$dim_x)) and ($maze[$pos+1]{0}==0)){
$possible .= "E";
}
if((($pos+$dim_x)<$cell_count) and ($maze[$pos+$dim_x]{0}==0)){
$possible .= "S";
}
if((($pos-$dim_x)>=0) and ($maze[$pos-$dim_x]{0}==0)){
$possible .= "N";
}
if($possible){
$visited ++;
array_push($moves,$pos);
$direction = $possible{rand(0,strlen($possible)-1)};
switch($direction){
case "N":
$maze[$pos]{1} = 0;
$maze[$pos-$dim_x]{2} = 0;
$pos -= $dim_x;
break;
case "S":
$maze[$pos]{2} = 0;
$maze[$pos+$dim_x]{1} = 0;
$pos += $dim_x;
break;
case "E":
$maze[$pos]{3} = 0;
$maze[$pos+1]{4} = 0;
$pos ++;
break;
case "W":
$maze[$pos]{4} = 0;
$maze[$pos-1]{3} = 0;
$pos --;
break;
}
$maze[$pos]{0} = 1;
}
else{
$pos = array_pop($moves);
}
}
$totalmaze = array();
for($i=0; $i<$dim_x*3+1; $i++){
$totalmaze[$i][0] = 1;
$totalmaze[$i][$dim_z*3-1]=1;
}
for($i=0; $i<$dim_z*3+1; $i++){
$totalmaze[0][$i] = 1;
$totalmaze[$dim_x*3-1][$i]=1;
}
for($position=0; $position<$cell_count; $position++){
$x = $position % $dim_x;
$z = floor($position/$dim_x);
if($maze[$position]{1} == 1){
$totalmaze[$x*3+1][$z*3]=1;
}
if($maze[$position]{2} == 1){
$totalmaze[$x*3+1][$z*3+2]=1;
}
if($maze[$position]{3} == 1){
$totalmaze[$x*3+2][$z*3+1]=1;
}
if($maze[$position]{4} == 1){
$totalmaze[$x*3][$z*3+1]=1;
}
}
哦,如果你感到困惑,因爲MC使用Java插件,這是MCPE。 – Caitiff
主要目的是存儲整個迷宮(牆壁+二維數組中的空白空間) – Caitiff
希望最終得到回答 – Caitiff