【问题标题】:javascript minesweeper floodfill algorithm not working as it shouldjavascript扫雷洪水填充算法无法正常工作
【发布时间】:2016-05-19 07:51:56
【问题描述】:

我正在尝试编写我的第一个简单的扫雷游戏。为了显示空白字段,我编写了一个简单的洪水填充算法,但是它没有按应有的方式工作。这是一段sn-p代码:

function reveal(a,b){
var fieldId = getFieldId(a,b);  

/*
cells are stored in array fields[]. Each cell is an object {x: x,y: y, hasBomb: boolean,
hasBeenDiscovered: boolean}. Function getFieldId returns array key for (x,y) cell.
*/

if(a < 0 || a > boardWidth-1){return}
if(b < 0 || b > boardHeight-1){return}

if(fields[fieldId].hasBeenDiscovered == true){return}

if(getNeighbourNumber(a,b) > 0){
    document.getElementById(a+'x'+b).innerHTML = getNeighbourNumber(a,b);
    document.getElementById(a+'x'+b).style.backgroundColor = 'white';
    document.getElementById(a+'x'+b).setAttribute('discovered',1);
    fields[fieldId].hasBeenDiscovered = true;
    return
}else if(getNeighbourNumber(a,b) == 0){
    document.getElementById(a+'x'+b).innerHTML = ' ';
    document.getElementById(a+'x'+b).style.backgroundColor = 'white';
    document.getElementById(a+'x'+b).setAttribute('discovered',1);  
    fields[fieldId].hasBeenDiscovered = true;


}

    reveal(a,b);
    console.log('0 ' + '0');
    reveal(a+1,b);
    console.log('+1' + ' ' + '0');
    reveal(a-1,b);
    console.log('-1 ' + '0');
    reveal(a,b+1);
    console.log('0 ' + '+1');
    reveal(a,b-1);
    console.log('0 ' + '-1');
    reveal(a-1,b-1);
    console.log('-1 ' + '-1');
    reveal(a-1,b+1);
    console.log('-1 ' + '+1');
    reveal(a+1,b+1);
    console.log('+1 ' + '+1');
    reveal(a+1,b-1);
    console.log('+1 ' + '-1');
    console.log('------------');

}

当发现北部、西北和西部邻居有邻居炸弹的空单元格时,洪水填充只会显示这些单元格,即使其他邻居(南、东南西、东、东北)是空的。我是初学者,我无法弄清楚为什么这段代码不能完全正常工作。任何帮助将不胜感激:)

编辑:控制台日志仅用于调试尝试。

【问题讨论】:

  • 请你创建 jsfiddle
  • 这里是:jsfiddle.net/cmn2u1hk
  • 嘿,你能画一个小样本图吗,具体的问题是什么?我的意思是当用户点击一个单元格时,会发生什么,应该发生什么?例如,您可以使用静态数据而不是炸弹来解释我的问题,或者创建 4x4 或 5x5 矩阵并尝试解释
  • 我从你的问题中了解到的是,假设这张图片是一个字段 -> stanford.library.sydney.edu.au/archives/spr2007/entries/… .... 然后如果我点击 5 并且如果所有 9 个项目都没有炸弹那么它应该发生...目前只有 1,2 和 4 开放,对吧?
  • 几乎是的。如果用户在您的 cellgrid 上单击了 5。如果所有周围的单元格在其附近都有 0 个炸弹,则显示单元格周围的所有单元格并且算法可以正常工作。当单元格 1、2、4 附近有一个或多个炸弹时,问题就开始了(因此,它们应该显示一个数字,而不是完全显示出来),算法仅适用于这些单元格(因此单元格 1、2、4 会出现数字) 但不适用于单元格 3、6、7、8、9 - 即使它们附近没有炸弹,算法也应该揭示它们并进一步探索。对不起,我的英语很差,但这不是我的母语。

标签: javascript algorithm minesweeper


【解决方案1】:

我很高兴地说,您编写了一段很棒的代码,它很容易阅读和理解。

你只需要检查revealField函数中的一个小东西,这里你需要记住的一件事是当你从属性中获取值时,它总是会在字符串中给你,所以你需要将字符串解析为数字十进制基数。

function revealField(){
    var x = this.getAttribute('x');
    var y = this.getAttribute('y');
    x = parseInt(x, 10);
    y = parseInt(y, 10);

    var fieldId = getFieldId(x,y);

    if(fields[fieldId].hasBomb == true){
        document.getElementById(x+'x'+y).innerHTML = 'B';
        this.style.backgroundColor = 'brown';
        this.setAttribute('hasBomb', 1);
        removeEvents();
        alert('Bomba! Przegrales!');
    }else{
        this.style.backgroundColor = 'white';
        this.setAttribute('discovered',1);
        reveal(x,y);
        if(validateVictory() == true){
            removeEvents();
            alert('Brawo! Odkryles wszystkie bomby!');          
        }   
    }
}

这里也是您更新的fiddle

【讨论】:

  • 感谢您的客气话。现在程序运行良好,谢谢!但是我想澄清一下我是否完全理解为什么脚本以前不起作用 - 它仅适用于从选定单元格向左、左上角和向上的单元格,因为对于递归函数中的那些单元格显示(a,b)没有“+”运算符,只有“-”?并且对于“+”运算符函数作为参数需要两个字符串的总和(所以reveal(12 + 1,13)确实是reveal(121,13),而不是rev​​eal(13,13))? “-”运算符不是这样吗?
  • 是的,是的,每当您尝试添加 +1 时,它都会连接,而不是添加......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多