2015-11-15 28 views
0

我有一個Python(3.4)迷宮生成器腳本,我試圖轉換爲Javascript。原來的Python腳本可以發現如下:Python迷宮生成腳本 - 轉換爲Javascript:數學差異?

import random 

width = 10 
height = 10 
difficulty = 5 

walls = [] 
maze = [0] * width 

for i in range(height): 
    maze[i] = [0] * height 

maze[0][1] = 1 

walls.append([1, 1, 1]) 

print(random.random()) 

def addWalls(): 
    walls.append([X + 1, Y, 1]) 
    walls.append([X - 1, Y, 2]) 
    walls.append([X, Y + 1, 3]) 
    walls.append([X, Y - 1, 4]) 
    maze[X][Y] = 1 

while len(walls) > 0: 
    if len(walls) > difficulty: 
     current = len(walls) - round(random.random() * difficulty) - 1 
    else: 
     current = round(random.random() * (len(walls) - 1)) 

    cell = walls[current] 
    walls.pop(current) 

    X = cell[0] 
    Y = cell[1] 
    Dir = cell[2] 

    if Dir == 1: 
     if X + 1 < width and maze[X][Y] == 0 and maze[X + 1][Y] == 0 and maze[X + 1][Y - 1] == 0 and maze[X + 1][Y + 1] == 0 and maze[X][Y - 1] == 0 and maze[X][Y + 1] == 0: 
      addWalls() 
    elif Dir == 2: 
     if X - 1 > - 1 and maze[X][Y] == 0 and maze[X - 1][Y] == 0 and maze[X - 1][Y - 1] == 0 and maze[X - 1][Y + 1] == 0 and maze[X][Y - 1] == 0 and maze[X][Y + 1] == 0: 
      addWalls() 
    elif Dir == 3: 
     if Y + 1 < height and maze[X][Y] == 0 and maze[X][Y + 1] == 0 and maze[X - 1][Y + 1] == 0 and maze[X + 1][Y + 1] == 0 and maze[X - 1][Y] == 0 and maze[X + 1][Y] == 0: 
      addWalls() 
    elif Dir == 4: 
     if Y - 1 > - 1 and maze[X][Y] == 0 and maze[X][Y - 1] == 0 and maze[X - 1][Y - 1] == 0 and maze[X + 1][Y - 1] == 0 and maze[X - 1][Y] == 0 and maze[X + 1][Y] == 0: 
      addWalls() 

for y in range(0, height): 
    line = '' 
    for x in range(0, width): 
     if (maze[x][y] == 0): 
      line += '0' 
     else: 
      line += '1' 
    print(line) 

腳本試圖完成同樣在Javascript然而,當工作,因爲它應該,迷宮似乎停止遍歷。見下文(0 =牆,1 =開放的迷宮空間)的片段:

