下文代码只是对扫雷游戏的核心类做了具体实现,并没有对具体UI做具体实现。
扫雷游戏的的具体规则在这里就不赘述了。
注:有雷的地方这里用-1表示。没有雷的地方,如果周围有雷,使用周围的雷的数量表示,如果周围没雷这里用100表示(这个可以根据具体实现更换)。
雷区类
class Minefield{
public static final int HAS_MINE = -1;
private int row;
private int column;
private int mineCount;
protected int[] minefield;
public Minefield(int row, int column, int mineCount) {
if(row < 2)
throw new IllegalArgumentException();
this.row = row;
if(column < 1)
throw new IllegalArgumentException();
this.column = column;
if(mineCount >= row * column)
throw new IllegalArgumentException();
this.mineCount = mineCount;
this.minefield = new int[row * column];
this.createMinefield();
}
public int getRow() {
return row;
}
public int getColumn() {
return column;
}
public int getMineCount() {
return mineCount;
}
private void injection(int index){
if(HAS_MINE == this.minefield[index])
this.injection((index + 1) % (this.minefield.length));//防止数组越界
else
this.minefield[index] = HAS_MINE;
}
/**
* 埋雷
*/
protected void spiderMines(){
Random random = new Random();
for(int i = 0; i < this.mineCount ; i++)
this.injection(random.nextInt(this.minefield.length));
}
/**
* 设置没雷的地方显示的数字
*/
protected void setNum(){
for (int i = 0; i < this.row; i++){
for(int j = 0; j < this.column ; j++){
//如果此地无雷
if(HAS_MINE != this.minefield[i * this.column + j]){
int num = 0;
//上一行
if(i - 1 >= 0){
if(j - 1 >= 0 && HAS_MINE == this.minefield[(i - 1) * this.column + j - 1])
num++;
if(HAS_MINE == this.minefield[(i - 1) * this.column + j])
num++;
if(j + 1 < this.column && HAS_MINE == this.minefield[(i - 1) * this.column + j + 1])
num++;
}
//本行
if(j - 1 >= 0 && HAS_MINE == this.minefield[i * this.column + j - 1])
num++;
if(j + 1 < this.column && HAS_MINE == this.minefield[i * this.column + j + 1])
num++;
//下一行
if(i + 1 < this.row){
if(j - 1 >= 0 && HAS_MINE == this.minefield[(i + 1) * this.column + j - 1])
num++;
if(HAS_MINE == this.minefield[(i + 1) * this.column + j])
num++;
if(j + 1 < this.column && HAS_MINE == this.minefield[(i + 1) * this.column + j + 1])
num++;
}
this.minefield[i * this.column + j] = num;
}
}
}
}
/**
* 创建雷区
*/
protected void createMinefield(){
Arrays.fill(minefield, 0);
this.spiderMines();
this.setNum();
}
/**
* 被挖掘,如果挖到雷返回true 反之返回false
* @param rowNum
* @param columnNum
* @return
*/
public boolean dig(int rowNum ,int columnNum){
if(Minefield.HAS_MINE == this.minefield[rowNum * this.getRow() + columnNum]){
return true;
}else{
digNull(rowNum, columnNum);
return false;
}
}
/**
* 挖空周围没有雷的区域
* @param rowNum
* @param columnNum
*/
protected void digNull(int rowNum , int columnNum){
if(rowNum >=0 && rowNum < this.row && columnNum >=0 && columnNum < this.column && 0 == minefield[rowNum * this.row + columnNum] && 100 != minefield[rowNum * this.row + columnNum]){
minefield[this.row * rowNum + columnNum] = 100;
//向下
digNull(rowNum - 1, columnNum);
//向上
digNull(rowNum + 1, columnNum);
//向左
digNull(rowNum, columnNum - 1);
//向右
digNull(rowNum, columnNum + 1);
}
}
public String toString(){
StringBuilder sb = new StringBuilder();
for(int i = 0; i < this.minefield.length; i++){
sb.append(String.format("%1$-3d ", this.minefield[i]));
if((i + 1) % this.column == 0)
sb.append("\n");
}
return sb.toString();
}
}
雷区点击动作调用雷区实例的具体方法
class ButtonListener{
public static void onButtonClick(Minefield minefield,int rowNum ,int columnNum){
if(minefield.dig(rowNum, columnNum)){
System.out.println("你输了");
}
}
}