Mat*_*ler 6 html javascript minesweeper
我在javascript中制作了一个扫雷游戏,最后运行起来非常顺利,直到我添加了"expand()"功能(见下文).我有3个问题:
相关代码和链接低于这两个图像


var flippedCount = 0;
var alreadySetAsZero = [];
var columnAmount = 10;
function processClick(clicked) { //i use a "(this)" to pass as "(clicked)"
nextToBombCheck( parseInt(clicked.id) );
checkWin();
}
nextToBombCheck( boxNum ) {
flippedCount++;
document.getElementById("flipped").innerHTML = flippedCount;
//long function setting "bombCount" to # bombs around clicked square goes here
if ( bombCount !== 0 ) {
//blah blah blah
} else {
alreadySetAsZero[ boxNum ] = "yes";
expand(boxNum);
}
}
function expand( emptyBoxId ) {
checkRightOfEmpty( emptyBoxId + 1 );
checkLeftOfEmpty( emptyBoxId - 1 );
checkAboveEmpty( emptyBoxId - columnAmount );
checkBelowEmpty( emptyBoxId + columnAmount );
}
function checkRightOfEmpty( boxToTheRightId ) {
//check if already marked as zero
if ( alreadySetAsZero[ boxToTheRightId ] === "yes" )
return;
//if box is at the edge
if ( boxToTheRightId % columnAmount === ( 0 ) ) {
//do nothing
} else {
nextToBombCheck( boxToTheRightId );
}
}
//and the rest are 3 similar functions
Run Code Online (Sandbox Code Playgroud)
我无法找到缺少扩展的模式或添加到翻转计数的数字.
ps抱歉标题我不知道还有什么叫它
您得到的计数不正确,因为您的算法没有考虑已经翻转的方块 - 结果是方块被计数两次。
\n\n保持准确计数的最简单方法是利用“getElementsByClassName”返回活动节点列表这一事实。
\n\n注意:getElementsByClassName 有很好的浏览器支持,但是如果您的浏览器要求不同,您将需要对此进行一些调整。
\n\n输入时,初始化列表(变量名称只是为了与以前的名称区分开):
\n\nvar newFlippedCount = document.getElementsByClassName(\'flipped\');\nRun Code Online (Sandbox Code Playgroud)\n\n每次用炸弹计数类更新方块时,请使用它(也添加翻转类):
\n\ndocument.getElementById(boxNum).className = classList[bombCount] + \' flipped\';\nRun Code Online (Sandbox Code Playgroud)\n\n当您使用新的翻转计数更新 UI 时,请使用:
\n\ndocument.getElementById("flipped").innerHTML = newFlippedCount.length;\nRun Code Online (Sandbox Code Playgroud)\n\n你的计数现在神奇地正确了:)
\n\n注意:您还可以通过检查在递增之前框是否已翻转来解决此问题flippedCount。
您还会定期在控制台中收到错误:
\n\nUncaught TypeError: Cannot set property \'className\' of null\nRun Code Online (Sandbox Code Playgroud)\n\n在这一行(第298行附近):
\n\ndocument.getElementById(boxNum).className = classList[bombCount];
\n\n您应该通过检查边界或仅在使用前检查返回值来保护它:
\n\nvar ele = document.getElementById(boxNum);\nif(!ele) return;\n\nele.className = classList[bombCount] + \' flipped\';\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n编辑:如果您有兴趣,这里是扫雷级联算法的高级概述
\n\n更新 - 发现级联错误
\n\n级联在连续重播中无法正常工作的原因之一是用于跟踪已设置为零的单元格的变量未在新游戏中重置。如需修复:
\n\nfunction start() {\n \xe2\x80\xa6\n // Reset to empty array\n alreadySetAsZero = [];\n ...\n}\nRun Code Online (Sandbox Code Playgroud)\n\n使用附加调试语句更新了小提琴以帮助查找问题:
\n\n\n