function newLevel(dimensions, difficulty) { 
 

 
    // create arrays 
 
    walls = [ 
 
    [1, 1, 1] 
 
    ]; 
 
    maze = []; 
 

 
    for (i = 0; i < dimensions - 1; i++) { 
 
    maze[i] = [0]; 
 
    for (j = 0; j < dimensions - 1; j++) { 
 
     maze[i][j] = [0]; 
 
    } 
 
    } 
 

 
    // set the cell (0; 1) as the exit 
 
    maze[0][1] = 1; 
 

 
    function addwalls() { 
 
    walls.push([X + 1, Y, 1]); 
 
    walls.push([X - 1, Y, 2]); 
 
    walls.push([X, Y + 1, 3]); 
 
    walls.push([X, Y - 1, 4]); 
 
    maze[X][Y] = 1; 
 
    } 
 

 
    while (walls.length > 0) { 
 
    current = Math.round(Math.random() * (walls.length - 1)); 
 
    if (walls.length > difficulty) { 
 
     current = walls.length - Math.round(Math.random() * difficulty) - 1; 
 
    } 
 
    cell = walls[current]; 
 
    walls.pop(current); 
 

 
    X = cell[0]; 
 
    Y = cell[1]; 
 
    Dir = cell[2]; 
 

 
    if (Dir == 1 && X + 1 < dimensions && maze[X][Y] == 0 && maze[X + 1][Y] == 0 && maze[X + 1][Y - 1] == 0 && maze[X + 1][Y + 1] == 0 && maze[X][Y - 1] == 0 && maze[X][Y + 1] == 0) { 
 
     addwalls(); 
 
    } 
 
    if (Dir == 2 && X - 1 > -1 && maze[X][Y] == 0 && maze[X - 1][Y] == 0 && maze[X - 1][Y - 1] == 0 && maze[X - 1][Y + 1] == 0 && maze[X][Y - 1] == 0 && maze[X][Y + 1] == 0) { 
 
     addwalls() 
 
    } 
 
    if (Dir == 3 && Y + 1 < dimensions && maze[X][Y] == 0 && maze[X][Y + 1] == 0 && maze[X - 1][Y + 1] == 0 && maze[X + 1][Y + 1] == 0 && maze[X - 1][Y] == 0 && maze[X + 1][Y] == 0) { 
 
     addwalls(); 
 
    } 
 
    if (Dir == 4 && Y - 1 > -1 && maze[X][Y] == 0 && maze[X][Y - 1] == 0 && maze[X - 1][Y - 1] == 0 && maze[X + 1][Y - 1] == 0 && maze[X - 1][Y] == 0 && maze[X + 1][Y] == 0) { 
 
     addwalls(); 
 
    } 
 
    } 
 

 
    cells = maze; 
 

 
    for (var row = 0; row < maze.length; row++) { 
 
    for (var col = 0; col < maze[row].length; col++) { 
 
     $('body').append(maze[row][col]); 
 
    } 
 
    $('body').append('<br />'); 
 
    } 
 

 
} 
 

 
$(document).ready(function() { 
 
    newLevel(30, 5); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<body> 
 

 
</body>

是否有在數學中的Python和JavaScript之間進行過程中的任何重大分歧?

謝謝

編輯:非常感謝您的支持。這裏是工作腳本:

function newLevel(dimensions, difficulty) { 

    // create arrays 
    walls = [[1, 1, 1]]; 
    maze = []; 

    for (i = 0; i < dimensions; i++) { 
    maze[i] = [0]; 
    for (j = 0; j < dimensions; j++) { 
     maze[i][j] = [0]; 
    } 
    } 

    // set the cell (0; 1) as the exit 
    maze[0][1] = 1; 

    function addwalls() { 
    walls.push([X + 1, Y, 1]); 
    walls.push([X - 1, Y, 2]); 
    walls.push([X, Y + 1, 3]); 
    walls.push([X, Y - 1, 4]); 
    maze[X][Y] = 1; 
    } 

    while (walls.length > 0) { 
    current = Math.round(Math.random() * (walls.length - 1)); 
    if (walls.length > difficulty) { 
     current = walls.length - Math.round(Math.random() * difficulty) - 1; 
    } 

    cell = walls[current]; 
    walls.splice(current, 1)[0]; 

    X = cell[0]; 
    Y = cell[1]; 
    Dir = cell[2]; 

    if (Dir == 1 && X + 1 < dimensions && maze[X][Y] == 0 && maze[X + 1][Y] == 0 && maze[X + 1][Y - 1] == 0 && maze[X + 1][Y + 1] == 0 && maze[X][Y - 1] == 0 && maze[X][Y + 1] == 0) { 
     addwalls(); 
    } 
    if (Dir == 2 && X - 1 > - 1 && maze[X][Y] == 0 && maze[X - 1][Y] == 0 && maze[X - 1][Y - 1] == 0 && maze[X - 1][Y + 1] == 0 && maze[X][Y - 1] == 0 && maze[X][Y + 1] == 0) { 
     addwalls() 
    } 
    if (Dir == 3 && Y + 1 < dimensions && maze[X][Y] == 0 && maze[X][Y + 1] == 0 && maze[X - 1][Y + 1] == 0 && maze[X + 1][Y + 1] == 0 && maze[X - 1][Y] == 0 && maze[X + 1][Y] == 0) { 
     addwalls(); 
    } 
    if (Dir == 4 && Y - 1 > - 1 && maze[X][Y] == 0 && maze[X][Y - 1] == 0 && maze[X - 1][Y - 1] == 0 && maze[X + 1][Y - 1] == 0 && maze[X - 1][Y] == 0 && maze[X + 1][Y] == 0) { 
     addwalls(); 
    } 
    } 
    return cells; 
} 
+0

首先,Javascript不支持整數。 – cjohnson318

+0

@ cjohnson318這很有趣......那麼表示一個整數的最好方法是什麼?通過舍入值? – MrPutuLips

回答

0

Python和JavaScript之間有很多微小但很容易破裂的區別。

環路在Python從0

for i in range(10) 

捲起至9十個步驟。你把它翻譯成

for (i = 0; i < 10 - 1; i++) 

其中輥0-8在九個步驟(假設的height的值等於dimensions)。

您無法選擇需要Array.splice()這樣做的JavaScript數組中的哪個元素(或者滾動您自己的數組)。

關於整數問題: JavaScript的Number對象是一個64位浮點數,更好地稱爲IEEE-754 binary64 double。這限制了整數的範圍爲-2^53 < x < 2^53。你可以「引誘」引擎將x作爲有符號整數,按x|0處理,並將其作爲無符號整數,如x>>>0,但自動轉換嘗試以各種可能方式潛入,最好是最出人意料的。

+0

感謝您的回答。它幫助了很多 – MrPutuLips

1

區別在於,在python中,pop似乎可以從數組中刪除任何元素。在javascript中,pop刪除數組中的最後一個元素,並且它不帶任何參數。爲了從在javscript數組中刪除任意的元件,使用splice,能夠除去和一個給定的索引處添加元素:

cell = walls[current]; 
walls.pop(current); 

變得

cell = walls.splice(current, 1)[0]; 

這樣做是它從刪除1個元件從索引電流開始的陣列牆。 Splice返回一個元素數組,所以cell是該數組的第一個元素。