|
#1
| |||
| |||
| [問題][java]有關踩地雷 按鍵,而次數還是一直持續增加! 目前想做的地方是,利用ARRAY和使用者輸入的同時判段是否重覆再決定 是否 s 要++ 註:紅字的地方為弟的問題(寫得很想放棄 代碼: //隨機選 10 個不重複的位置(地雷)
//可檢測任一位至周圍的地雷數
import java.util.Scanner;
import javax.swing.JOptionPane;
public class Question18B_3{
public static void main(String args[]){
//首先指定 a1為11*11的矩陣 ,0~10 共11位置
int [][] a1 = new int[7][7];
int [][] a2 = new int[7][7];
//a2 是給user 紀錄選過的 陣列
int s = 0;
Scanner scan = new Scanner(System.in);
randomMine(a1);
computeAll(a1);
arrayPos(a2,0);
//引數紀錄a2和初始值=0
int x;
int y;
do{
System.out.print("選擇一個位置 11 ~ 99 : ");
int pos = scan.nextInt();
int row = pos/10;
int column = pos%10;
a2[row][column] = 1;
/*多加一個a2[row][column] = 1;如果不加這行則顯示一個都沒按過的矩陣,
不管是否輸入數字進去;
若指定為0,則會跟最後的displayAll設定衝突到;
但我不懂為什麼要加1不加2*/
System.out.println("你選的位置是 " + pos);
int result = computeOne(a1, row, column);
if(result == -1){
System.out.println("踩到地雷了!!" );
System.out.println(displayAll(a1 , a2));
break;
}else{
System.out.println("周圍共有 " + result + " 個地雷!!");
System.out.println(displayAll(a1 , a2));
//老師多加一個引數displayAll(a1 , a2)
}
}while(++s !=14);
if(++s == 14)
System.out.println("你找到全部的地雷!!!");
/*JOptionPane.showMessageDialog(null,displayAll(a1,a2));*/
System.exit(0);
}
//判斷是否踩到地雷
public static int computeOne(int[][] mine, int x, int y){
if(x < 1 || x > 4 || y < 1 || y > 4)
return -2;
int result = 0;
if(mine[x][y] == -1)
return -1;
for(int i = -1; i<=1; i++)
for(int j = -1; j<=1; j++){
if(i!=0 || j!=0){
/*i , j 為 user 選擇的位置,
以 i 和 j 各減 1 後的位置開始計算矩陣
所以 user 選的位置不能計算
*/
if(mine[x+i][y+j] == -1)
/*[x+i][y+j],是說明 x 到 i 之間 和 y 到 j 之間
若為指定變數 -1 ,則為地雷
*/
//說明result 自動加 1 ; result++
result++;
}
}
return result;
}
//標記所有的位置
public static void computeAll(int[][] mine){
for(int i=1; i<=5; i++){
for(int j=1; j<=5; j++){
mine[i][j] = computeOne(mine, i, j);
}
}
}
//給定一個array(陣列)來紀錄 user 選過的Pos
public static void arrayPos(int [][] mine,int s){
for(int p1 = 0; p1 <= 5; p1++)
for(int p2 = 0; p2 <= 5; p2++){
mine[p1][p2] = s;
}
}
//判斷是否重覆的位置,以 s=0 來算計
public static void doubles(int a1[][],int a2[][]){
for(int i=1; i<5; i++){
for(int j=1; j<5; j++){
if(a2){
s = 0;
}
}
}
}
//隨機給定20個地雷位置
public static void randomMine(int[][] mine){
int n=0, m=0;
for(int i=0; i<2; i++){
do{
n = (int)(Math.random()*4) + 1;
m = (int)(Math.random()*4) + 1;
}while(mine[n][m] == -1);
mine[n][m] = -1;
}
}
public static String displayAll(int[][] mine , int a2[][]){
// "" 代表 空字串
String result = " \n";
char c ='○';
for(int i=1; i<5; i++){
for(int j=1; j<5; j++){
if(a2[i][j] != 0){
if(mine[i][j] == -1)
result += '●'; // ● 代表 地雷 // ● 代表 地雷
else
result += " " + mine [i][j] ;
}
else{
result += c;
}
/* result += '\n'; */
//刪掉就正常的矩陣出現
}
result += '\n';
}
return result;
}
}
|