package main;
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
/**
* 此版本是测试版本,其下出现中文的命名方法还请包含
* @author Eric
*
*/
public class sl extends KeyAdapter implements Runnable, MouseListener,MouseMotionListener,ActionListener {
//常量定义
private final int mineAreaX=12;//雷区的起始X坐标。
private final int mineAreaY=55;//雷区的起始Y坐标。
private final boolean[] negative=new boolean[]{false,false,false,false,false,false,true};//表达"-"的数组,用于剩余雷数板和逝去时间板的显示
private final boolean[] num0=new boolean[]{true,true,true,true,true,true,false};//表达"0"的数组
private final boolean[] num1=new boolean[]{false,false,true,true,false,false,false};
private final boolean[] num2=new boolean[]{false,true,true,false,true,true,true};
private final boolean[] num3=new boolean[]{false,true,true,true,true,false,true};
private final boolean[] num4=new boolean[]{true,false,true,true,false,false,true};
private final boolean[] num5=new boolean[]{true,true,false,true,true,false,true};
private final boolean[] num6=new boolean[]{true,true,false,true,true,true,true};
private final boolean[] num7=new boolean[]{false,true,true,true,false,false,false};
private final boolean[] num8=new boolean[]{true,true,true,true,true,true,true};
private final boolean[] num9=new boolean[]{true,true,true,true,true,false,true};
//用户变量定义
private int high = 16;//雷区行数
private int wide = 30;//雷区列数
private int mineCount = 99;//雷数(不大于high x wide)
//系统变量定义
private int[][] nums = new int[wide][high];//0:空白;1~8:数字;9:雷
private int[][] boards = new int[wide][high];//0:没板;1:有板 2:旗板 3:问号板
private int[][] wrongMine= new int[wide][high];//错误雷矩阵:1:红雷 2:X雷
private boolean[][] exploredMarker = new boolean[wide][high];//防止扩散无限递归 true:该点已经被探测过
private int mouseX = 0;//鼠标事件的X坐标,相对与窗口左上角。
private int mouseY = 0;//鼠标事件的Y坐标,相对与窗口左上角。
private int currentX;//当前点击雷块的坐标X
private int currentY;//当前点击雷块的坐标Y
private int faceKind=1;//主按钮显示的笑脸样式: 1:笑 2:哭 (失败)3:惊讶(鼠标左键按下) 4:牛(胜利)
private int tempFaceKind=1;//左击主按钮时将按钮当前笑脸类型赋予tempFaceKind,以便鼠标拖拽按钮出按钮边界时还原当前笑脸。
private int mineCountOfRemaining=mineCount;//剩余雷数(实际雷数-旗数)
private int elapsedTime=0;//游戏逝去时间
private boolean isStart =false;//游戏是否开始
private boolean isOutOfContrl = false;//true:失去鼠标对雷区控制以及对表情的控制 false:不失去控制
private boolean isPress=false;//true:主按钮(笑脸按钮)按下 false:主按钮抬起
private boolean needCheckFirstCilck = true;//true:需要检测第一左击是否点的是雷 false:不需要检测
private boolean mouseLeftIsDown=false;//鼠标左键按下状态 true:按下
private boolean mouseRightIsDown=false;//鼠标右键按下状态 true:按下
private boolean mouseLeftCanDrag=true;//左键是否可以拖拽(模仿windows扫雷双键抬起后左键无法拖拽)
private boolean mouseLeftCanReleased=true;//左键是否可以点击(模仿windows扫雷双键抬起后左键无法点击)
private Thread timerThread;//时间进程
private JFrame frame;
private JMenuBar menuBar = null;
private JMenu gameMenu = null;
private JMenu helpMenu = null;
private JMenuItem startItem = null;
private JMenuItem chuItem = null;
private JMenuItem zhongItem = null;
private JMenuItem gaoItem = null;
private JMenuItem ziItem = null;
private JMenuItem exitItem = null;
private JMenuItem aboutItem = null;
sl() {//构造方法
initMine();//初始化雷
initNumber();//初始化数字
initBoard();//初始化盖板
frame = new JFrame();//初始化界面及菜单
frame.getContentPane().add(new Screen());
frame.addKeyListener(this);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane = frame.getContentPane();
contentPane.addMouseListener(this);
contentPane.addMouseMotionListener(this);
menuBar = new JMenuBar();
gameMenu = new JMenu("睿睿游戏");
helpMenu =new JMenu("GL帮助");
startItem = new JMenuItem("开局");
startItem.addActionListener(this);
chuItem = new JMenuItem("初级");
chuItem.addActionListener(this);
zhongItem = new JMenuItem("中级");
zhongItem.addActionListener(this);
gaoItem = new JMenuItem("高级");
gaoItem.addActionListener(this);
ziItem = new JMenuItem("自定义");
ziItem.addActionListener(this);
exitItem = new JMenuItem("退出");
exitItem.addActionListener(this);
aboutItem = new JMenuItem("关于扫雷");
aboutItem.addActionListener(this);
gameMenu.add(startItem);
gameMenu.addSeparator();
gameMenu.add(chuItem);
gameMenu.add(zhongItem);
gameMenu.add(gaoItem);
gameMenu.add(ziItem);
gameMenu.addSeparator();
gameMenu.add(exitItem);
helpMenu.add(aboutItem);
menuBar.add(gameMenu);
menuBar.add(helpMenu);
frame.setResizable(false);
frame.setJMenuBar(menuBar);
frame.setTitle("GL扫雷");//窗口标题
frame.setSize(mineAreaX + wide * 16 + 5 * 2+4, mineAreaY + high * 16 + 5 * 2+ 55);//界面大小
frame.setVisible(true);
frame.repaint();//重新绘制界面
}
/**
* 事件:鼠标按下
* @param 鼠标事件
* 睿睿
* */
public void mousePressed(MouseEvent e) {
mouseX = e.getX();
mouseY = e.getY();
getCurrent(mouseX,mouseY);
if (e.getButton() == MouseEvent.BUTTON1 ){//如果是左键
mouseLeftIsDown=true;//左键按下标识=true
if(isOutOfContrl==false){//如果用户没有失去控制(失去控制:失败/胜利)
faceKind=3;//那么主按钮显示惊讶脸
}
if(mouseInMainButtonArea()){//如果在笑脸按钮区域
isPress=true;//主按钮按下
faceKind=1;//主按钮显示笑脸
}
if(mouseLeftCanReleased==false){
mouseLeftCanReleased=true;
}
}else if (e.getButton() == MouseEvent.BUTTON3) {// 鼠标右键
mouseRightIsDown=true;//右键按下标识=true
if (mouseInMineArea()&&isOutOfContrl == false&&mouseLeftIsDown==false) {
if (boards[currentX][currentY] == 1) {//如果是普通板
boards[currentX][currentY] = 2;//那么变旗板
mineCountOfRemaining--;//没有探测的雷数减一
} else if (boards[currentX][currentY] == 2) {//如果是旗板
boards[currentX][currentY] = 3;//那么变问号板
mineCountOfRemaining++;//没有探测的雷数加一
} else if (boards[currentX][currentY] == 3) {//如果是问号板
boards[currentX][currentY] = 1;//那么变变普通板
}
}
}
frame.repaint();//重新绘制图像
}
/**
* 事件:鼠标松开
* @param 鼠标事件
* */
public void mouseReleased(MouseEvent e) {
mouseX = e.getX();
mouseY = e.getY();
if (e.getButton() == MouseEvent.BUTTON1 ){//如果是左键
mouseLeftIsDown=false;//左键按下标识=false
if(isOutOfContrl==false){//如果没有失去控制(失去控制:失败/胜利)
faceKind=1;//主按钮显示笑脸
}
if(mouseInMainButtonArea()&&faceKind==1&&isPress==true){//如果在主钮区域并且脸在笑
isPress=false;//抬起主按钮
rePlay();//重新开始游戏
}
if(mouseInMineArea()&&isOutOfContrl == false){//如果鼠标在雷区域并且没有失去控制
getCurrent(mouseX,mouseY);
if(mouseRightIsDown==true){//如果右键是按下的则判定为双键一齐点击
doubleClick();//双键一齐点击方法
}else {
if(mouseLeftCanReleased==true){
leftClick();
mouseLeftCanDrag=true;
}else{
mouseLeftCanDrag=true;
}
}
}
}else if (e.getButton() == MouseEvent.BUTTON3) {// 鼠标右键
mouseRightIsDown=false;//右键松开后设置mouseRightDown为false
if(mouseInMineArea()&&isOutOfContrl == false){//如果鼠标处于雷区域并且没有失去控制
getCurrent(m
java扫雷(javaSE实现扫雷)
4星 · 超过85%的资源 需积分: 9 42 浏览量
2010-06-04
10:21:49
上传
评论 1
收藏 26KB RAR 举报
noel0307
- 粉丝: 12
- 资源: 38