/*用来生成地雷的的类*/
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设为常量。
下面是运行时的截图:
小感慨一下,终于知道如何贴代码了!