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=迷宫中的空地):
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
的无符号整数,但自动转换会尝试以各种可能的方式潜入,最好是最意想不到的方式。
相关文章:
- 将这些正则表达式从javascript转换为Java
- 使用JAVASCRIPT转换货币.可以't通过我的函数设置转换后的输入文本字段的值
- 使用ScriptObjectMirror将数组结果从JavaScript转换为有用的东西
- 如何在javascript转换编码中将一个动态值从一个表单添加到另一个页面
- 使用document.cookie将客户端javascript转换为节点模块
- 将纯javascript转换为jquery
- 按钮标签,javascript 转换为链接标签
- Javascript转换数组
- 如何将此JavaScript转换为插件
- 将可迭代的 Javascript 转换为数组
- DOM元素上的Javascript转换
- 用javascript转换日期
- 将代码从JavaScript转换为PHP
- 将var javascript转换为java变量
- 如何使用javascript转换特殊字符及其实体名称(如&with&)
- 如何将这个javascript转换为jquery
- Clojure到JavaScript转换器(Leiningen)
- .Net Ticks 使用 JavaScript 转换为 ISO 8601 日期格式
- JavaScript 转换用户输入
- 将 Javascript 转换为 coffeescript