JAVA小游戏之扫雷的源代码

老师讲的扫雷小游戏,因为基础还不扎实,所以还写不出扫雷游戏,大家可以看看尝试去写写。

————————————————————————————————————
//测试类
package com.titan.test;

import java.util.Scanner;

import com.titan.core.Game;

public class Test1 {
	public static void main(String[] args) {
		 //获得游戏核心类的对象
		 Game g=new Game();
		 //调用添加格子对象的方法3
		 g.addGrid();
		 //布雷方法调用
		 g.setMine();
		 //添加雷数的调用
		 g.setNumber();
		 
		 Scanner s=new Scanner(System.in);
		 g.paint();
		 while(true){
			 System.out.println("请输入X坐标");
			 int x=s.nextInt();
			 System.out.println("请输入Y坐标");
			 int y=s.nextInt();
			 g.stamp(x, y);
			 //调用绘制界面的方法
			 g.paint();
		 }		 
	}
}
————————————————————————————————————
//游戏核心类
package com.titan.core;

import java.awt.Point;
import java.util.Random;

import com.titan.bean.Grid;

/**
 * 游戏核心类
 * @author Administrator
 * 雷区(游戏界面)
 */
public class Game {
	
	//定义一个存放格子对象的二维数组
	Grid[][] grid=new Grid[9][9];
	
	//定义一个存放雷数的属性
	int count=10;
	//定义一个随机数工具的属性
	Random r=new Random();
	
	//添加格子对象到二维数组中
	public void addGrid(){
		//通过循环的方式来为二维数组中添加格子对象
		for(int i=0;i<grid.length;i++){
			for(int j=0;j<grid[i].length;j++){
				//将二维数组中的每个格子上赋值格子对象
				grid[i][j]=new Grid();
				//设置内容
				grid[i][j].setContent(' ');
				//设置状态
				grid[i][j].setState(false);
				//设置坐标
				grid[i][j].setPoint(new Point(i,j));
			}
		}
	}
	
	
	//创建一个绘制游戏界面的方法
	public void paint(){
		for(int i=0;i<grid.length;i++){
			for(int j=0;j<grid[i].length;j++){
				if(grid[i][j].isState()){
					System.out.print(grid[i][j].getContent()+" ");
				}else{
					System.out.print("■ ");
				}
			}
			System.out.println();
		}
	}
	
	//添加一个布雷的方法
	public void setMine(){
		int i=0;
		//通过循环的方式来获得10个格子对象
		do{
			//获得一个随机的行坐标
			int x=r.nextInt(9); 
			//获得一个随机的列坐标
			int y=r.nextInt(9);
			//判断当前随机位置的格子内容是否是雷,如果不是就布雷
			if(grid[x][y].getContent()!='*'){
				//获得当前坐标位置的格子对象
				grid[x][y].setContent('*');
				i++;
			}
		}while(i<count);
	}
	
	
	//获得当前坐标位置的8个方向坐标对象
	public Point[] getPoint(int x,int y){
		//创建一个坐标数组
		Point[] point=new Point[8];
		//为左边的位置赋值坐标
		point[0]=new Point(x-1,y);
		//为左上的位置赋值坐标
		point[1]=new Point(x-1,y-1);
		//为上面的位置赋值坐标
		point[2]=new Point(x,y-1);
		//为右上的位置赋值坐标
		point[3]=new Point(x+1,y-1);
		//为右边的位置赋值坐标
		point[4]=new Point(x+1,y);
		//为右下的位置赋值坐标
		point[5]=new Point(x+1,y+1);
		//为下面的位置赋值坐标
		point[6]=new Point(x,y+1);
		//为左下的位置赋值坐标
		point[7]=new Point(x-1,y+1);
		return point;
	}
	
	
	//雷数字添加
	public void setNumber(){
		//遍历所有的格子对象
		for(int i=0;i<grid.length;i++){
			for(int j=0;j<grid[i].length;j++){
				
				//定义统计当前位置方向中雷数的计数器
				int sum=0;
				
				//判断是否当前位置是雷,如果是雷就进入下一个坐标
				if(grid[i][j].getContent()=='*'){
					//结束当前的循环,进入下一次循环
					continue;
				}else{
					
					//进入当前位置的8个方向的扫描
					Point[] point=getPoint(i, j);
					//通过循环遍历来获得当前坐标的方向对象
					for(int k=0;k<point.length;k++){
						//定义一个坐标对象来获得当前循环到的坐标
						Point p=point[k];
						if(p.x>=0 && p.y>=0 && p.x<9 && p.y<9){
							//判断当前有效范围内的格子是否是雷
							if(grid[p.x][p.y].getContent()=='*'){
								sum++;
							}
						}
					}
				}
				
				//判断雷数的计数器是否发生改变,如果改变就将值填充到
				//当前坐标的格子当中
				if(sum>0){
					grid[i][j].setContent((char)(48+sum));
				}
			}
		}
	}
	
	
	//踩雷
	public void stamp(int x,int y){
		//判断当前位置是否存在雷
		if(grid[x][y].getContent()=='*'){
			System.out.println("游戏结束");
		}else{
			//将当前的格子内容状态改成已打开
			grid[x][y].setState(true);
			//判断当前的格子内容必须是空格的时候才执行辐射
			if(grid[x][y].getContent()==' '){
				//获得当前格子的8个方向坐标对象
				Point[] point=getPoint(x,y);
				//循环遍历获得每个方向的对象
				for(int k=0;k<point.length;k++){
					Point p=point[k];
					//判断当前坐标对象是否越界
					if(p.x>=0 && p.y>=0 && p.x<9 && p.y<9){
						//判断当前方向的格子内容是否为空格,如果为空格
						//就执行辐射操作  --递归调用
						if(grid[p.x][p.y].getContent()==' ' 
									&& grid[p.x][p.y].isState()==false){
							stamp(p.x,p.y);
						}else if(grid[p.x][p.y].getContent()!=' '){
							//如果当前位置为数字就将数字显示出来
							grid[p.x][p.y].setState(true);
						}
					}
				}
			}
		}
	}
}
————————————————————————————————————
//格子类
package com.titan.bean;

