⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mine.java

📁 一个简单的扫雷(Java)代码,功能简单,默认10×10的格,10个雷
💻 JAVA
字号:
package com.kksoft.game.mine;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JToolBar;


public class mine extends JFrame {

	private static final long serialVersionUID = 1L;
	GamePanel game = new GamePanel();
	JToolBar toolbar = new JToolBar();
	JButton jbStart = new JButton("开局");
	JButton jb = new JButton("掀开");
	
	public static void main(String[] args) {
		new mine().launchFrame();
	}
	
	public void launchFrame() {
		jbStart.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				game.createMap();
			}
			
		});
		jb.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				game.uncoverAll();
			}
			
		});
		
		toolbar.add(jbStart);
		toolbar.add(jb);
		toolbar.setFloatable(false);
		this.add(toolbar, BorderLayout.NORTH);		
		this.add(game);
		this.setBounds(500,300,game.getWidth()+9, game.getHeight() + 66);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setTitle("扫雷");
		this.setResizable(false);
		this.setVisible(true);
	}
}

class GamePanel extends JPanel implements MouseListener {

	private static final long serialVersionUID = 1L;
	private final int STATE_FLAG=-1;//有雷啊
	private final int STATE_COVERED=0;//盖住了
	private final int STATE_UNCOVERED=1;//掀开的
	
	private final int GRID_NUM_X = 10;//横向格数
	private final int GRID_WIDTH = 40;//格子宽度
	private final int GRID_NUM_Y = 10;//纵向格数
	private final int GRID_HEIGHT = 40;//格子宽度	
	private final int MINE_NUM = 10;//地雷数
	
	private Font f = new Font("黑体", Font.BOLD, 16);
	
	private int[][] map;//-1表示有地雷,0表示无雷,其它代表八面地雷数
	private int[][] mapState;//-1表示标记有雷,0表示覆盖,1表示掀开
	public GamePanel() {
		super();
		this.setSize((GRID_NUM_X)*GRID_WIDTH, (GRID_NUM_Y)*GRID_HEIGHT);
		createMap();
		this.addMouseListener(this);
	}

	public void createMap() {
		map = new int[GRID_NUM_Y+2][GRID_NUM_X+2];
		mapState = new int[GRID_NUM_Y+2][GRID_NUM_X+2];
		Random r = new Random();
		for(int mine=0; mine<MINE_NUM;) {//布雷
			int x = r.nextInt(GRID_NUM_X);
			int y = r.nextInt(GRID_NUM_Y);
			if(map[y+1][x+1] != -1) {
				map[y+1][x+1] = -1;
				mine++;			
			}			
		}
		for(int y=1; y<=map.length-2; y++) {
			for(int x=1; x<=map[0].length-2; x++) {
				if(map[y][x] == -1) {
					if(map[y][x-1]!=-1) map[y][x-1]++;
					if(map[y-1][x-1]!=-1) map[y-1][x-1]++;
					if(map[y-1][x]!=-1) map[y-1][x]++;
					if(map[y-1][x+1]!=-1) map[y-1][x+1]++;
					if(map[y][x+1]!=-1) map[y][x+1]++;
					if(map[y+1][x+1]!=-1) map[y+1][x+1]++;
					if(map[y+1][x]!=-1) map[y+1][x]++;
					if(map[y+1][x-1]!=-1) map[y+1][x-1]++;									
				}
			}
		}

		this.repaint();
	}

	protected void paintComponent(Graphics g) {		
		super.paintComponent(g);
		for(int y=1; y<map.length-1; y++) {
			for(int x=1; x<map[0].length-1; x++) {
				Color c = g.getColor();
				drawBackGround(g,(x-1)*GRID_WIDTH,(y-1)*GRID_HEIGHT,GRID_WIDTH,GRID_HEIGHT);
				if(map[y][x]==-1) drawMine(g,(x-1)*GRID_WIDTH,(y-1)*GRID_HEIGHT,GRID_WIDTH,GRID_HEIGHT);

				if(map[y][x]!=-1 && map[y][x]!=0) {
					g.setColor(Color.RED);
					g.setFont(f);
					g.drawString(String.valueOf(map[y][x]), (x-1)*GRID_WIDTH + GRID_WIDTH/2-5, (y-1)*GRID_HEIGHT+GRID_HEIGHT/2+5);
				}					
				switch(mapState[y][x]) {
				case STATE_FLAG://标志有雷
					drawForeGround(g,(x-1)*GRID_WIDTH,(y-1)*GRID_HEIGHT,GRID_WIDTH,GRID_HEIGHT);
					drawFlag(g,(x-1)*GRID_WIDTH, (y-1)*GRID_HEIGHT, GRID_WIDTH, GRID_HEIGHT);					
					break;
				case STATE_COVERED://盖住了
					drawForeGround(g,(x-1)*GRID_WIDTH,(y-1)*GRID_HEIGHT,GRID_WIDTH,GRID_HEIGHT);
					break;
				case STATE_UNCOVERED://掀开了
					break;
				}
				g.setColor(c);
			}
		}		
	}

