【发布时间】:2013-07-04 21:54:42
【问题描述】:
我正在尝试将一些 ruby 代码移植到 javascript,但我正在为某一行苦苦挣扎
Ruby 代码如下: 它会从俄罗斯方块游戏中删除所有完整的行:
# removes all filled rows and replaces them with empty ones, dropping all rows
# above them down each time a row is removed and increasing the score.
def remove_filled
(2..(@grid.size-1)).each{|num| row = @grid.slice(num);
# see if this row is full (has no nil)
if @grid[num].all?
# remove from canvas blocks in full row
(0..(num_columns-1)).each{|index|
@grid[num][index].remove;
@grid[num][index] = nil
}
# move down all rows above and move their blocks on the canvas
((@grid.size - num + 1)..(@grid.size)).each{|num2|
@grid[@grid.size - num2].each{|rect| rect && rect.move(0, block_size)};
# I can't port this line
@grid[@grid.size-num2+1] = Array.new(@grid[@grid.size - num2])
}
# insert new blank row at top
@grid[0] = Array.new(num_columns);
# adjust score for full flow
@score += 10;
end
}
self
end
其中@grid是一个二维数组,初始化如下:
@grid = Array.new(num_rows) {Array.new(num_columns)}
到目前为止我所做的javascript如下
我已经在评论中指出这是我无法解决的问题
removeFilled() {
for (var i = 2; i < this.grid.length; i++) {
var row = this.grid.slice(i);
var allFull = true;
for (var g = 0; g < this.grid[i].length; g++ ) {
if (this.grid[i][g] == undefined) {
allFull = false;
break;
}
}
if (allFull) {
for (var j = 0; j < this.numColumns; j++) {
this.grid[i][j].remove();
this.grid[i][j] = undefined;
}
for (var k = this.grid.length - i + 1; k <= this.grid.length; k++) {
var rects = this.grid[this.grid.length - k];
for(var l = 0; l < rects.length; l++) {
var rect = rects[l];
if (rect) {
rect.move(0, this.blockSize);
}
}
// ***this is the line I can't port
this.grid[this.grid.length - k + 1] = new Array(this.grid[this.grid.length - k]);
}
this.grid[0] = new Array(this.numColumns);
this.score += 10;
}
}
}
任何想法如何移植有问题的线路?
【问题讨论】:
-
好吧,为什么不能移植它? (你可能想看看
Array.slice。) -
所以开始:
grid[grid.length - k + 1] = grid[grid.length - k]。好的,我们正在取得进展。那么 ruby 中的Array.new(arr)有什么作用呢? -
this.grid[this.grid.length - k + 1]存在还是正在创建?如果它正在被创建,那么this.grid.length将增加一,因此this.grid[this.grid.length - k]实际上就是它自己!除非这是您的意图,否则您应该将其设置为变量并使用它:var currentGridLenght = this.grid.length; -
是的,它存在。它是二维网格中的一行。无论等号右侧的代码正在做什么(在 Ruby 代码中),都需要对其进行初始化。
-
它将网格数组中的项目设置为与之前的项目相同(从而将其向下移动)。类似于 row[3] = row[2] 的副本。似乎不完全合乎逻辑,但我不熟悉 Ruby。在 javascript 中,我会在数组的顶部添加一个项目
.unshift()和.pop()最后一个(因此将它们向下移动)。
标签: javascript ruby arrays