/*用來生成地雷的的類*/
public class Mine
{
//雷區的長和寬及雷的個數
final int width = 5;
final int height = 4;
final int mine_num = 6;
//爲了生成雷區方便
int[][] mine= new int[height+2][width+2];
public void createMine()
{
int num = 0;
int[] x = new int[mine_num];
int[] y = new int[mine_num];
//用於判斷是否重複
boolean mark = true;
while(num<mine_num)
{
x[num] = (int)(Math.random()*height+1);
y[num] = (int)(Math.random()*width+1);
mark = true;
for(int i=0;i<num;i++)
{
if(x[num]==x[i]&&y[num]==y[i])
mark = false;
}
if(mark)
num++;
}
//佈雷
for(int i=0;i<mine_num;i++)
{
mine[x[i]][y[i]] = -1;
}
}
public void initMine()
{
int mine_around = 0;
for(int i=1;i<=height;i++)
{
for(int j=1;j<=width;j++)
{
if(mine[i][j]!=-1)
{
//掃描周圍的地雷的個數
for(int k=i-1;k<=i+1;k++)
for(int l=j-1;l<=j+1;l++)
if(mine[k][l]==-1)
mine_around++;
mine[i][j]=mine_around;
mine_around = 0;
}
}
}
}
}
/*用來測試的類*/
public class test
{
public static void main(String[] args)
{
Mine m = new Mine();
m.createMine();
m.initMine();
for(int i=0;i<=m.height+1;i++)
{
for(int j=0;j<=m.width+1;j++)
{
if(m.mine[i][j]!=-1)
System.out.print(" "+m.mine[i][j]+" ");
else
System.out.print(m.mine[i][j]+" ");
}
System.out.println("");
}
}
}
並未自己寫生成隨機數的算法,而是利用了Java中的java.lang.Math.random()的靜態方法。
該方法返回一個[0,1)範圍內的的double數。
1)我們用一個二維數組mine[height+2][width+2]來表示地雷(初始化每一項爲0),其中假定值爲-1的項爲地雷。且假定有count個地雷;
2)我們利用生成的隨機數對(x,y),將其限制在mine[1,1]到mine[height,width]之間;
3)循環判斷,生成count個不重複的隨機數對;
4)在mine[][]中把隨機數對作爲地址標記出來;
5)掃描數組,將非-1且mine[1,1]到mine[height,width]間的項周圍的地雷數存到該項中。
當然了,如果想要玩家可以自定義地雷個數及地雷區的長寬的話,不用將mine_num,width,height設爲常量。
下面是運行時的截圖:
小感慨一下,終於知道如何貼代碼了!