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

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

本文关键字:Javascript 转换 迷宫 脚本 Python      更新时间:2023-09-26

我有一个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=迷宫中的空地):

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删除数组的最后一个元素,并且不接受任何参数。要从javscript中的数组中删除任意元素,请使用splice,它可以删除和添加给定索引处的元素:

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

成为

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

这样做的目的是从索引电流开始从阵列墙中删除1个元素。拼接返回一个删除的元素数组,因此单元格是该数组的第一个元素。

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

Python 中的循环

for i in range(10)

在十个步骤中从0滚动到9。你把它翻译成

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

其在九个步骤中从0滚动到8(假设CCD_ 1的值等于CCD_。

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

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