JAVA扫雷游戏代码详解,java课程设计扫雷游戏
本文分享java实现扫雷游戏入门程序的具体代码,供大家参考。具体内容如下。
分析:
1.先铺一个10*10的闪电阵列,也就是二维阵列图,每个地方都是0。
2.在雷霆阵中随机选取10个位置设置为雷霆,雷霆用-1表示,即map[I][j]=-1;
3.数一数雷声周围的数字。有两种方法。
第一种方法是用二维数组保存所有雷的位置,然后遍历所有雷,检查雷周围的八个位置。如果值为-1,就不要做;如果值不是-1,就这样做。
二是遍历所有不打雷的地方,然后计算周围打雷的次数,就是那个位置的值。
个人认为第一种方法更好,时间复杂度更低。如果闪电阵列比较大,比如50*50,那么第二种方法明显比第一种慢很多)
另外值得注意的是,在生成雷霆所在位置的随机数时,要避免生成的随机数重复的问题。
我们标记了雷场的每一个地方,如图所示:
我们使用一维数组来存储标签索引=[0,1,2,3.97,98,99]。
那么生成的随机数的范围就是[0,100]。比如第一个随机数是22,那么这个数就是最上面图标数为22的地方,然后indexs数组中的indexs [22]保存indexs数组的最后一个数,即Indexs[22]=99;下次生成随机数时,范围将是[0,99]。此时,indexs[]数组中不会有数字22,所以不会有重复的问题。
计算雷周围位置的第一种方法的代码如下:
/* * *扫雷游戏的这种部署*/导入Java . util . random;public class Miner _ 1 { private static int[][]map;私有静态随机ran=new Random();私有静态int[]indexs;private static int[][]minePos;//用于保存所有迅雷私有静态int x=10的位置;//c表示行数私有静态int y=10//c表示列数private static int n=10//n表示迅雷公共静态void main(string[]args){ init();//初始化arrange();//calMines();//计算迅雷周围的disp();} private static void init(){ map=new int[x][y];indexs=new int[x * y];for(int I=0;I .索引.长度;I){ indexs[I]=I;} minePos=new int[n][2];} private static void arrange(){ int CNT=0;while(CNT n){ int index=creation index(indexs . length-CNT);int r=index/map[0]。长度;int c=index % map[0]。长度;map[r][c]=-1;//记录雷霆minePos[cnt][0]=r的位置;minePos[CNT][1]=c;cnt} }//该方法用于生成随机数私有静态int creat index(int right){ int index=ran . nextint(right);int value=indexs[index];indexs[index]=indexs[右-1];返回值;} Private Static Void Calmines(){//遍历每条射线for(int I=0;I mine pos . length;I){ int r=minePos[I][0];int c=minePos[I][1];//调用函数在雷霆周围寻找(int j=r-
1; j <= r + 1; j++) { for (int k = c - 1; k <= c + 1; k++) { if (checkIndex(j, k) && map[j][k] != -1) { map[j][k]++; } } } } } private static boolean checkIndex(int r, int c) { return (r >= 0 && r < map.length) && (c >= 0 && c < map[r].length); } private static void disp() { for (int i = 0; i < map.length; i++) { for (int j = 0; j < map[i].length; j++) { System.out.printf("%-3d", map[i][j]); } System.out.println(); } }}第二种遍历每一个不为雷的地方然后计算周围有多少个雷,如果没有雷,该位置就为0,如果有一个雷,该位置就+1,代码如下
import java.util.Random; /** * 扫雷算法 * @author OnTheRoad_ * */public class Miner2 { private static int[][] map; private static int[] indexs;//为雷的位置编号 private static Random ran;//随机数类,调用产生随机数 public static void main(String[] args) { init();//初始化雷阵 假设10*10 arrange();//布雷 假设为10个雷 calmine();//计算雷数 disp();//打印 } private static void init() { ran = new Random(); map = new int[10][10]; indexs = new int[100]; for (int i = 0; i < indexs.length; i++) { indexs[i] = i; } } //布雷 10个 private static void arrange() { int cnt = 0; while (cnt < 10) { int index = creatIndex(indexs.length - cnt);//生成雷序列随机数 int r = index / 10; int c = index % 10; map[r][c] = -1; cnt++; } } //此方法为生成雷位置的随机数 并且避免重复 private static int creatIndex(int right) { int index = ran.nextInt(right); int value = indexs[index]; indexs[index] = indexs[right - 1]; return value; } //遍历每一个不是雷的地方 计算周围的雷数 private static void calmine() { for (int i = 0; i < map.length; i++) { for (int j = 0; j < map[i].length; j++) { if (map[i][j] != -1) { map[i][j] = calRound(i, j); } } } } private static int calRound(int r, int c) { int cnt = 0; for (int i = r - 1; i <= r + 1; i++) { for (int j = c - 1; j <= c + 1; j++) { if (checkIndex(i, j) && map[i][j] == -1) { cnt++; } } } return cnt; } private static boolean checkIndex(int r, int c) { return (r >= 0 && r < 10) && (c >= 0 && c < 10); } private static void disp() { for (int i = 0; i < map.length; i++) { for (int j = 0; j < map[i].length; j++) { System.out.printf("%3d", map[i][j]); } System.out.println(); } }}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持盛行IT。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。