java如何实现扫雷游戏程序(java,开发技术)

时间:2024-04-30 23:43:48 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

分析:

1.首先布一个10*10的雷阵,即二维数组map,每个地方都为0

2.再在雷阵中随机选取10个位置设置为雷,雷用-1表示,即map[i][j] = -1;

3.计算雷周围的数。这里有两种方法。

第一种是用一个二维数组保存所有雷的位置,然后遍历所有的雷,查看雷周围的8个位置,如果是值-1就不做++,如果值不是-1就做++。

第二种是遍历所有不为雷的地方,然后再计算它周围的雷的数目,周围的雷的数目就是该位置的值。

(个人认为第一种方法比较好一点,时间复杂度小一些。如果雷阵比较大,比如50*50,那么第二种方法明显比第一种要慢很多)

还有一点值得注意的是,在产生雷的位置的随机数的时候,要避免产生的随机数产生重复的问题。

我们将雷阵的每一个地方都标号,如图:

java如何实现扫雷游戏程序

我们用一个一维数组来保存雷阵的每一个位置的标号indexs = [0,1,2,3.....,97,98,99].

然后产生随机数的范围为[0,100),例如第一次产生随机数为22,那么这个数即为上图标号为22的地方,然后indexs数组里的indexs[22]保存indexs数组的最后一个数即indexs[22]=99;下一次产生随机数的时候的范围就为[0,99),此时indexs[]数组里就没有22这个数,也就不会有重复的问题。

第一种计算雷的周围的位置的方法的代码如下:

/***该类用于扫雷游戏的布阵*/importjava.util.Random;publicclassMiner_1{privatestaticint[][]map;privatestaticRandomran=newRandom();privatestaticint[]indexs;privatestaticint[][]minePos;//用于保存所有雷的位置privatestaticintx=10;//c表示行数privatestaticinty=10;//c表示列数privatestaticintn=10;//n表示雷数publicstaticvoidmain(String[]args){init();//初始化arrange();//布雷calMines();//计算雷周围disp();}privatestaticvoidinit(){map=newint[x][y];indexs=newint[x*y];for(inti=0;i<indexs.length;i++){indexs[i]=i;}minePos=newint[n][2];}privatestaticvoidarrange(){intcnt=0;while(cnt<n){intindex=creatIndex(indexs.length-cnt);intr=index/map[0].length;intc=index%map[0].length;map[r][c]=-1;//记录雷的位置minePos[cnt][0]=r;minePos[cnt][1]=c;cnt++;}}//该方法用于产生雷位置的随机数privatestaticintcreatIndex(intright){intindex=ran.nextInt(right);intvalue=indexs[index];indexs[index]=indexs[right-1];returnvalue;}privatestaticvoidcalMines(){//遍历每一个雷for(inti=0;i<minePos.length;i++){intr=minePos[i][0];intc=minePos[i][1];//调用函数查看雷的周围for(intj=r-1;j<=r+1;j++){for(intk=c-1;k<=c+1;k++){if(checkIndex(j,k)&&map[j][k]!=-1){map[j][k]++;}}}}}privatestaticbooleancheckIndex(intr,intc){return(r>=0&&r<map.length)&&(c>=0&&c<map[r].length);}privatestaticvoiddisp(){for(inti=0;i<map.length;i++){for(intj=0;j<map[i].length;j++){System.out.printf("%-3d",map[i][j]);}System.out.println();}}}

第二种遍历每一个不为雷的地方然后计算周围有多少个雷,如果没有雷,该位置就为0,如果有一个雷,该位置就+1,代码如下

importjava.util.Random;/***扫雷算法*@authorOnTheRoad_**/publicclassMiner2{privatestaticint[][]map;privatestaticint[]indexs;//为雷的位置编号privatestaticRandomran;//随机数类,调用产生随机数publicstaticvoidmain(String[]args){init();//初始化雷阵假设10*10arrange();//布雷假设为10个雷calmine();//计算雷数disp();//打印}privatestaticvoidinit(){ran=newRandom();map=newint[10][10];indexs=newint[100];for(inti=0;i<indexs.length;i++){indexs[i]=i;}}//布雷10个privatestaticvoidarrange(){intcnt=0;while(cnt<10){intindex=creatIndex(indexs.length-cnt);//生成雷序列随机数intr=index/10;intc=index%10;map[r][c]=-1;cnt++;}}//此方法为生成雷位置的随机数并且避免重复privatestaticintcreatIndex(intright){intindex=ran.nextInt(right);intvalue=indexs[index];indexs[index]=indexs[right-1];returnvalue;}//遍历每一个不是雷的地方计算周围的雷数privatestaticvoidcalmine(){for(inti=0;i<map.length;i++){for(intj=0;j<map[i].length;j++){if(map[i][j]!=-1){map[i][j]=calRound(i,j);}}}}privatestaticintcalRound(intr,intc){intcnt=0;for(inti=r-1;i<=r+1;i++){for(intj=c-1;j<=c+1;j++){if(checkIndex(i,j)&&map[i][j]==-1){cnt++;}}}returncnt;}privatestaticbooleancheckIndex(intr,intc){return(r>=0&&r<10)&&(c>=0&&c<10);}privatestaticvoiddisp(){for(inti=0;i<map.length;i++){for(intj=0;j<map[i].length;j++){System.out.printf("%3d",map[i][j]);}System.out.println();}}}
 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:java如何实现扫雷游戏程序的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:Qt中怎么使用PaintEvent绘制实时波形图下一篇:

12 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18