Java扫雷游戏实现参考

下文代码只是对扫雷游戏的核心类做了具体实现,并没有对具体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("你输了");
		}
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值