import java.awt.Point;

/**
 * 格子类
 * @author Administrator
 * 格子的内容、格子的状态、格子的坐标
 */
public class Grid {
	//格子内容
	char content;
	//格子状态
	boolean state;
	//格子的坐标
	Point point;
	public char getContent() {
		return content;
	}
	public void setContent(char content) {
		this.content = content;
	}
	public boolean isState() {
		return state;
	}
	public void setState(boolean state) {
		this.state = state;
	}
	public Point getPoint() {
		return point;
	}
	public void setPoint(Point point) {
		this.point = point;
	} 
}





  • 14
    点赞
  • 113
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是简单的 Java 扫雷小游戏源代码: ``` import java.util.Random; import java.util.Scanner; public class Minesweeper { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); Random random = new Random(); int rows, columns, bombs; System.out.print("Enter number of rows: "); rows = scanner.nextInt(); System.out.print("Enter number of columns: "); columns = scanner.nextInt(); System.out.print("Enter number of bombs: "); bombs = scanner.nextInt(); boolean[][] board = new boolean[rows][columns]; int[][] counts = new int[rows][columns]; // randomly place bombs for (int i = 0; i < bombs; i++) { int row, column; do { row = random.nextInt(rows); column = random.nextInt(columns); } while (board[row][column]); board[row][column] = true; for (int dr = -1; dr <= 1; dr++) { for (int dc = -1; dc <= 1; dc++) { if (dr != 0 || dc != 0) { int r = row + dr; int c = column + dc; if (r >= 0 && r < rows && c >= 0 && c < columns) { counts[r][c]++; } } } } } boolean[][] revealed = new boolean[rows][columns]; int remaining = rows * columns - bombs; while (remaining > 0) { // print the board for (int c = 0; c < columns; c++) { System.out.print(" " + c); } System.out.println(); for (int r = 0; r < rows; r++) { System.out.print(r); for (int c = 0; c < columns; c++) { if (revealed[r][c]) { if (board[r][c]) { System.out.print("* "); } else { System.out.print(counts[r][c] + " "); } } else { System.out.print(". "); } } System.out.println(); } // ask for the next move int row, column; do { System.out.print("Enter row and column: "); row = scanner.nextInt(); column = scanner.nextInt(); } while (row < 0 || row >= rows || column < 0 || column >= columns || revealed[row][column]); revealed[row][column] = true; remaining--; // handle the move if (board[row][column]) { System.out.println("Boom! Game over."); break; } else if (counts[row][column] == 0) { // reveal all neighbors for (int dr = -1; dr <= 1; dr++) { for (int dc = -1; dc <= 1; dc++) { if (dr != 0 || dc != 0) { int r = row + dr; int c = column + dc; if (r >= 0 && r < rows && c >= 0 && c < columns && !revealed[r][c]) { revealed[r][c] = true; remaining--; } } } } } } if (remaining == 0) { System.out.println("Congratulations! You win!"); } scanner.close(); } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值