Javascript 扫雷艇展开算法

Javascript 扫雷艇展开算法,javascript,algorithm,Javascript,Algorithm,我用JavaScript制作了一个简单的扫雷游戏,它工作得很好,只是当我点击一个没有地雷的大区域的中间时,它不能清除整个区域,只有我点击的位置 已经有其他问题了,但是我检查生成数字的方式(我相信)是不同的,因此应该针对它制定更具体的解决方案,而不是改变代码,使其看起来更像其他人所做的 下面是一张更好地解释这种情况的图片(带有实际代码中未显示的其他颜色): 蓝色是用户单击的位置,然后它应该检查垂直和水平位置(深绿色),如果这些位置周围有0个要扩展的地雷(绿色),直到地雷(橙色)足够靠近的边界(黄

我用JavaScript制作了一个简单的扫雷游戏,它工作得很好,只是当我点击一个没有地雷的大区域的中间时,它不能清除整个区域,只有我点击的位置

已经有其他问题了,但是我检查生成数字的方式(我相信)是不同的,因此应该针对它制定更具体的解决方案,而不是改变代码,使其看起来更像其他人所做的

下面是一张更好地解释这种情况的图片(带有实际代码中未显示的其他颜色):

蓝色是用户单击的位置,然后它应该检查垂直和水平位置(深绿色),如果这些位置周围有0个要扩展的地雷(绿色),直到地雷(橙色)足够靠近的边界(黄色)

我试图使代码可读且易于理解:

(函数(){
var mineswipper=document.createElement('div');
var头寸=[];
var=true;
随机函数(最小值、最大值){
返回Math.floor(Math.random()*(max-min+1)+min);
}
函数结束(){
this.onclick=null;
如果(玩){
玩=假;
this.style.backgroundColor='rgb(255,0,0)';
警报(“游戏结束”);
}
}
函数更新(){
this.onclick=null;
如果(玩){
this.style.backgroundColor='rgb(02550)';
this.className='safe';
设地雷=0;
让element=this.previousElementSibling;
if(元素){
如果(element.className='mine'&&this.style.top==element.style.top)挖掘++;
for(设i=0;i<8;i++){
element=element.previousElementSibling;
如果(!元素)中断;
}
if(元素){
如果(element.className=='mine'&&this.style.top!=element.style.top)挖掘++;
element=element.previousElementSibling;
if(元素){
如果(element.className=='mine')挖掘++;
element=element.previousElementSibling;
if(元素)
如果(element.className=='mine'&(parseInt(this.style.top)-parseInt(element.style.top))==9)mines++;
}
}
}
元素=this.nextElementSibling;
if(元素){
如果(element.className='mine'&&this.style.top==element.style.top)挖掘++;
for(设i=0;i<8;i++){
element=element.nextElementSibling;
如果(!元素)中断;
}
if(元素){
如果(element.className=='mine'&&this.style.top!=element.style.top)挖掘++;
element=element.nextElementSibling;
if(元素){
如果(element.className=='mine')挖掘++;
element=element.nextElementSibling;
if(元素)
如果(element.className=='mine'&(parseInt(element.style.top)-parseInt(this.style.top))==9)mines++;
}
}
}
this.innerText=地雷;
if(扫雷舰查询选择器所有('div.safe')。长度==90){
玩=假;
警惕(“胜利”);
}
}
}
扫雷舰.style.backgroundColor='rgb(0,0,0)';
扫雷舰.style.fontSize='7vmin';
扫雷舰.style.textAlign='center';
扫雷舰.style.userSelect='none';
扫雷舰.style.position='绝对';
扫雷舰.style.left='calc(50vw-45.5vmin)';
扫雷舰.style.top=‘计算(50vh-45.5vmin)’;
扫雷舰.style.width='91vmin';
扫雷舰.style.height='91vmin';
for(设i=0;i<10;i++){
for(设j=0;j<10;j++){
常数n=i*10+j;
位置[n]=document.createElement('div');
位置[n].style.backgroundColor='rgb(255,255,255)';
位置[n].style.position='absolute';
位置[n].style.left=(j*8+j+1)+'vmin';
位置[n].style.top=(i*8+i+1)+'vmin';
位置[n].style.width='8vmin';
位置[n].style.height='8vmin';
扫雷舰.附加装置(位置[n]);
}
}
for(设i=0;i<11;i++){
const empty=扫雷舰.queryselectoral('div:not(.mine');
如果(i==10){
对于(设j=0;j<90;j++){
空[j]。onclick=update;
}
打破
}
常数n=随机(0,(空。长度-1));
空[n]。类名称='mine';
空[n]。onclick=end;
}
document.body.style.margin='0px';
文件.正文.附件(扫雷舰);

})();干得好!我挂了半个小时来测试这个游戏:)

要清除单击位置周围的区域(如果此位置周围有0个地雷),可以递归调用其所有邻居的
update
函数

我稍微修改了你的代码:创建了所有非地雷邻居的
negihbors
数组,并为每个邻居调用了
update.call(neighbor)

(函数(){
var mineswipper=document.createElement('div');
var头寸=[];
var=true;
随机函数(最小值、最大值){
返回Math.floor(Math.random()*(max-min+1)+min);
}
函数结束(){
this.onclick=null;
如果(玩){
玩=假;
常数水雷=扫雷艇查询选择器所有(“水雷分区”);
对于(让矿山中的矿山)mine.style.backgroundColor='rgb(255,0,0)';
警报(“游戏结束”);
}
}
函数更新(){
this.onclick=null;
if(播放&&!this.className.length){
this.style.backgroundColor='rgb(02550)';
this.className='safe';
让邻居=[];
设地雷=0;
让element=this.previousElementSibling;
if(元素){
if(this.style.top==element.style.top){
如果(element.className=='mine')挖掘++;
否则嘶鸣