	public void mouseClicked(MouseEvent e) {
		int x = e.getX()/GRID_WIDTH+1;
		int y = e.getY()/GRID_HEIGHT+1;
		System.out.println("X:"+x+",Y:"+y);
		if(x>0 && x<=GRID_NUM_X && y>0 && y<=GRID_NUM_Y) {
			if(e.getButton() == MouseEvent.BUTTON1) {//按下左键
				if(mapState[y][x]==STATE_COVERED) {
					if(map[y][x]==0)uncover(x, y);
					mapState[y][x]=STATE_UNCOVERED;
				} 
				else if(mapState[y][x]==STATE_UNCOVERED) {
					mapState[y][x]=STATE_COVERED;
				}

			}
			if(e.getButton() == MouseEvent.BUTTON3) {//按下右键
				if(mapState[y][x]==STATE_FLAG) {
					mapState[y][x]=STATE_COVERED;
				} else if(mapState[y][x]==STATE_COVERED) {
					mapState[y][x]=STATE_FLAG;
				}
			}
		}
		this.repaint();
	}

	private void uncover(int x, int y) {
		if(x>0 && x <=GRID_NUM_X && y>0 && y <=GRID_NUM_Y) {
			if(map[y][x]!=-1 && mapState[y][x]==STATE_COVERED) {//无雷
				mapState[y][x]=STATE_UNCOVERED;
				System.out.println("Uncover:" + x + "," + y);
				if(map[y][x]==0) {
					uncover(x,y-1);//上
					uncover(x,y+1);//下
					uncover(x-1,y);//左
					uncover(x+1,y);//右
				}
				//uncover(x+1,y-1);//右上
				//uncover(x+1,y+1);//右下				
				//uncover(x-1,y-1);//左上				
				//uncover(x-1,y+1);//左下	
				this.repaint();
			}
		}		
	}

	public void uncoverAll() {
		for(int i=0; i<mapState.length; i++) {
			for(int j=0; j<mapState[0].length; j++) {
				mapState[i][j] = 1;
			}
		}
		this.repaint();
	}
	public void mouseEntered(MouseEvent e) {}
	public void mouseExited(MouseEvent e) {}
	public void mousePressed(MouseEvent e) {}
	public void mouseReleased(MouseEvent e) {}

	/**
	 * 画标志
	 * @param g 画笔
	 * @param x 左上角X坐标
	 * @param y 左上角Y坐标
	 * @param width 宽度
	 * @param height 高度
	 */
	private void drawFlag(Graphics g, int x, int y, int width, int height) {
		Color c = g.getColor();
		x+=5;
		y+=7;
		width-=10;
		height-=14;
		
		g.setColor(Color.BLACK);
		g.fillRect(x+width/2-1, y, 2, height-8);//画旗杆
		int[] xPoints = {x+width/2-2,x+width/2+2,x+width,x};
		int[] yPoints = {y+height-8,y+height-8,y+height,y+height};		
		g.fillPolygon(xPoints, yPoints, xPoints.length);//画旗座
		
		g.setColor(Color.RED);
		xPoints = new int[]{x+width/2+1,x+width/2+1,x+width};
		yPoints = new int[]{y,y+(height-8)/2,y+(height-8)/2};
		g.fillPolygon(xPoints, yPoints, xPoints.length);//画棋子
		
		g.setColor(c);
	}
	/**
	 * 画地雷
	 * @param g 画笔
	 * @param x 左上角X坐标
	 * @param y 左上角Y坐标
	 * @param width 宽度
	 * @param height 高度
	 */
	private void drawMine(Graphics g, int x, int y, int width, int height) {
		Color c = g.getColor();
		x+=6;
		y+=6;
		width-=12;
		height-=12;
		
		g.setColor(Color.BLACK);
		g.fillOval(x, y, width, height);
		g.setColor(Color.WHITE);
		g.fillOval(x+width/4, y+height/4, width/4, height/4);
		
		g.setColor(c);
	}
	/**
	 * 画后台
	 * @param g 画笔
	 * @param x 左上角X坐标
	 * @param y 左上角Y坐标
	 * @param width 宽度
	 * @param height 高度
	 */
	private void drawBackGround(Graphics g, int x, int y, int width, int height) {
		final int BORDER_WIDTH=1;
		final int BORDER_HEIGHT=1;
		Color c = g.getColor();
		
		g.setColor(Color.GRAY);
		g.fillRect(x, y, width, height);
		
		g.setColor(Color.LIGHT_GRAY);
		g.fillRect(x+BORDER_WIDTH, y+BORDER_HEIGHT, width-2*BORDER_WIDTH, height-2*BORDER_HEIGHT);		
		
		g.setColor(c);
	}
	/**
	 * 画前台
	 * @param g 画笔
	 * @param x 左上角X坐标
	 * @param y 左上角Y坐标
	 * @param width 宽度
	 * @param height 高度
	 */
	private void drawForeGround(Graphics g, int x, int y, int width, int height) {
		final int BORDER_WIDTH=2;
		final int BORDER_HEIGHT=2;
		Color c = g.getColor();		

		int[] xPoints = {x,x,x+BORDER_WIDTH,x+BORDER_WIDTH,x+width-BORDER_WIDTH,x+width};
		int[] yPoints = {y,y+height,y+height-BORDER_HEIGHT,y+BORDER_HEIGHT,y+BORDER_HEIGHT,y};
		g.setColor(Color.WHITE);
		g.fillPolygon(xPoints, yPoints, xPoints.length);
		
		g.setColor(Color.LIGHT_GRAY);
		g.fillRect(x+5, y+5, width-10, height-10);
		
		xPoints = new int[]{x+width,x+width,x,x+BORDER_WIDTH,x+width-BORDER_WIDTH,x+width-BORDER_WIDTH};
		yPoints = new int[]{y,y+height,y+height,y+height-BORDER_HEIGHT,y+height-BORDER_HEIGHT,y+BORDER_HEIGHT};
		g.setColor(Color.GRAY);
		g.fillPolygon(xPoints, yPoints, xPoints.length);
		
		g.setColor(c);
	}
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -