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
的无符号整数,但自动转换会尝试以各种可能的方式潜入, 最好是最意想不到的。
我在 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
的无符号整数,但自动转换会尝试以各种可能的方式潜入, 最好是最意想不到的。