Python 迷宫生成脚本 - 转换为 Javascript:数学差异?

Python Maze Generation Script - Converting to Javascript: Differences in Maths?

我在 Python (3.4) 中有一个迷宫生成器脚本,我正试图将其转换为 Javascript。原始 Python 脚本可以在下面找到:

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 = 在迷宫中打开 space):

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;
}

不同之处在于,在python 中,pop 似乎能够从数组中删除任何元素。在javascript、pop removes the last element of an array, and it takes no arguments. To remove an arbitrary element from an array in javscript, use splice中,可以删除和添加给定索引处的元素:

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

变成

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

它的作用是从索引当前开始的数组壁中删除 1 个元素。 Splice returns 删除了一个数组的元素,所以 cell 是那个数组的第一个元素。

Python 和 JavaScript 之间有很多微小但容易断颈的差异。

Python

中的循环
for i in range(10)

分十步从 0 滚动到 9。你翻译成

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

分九步从 0 滚动到 8(假设 height 的值等于 dimensions)。

您不能从 JavaScript 数组中选择要 pop 的元素,您需要 Array.splice() 这样做(当然也可以自己滚动)。

关于整数问题: JavaScript 的 Number 对象是一个 64 位浮点数,更广为人知的名称是 IEEE-754 binary64 double。这将整数范围限制为 -2^53 < x < 2^53。您可以 "persuade" 引擎将某些数字 x 处理为 x|0 的有符号整数和 x>>>0 的无符号整数,但自动转换会尝试以各种可能的方式潜入, 最好是最意想不到的。