扫雷程序中,对numbers[][]数组赋值的疑问

来源:7-6 为扫雷程序加入交互

甲骨文_0001

2017-10-11

http://img1.sycdn.imooc.com/szimg/59de203b0001c45309510428.jpg

hi, 波波老师,疑问就在上面的图片中,

我的理解是:

private void calculateNumbers(){


        for(int i = 0 ; i < N ; i ++)

            for(int j = 0 ; j < M ; j ++){


                if(mines[i][j]){

                    numbers[i][j] = -1;

                   continue;// ********这轮可以先退出******

               }

                numbers[i][j] = 0;

                for(int ii = i-1 ; ii <= i+1 ; ii ++)

                    for(int jj = j-1 ; jj <= j+1 ; jj ++)

                        if(inArea(ii, jj) && isMine(ii, jj))

                            numbers[i][j] ++;

            }


        return;

    }


写回答

1回答

liuyubobobo

2017-10-12

赞!你说得对!这里要想保证有雷的地方numbers[i][j] == -1,在第一个if判断后应该做continue。我后续会修改一下代码,谢谢你:)


事实上,在我们的扫雷应用中,由于在访问numbers[i][j]前,一定要先看一下mines[i][j]:

* 如果用户点击操作过程中,左键点击有雷的格子,游戏应该直接结束了;

* 在区域扩展的过程,不会扩展minse[i][j]为true的区域;


所以,实际上,我们的逻辑永远不会访问mines[i][j]为true的格子的numbers[i][j]的值。对于mines[i][j]为true的地方,numbers[i][j]是几都无所谓!所以这个问题没有影响我们的逻辑。


但其实,我们可以将mines这个数组和numbers这个数组合二为一。numbers[i][j] == -1表示为雷;numbers[i][j] >= 0表示没有雷,并且表示周围雷的个数。这样做的话,这个问题就会影响我们的逻辑了:)


谢谢你提出的问题。非常抱歉代码有漏洞。如果愿意可以加一下我的微信:liuyubobobo,我会发给你一个小红包:)

0
1
甲骨文_0001
非常感谢!
2017-10-12
共1条回复

7个经典应用诠释Java算法精髓

课程重应用、重实践、重思维,真正应用于实际工作开发中

1888 学习 · 112 问题

查看课程