您好,登錄后才能下訂單哦!
本篇內容介紹了“java如何實現掃雷游戲程序”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
分析:
1.首先布一個10*10的雷陣,即二維數組map,每個地方都為0
2.再在雷陣中隨機選取10個位置設置為雷,雷用-1表示,即map[i][j] = -1;
3.計算雷周圍的數。這里有兩種方法。
第一種是用一個二維數組保存所有雷的位置,然后遍歷所有的雷,查看雷周圍的8個位置,如果是值-1就不做++,如果值不是-1就做++。
第二種是遍歷所有不為雷的地方,然后再計算它周圍的雷的數目,周圍的雷的數目就是該位置的值。
(個人認為第一種方法比較好一點,時間復雜度小一些。如果雷陣比較大,比如50*50,那么第二種方法明顯比第一種要慢很多)
還有一點值得注意的是,在產生雷的位置的隨機數的時候,要避免產生的隨機數產生重復的問題。
我們將雷陣的每一個地方都標號,如圖:
我們用一個一維數組來保存雷陣的每一個位置的標號indexs = [0,1,2,3.....,97,98,99].
然后產生隨機數的范圍為[0,100),例如第一次產生隨機數為22,那么這個數即為上圖標號為22的地方,然后indexs數組里的indexs[22]保存indexs數組的最后一個數即indexs[22]=99;下一次產生隨機數的時候的范圍就為[0,99),此時indexs[]數組里就沒有22這個數,也就不會有重復的問題。
第一種計算雷的周圍的位置的方法的代碼如下:
/** * 該類用于掃雷游戲的布陣 */ import java.util.Random; public class Miner_1 { private static int[][] map; private static Random ran = new Random(); private static int[] indexs; private static int[][] minePos;//用于保存所有雷的位置 private static int x = 10;//c表示行數 private static int y = 10;//c表示列數 private static int n = 10;//n表示雷數 public static 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 < indexs.length; i++) { indexs[i] = i; } minePos = new int[n][2]; } private static void arrange() { int cnt = 0; while (cnt < n) { int index = creatIndex(indexs.length - cnt); int r = index / map[0].length; int c = index % map[0].length; map[r][c] = -1; //記錄雷的位置 minePos[cnt][0] = r; minePos[cnt][1] = c; 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 calMines() { //遍歷每一個雷 for (int i = 0; i < minePos.length; i++) { int r = minePos[i][0]; int c = minePos[i][1]; //調用函數查看雷的周圍 for (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(); } } }
“java如何實現掃雷游戲程序”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。