如何为俄罗斯方块游戏设计一条线删除功能?

时间:2017-12-26 19:45:58

标签: javascript html tetris

我正在尝试用javaScript和HTML构建一个俄罗斯方块游戏。我遇到了我的功能问题,删除了整行。它有点工作,但不是每次都如我所料。我不是一个专业的程序员,我正在学习编码只是为了好玩。我对javaScript的了解有限,我的方法很原始。我的电路板由div标签组成。它们中的每一个代表一个正方形并且具有唯一编号的id。目前,下降的形状由称为“砖”的阵列存储。它包含四个数字,对应于div ID。

例如,砖= [2,2,3,5]意味着俄罗斯方块“l”件水平放置。连续有12个方格。第一个和最后一个具有类“挡泥板”,这意味着它们不能成为砖的一部分,因此形状不能离开板。

挡泥板正方形被CSS隐藏。通过添加12来降低砖块。从[2,3,4,5]开始,它是[14,15,16,17]等。前四行的显示设置为“无”,因此可见板开始于方数63。

在开始时,棋盘的每个方格(挡泥板正方形除外)都有一个“自由”类,这意味着它可以渗透掉形状。当它没有类时,形状不能通过它。当砖块撞到底部或其他倒下的形状时,它会被添加到另一个变量中,称为桩。

这是通过一个名为touchdown()的函数完成的。它做了其他几件事。砖的颜色存储在另一个名为colorPile的变量中。例如,当蓝砖[2,3,4,5]落地时,它将colorPile变量添加到“蓝色”四倍。 Touchdown()还从砖块的所有方块中移除“free”类,因此下一块砖不能通过占用空间。然后它要求创建一个新砖。

删除过程从名为testLines()的函数开始:

      // Look through all board lines 
   for (var i = 62; i < 300; i += 12) {
       // Prepare empty array 
       line = [];
       // Put numbers of occupied squares in the array.
       for (var j = i; j < i + 10; j++) {
           if (document.getElementById("sq" + j).classList.contains("free") === false) {
               line.push(j);
           }
       }
       // When the line is full, put its number in “numb” variable and call for deleting function  
       if (line.length == 10) {
           numb = i;
           clearLine(numb);
       }
   }
   }
   }

它通过电路板的所有线路并寻找完整的线路。如果有一个完整的行,它将其编号存储在一个名为“numb”的变量中,并调用另一个名为clearLine()的函数:

function clearLine() {
// Put the indexes of the squares in the full line in a special array
indexes = [];
for (var i = numb; i < numb + 10; i++) {
    indexes.push(pile.indexOf(i));
}
// Remove numbers on the indexes
pileindexor = indexes.length;
while (pileindexor--) {
    pile.splice(indexes[pileindexor], 1);
}
// Add 12 to all numbers greater than the line number (= move them on row down)
for (var j = 0; j < pile.length; j++) {
    if (pile[j] < numb) {
        pile[j] = (pile[j] + 12);
    }
}
clearColorPile();
paintPile();
clearBoard();
lines++;
testLines();

}

它还调用了名为clearColorPile()的函数,该函数从&#34; colorPile&#34;中删除相同索引上的颜色。变量。接下来,它调用另一个名为paintPile()的函数。 paintPile()函数改变&#34;桩&#34;中所有方块的颜色。变量根据修改后的&#34; colorPile&#34;变量并从中删除“免费”类。

比clearLine()调用另一个名为clearBoard()的函数。它描绘了所有不属于白色堆积的方块,并将“免费”类广告给它们。最后,clearLine()函数再次调用testLines()来查找更多的完整行。

此过程的行为与我预期的大部分时间一样。但有时候,整条线并没有完全清除。我的游戏是here。你可以亲眼看看。我做错了什么?如何删除整行?

0 个答案:

没有答案