📄 mine.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 + -