package com.sf.minesweeper.listener;
import java.awt.event.InputEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JOptionPane;
import com.sf.minesweeper.bean.MineLabel;
import com.sf.minesweeper.dialog.Win;
import com.sf.minesweeper.frame.SartFrame;
import com.sf.minesweeper.panel.MineField;
import com.sf.minesweeper.tools.Tools;
public class MouseListener extends MouseAdapter {
/**
* 标记雷区点击次数,第一次游戏开始
*/
private int mousePressedCount; // 鼠标点击的次数
private int expendedCount; //雷块展开的数量
// MineField mineField;
SartFrame sartframe;
boolean isDouble ;
int temp = Tools.totalMine;// 临时雷数
boolean isStart;// 游戏是否开始
public MouseListener(SartFrame sartframe) {
this.sartframe = sartframe;
}
public void mousePressed(MouseEvent arg0) {
MineLabel mineLabel = (MineLabel) arg0.getSource();
int d = arg0.getModifiersEx(); // 返回此事件的修饰符掩码
int d1 = arg0.getModifiers();
// 获取当前点击的雷块和其行列索引
int rowIndex = mineLabel.getRowIndex();
int colIndex = mineLabel.getColIndex();
// 记录雷区点击次数
mousePressedCount++;
// 如果是第一次点击雷区,则开始布雷
if (mousePressedCount == 1) {
sartframe.getMineField().buildMine(rowIndex, colIndex);
}
// .............................1双键按下.............................
if (d == InputEvent.BUTTON1_DOWN_MASK + InputEvent.BUTTON3_DOWN_MASK) {
// 1 周围图片切换
for (int x = Math.max(rowIndex - 1, 0); x <= Math.min(rowIndex + 1,
Tools.totalx - 1); x++) {
for (int y = Math.max(colIndex - 1, 0); y <= Math.min(
colIndex + 1, Tools.totaly - 1); y++) {
mineLabel = sartframe.getMineField().getMineLabel()[x][y];
if (!mineLabel.isExpanded() && !mineLabel.isFlag())
mineLabel.setIcon(Tools.mineCount[0]);
}
}
// 2 表情变惊讶
sartframe.getMineState().getNewGame().setIcon(Tools.iiface2);
// 3 记录双键点击标志
isDouble = true;
// ..............................2右键按下 且雷块未展开....................................
} else if (d1 == InputEvent.BUTTON3_MASK && !mineLabel.isExpanded()) {
// 右键点击次数
int clickCount = mineLabel.getRightClickCount();
clickCount++;
// 第一次,雷块>>>旗子
if (clickCount == 1) {
mineLabel.setIcon(Tools.iiflag);
mineLabel.setRightClickCount(clickCount);
mineLabel.setFlag(true);
temp--;
sartframe.getMineState().setTotalMineG(temp);
}
// 第二次,旗子>>>问号
if (clickCount == 2) {
mineLabel.setIcon(Tools.iiask0);
mineLabel.setRightClickCount(clickCount);
mineLabel.setFlag(false);
temp++;
sartframe.getMineState().setTotalMineG(temp);
}
// 第三次,问号>>>雷块
if (clickCount == 3) {
mineLabel.setIcon(Tools.iiblank);
mineLabel.setRightClickCount(0);
}
// **************************3左键按下************************************
} else if (d1 == InputEvent.BUTTON1_MASK) {
// 未展开且不是旗子(图片陷进去)
if (!mineLabel.isExpanded() && !mineLabel.isFlag()) {
// 问号
if (mineLabel.getRightClickCount() == 2) {
mineLabel.setIcon(Tools.iiask1);
// 雷块
} else {
mineLabel.setIcon(Tools.mineCount[0]);
}
// 表情>>惊讶
sartframe.getMineState().getNewGame().setIcon(Tools.iiface2);
}
if (mineLabel.isExpanded()) {
sartframe.getMineState().getNewGame().setIcon(Tools.iiface0);
}
}
}
/**
* 鼠标释放
*/
public void mouseReleased(MouseEvent arg0) {
MineLabel mineLabel = (MineLabel) arg0.getSource();
int rowIndex = mineLabel.getRowIndex();
int colIndex = mineLabel.getColIndex();
int i = arg0.getModifiers();
// ***************双键释放*********************************
if (isDouble) {
// 2 表情惊讶还原
sartframe.getMineState().getNewGame().setIcon(Tools.iiface0);
doubleReleased(rowIndex, colIndex, mineLabel.getMineCount());
isDouble = false;
isMind();
// ***************左键释放********************************
} else if (i == InputEvent.BUTTON1_MASK) {
if (!mineLabel.isExpanded() && !mineLabel.isFlag()) {
/**
* 鼠标第一次点击雷区时计时器开始计时
*/
if (!sartframe.isStart()) {
sartframe.getTimer().start();
sartframe.setStart(true); // 游戏开始
}
// 踩到雷,展开所有雷
if (mineLabel.isMine() && !mineLabel.isFlag()) {
openMine(rowIndex, colIndex);
/**
* 踩到雷时计时器停止计时,游戏结束,
*/
sartframe.getMineState().getNewGame()
.setIcon(Tools.iiface3);
sartframe.getTimer().stop();
sartframe.setStart(false);
// 没有踩到雷,展开安全雷区
} else {
sartframe.getMineState().getNewGame()
.setIcon(Tools.iiface0);
open(rowIndex, colIndex);
isMind();
}
} else if (mineLabel.isExpanded()) {
sartframe.getMineState().getNewGame().setIcon(Tools.iiface0);
}
}
}
public void doubleReleased(int rowIndex, int colIndex, int count) {
/**
* flagBeside 周围8个位置的旗子数
*
*/
int flagBeside = 0;
for (int x = Math.max(rowIndex - 1, 0); x <= Math.min(rowIndex + 1,
Tools.totalx - 1); x++) {
for (int y = Math.max(colIndex - 1, 0); y <= Math.min(colIndex + 1,
Tools.totaly - 1); y++) {
if (sartframe.getMineField().getMineLabel()[x][y].isFlag()) {
flagBeside++;
}
}
}
// 1 当前雷块未展开或者旗子数与数字不相等,图片还原
if (!sartframe.getMineField().getMineLabel()[rowIndex][colIndex]
.isExpanded()
|| sartframe.getMineField().getMineLabel()[rowIndex][colIndex]
.getMineCount() != flagBeside) {
doublePressedBeside(rowIndex, colIndex, 2);
}
// 2 已经展开且周围雷数和旗子相等,判断周围8个方向是否有踩到雷(是雷,但没有旗子)
if (sartframe.getMineField().getMineLabel()[rowIndex][colIndex]
.isExpanded()
&& sartframe.getMineField().getMineLabel()[rowIndex][colIndex]
.getMineCount() == flagBeside) {
boolean isBobm = false;
for (int x = Math.max(rowIndex - 1, 0); x <= Math.min(rowIndex + 1,
Tools.totalx - 1); x++) {
for (int y = Math.max(colIndex - 1, 0); y <= Math.min(
colIndex + 1, Tools.totaly - 1); y++) {
if (sartframe.getMineField().getMineLabel()[x][y].isMine()
&& !sartframe.getMineField().getMineLabel()[x][y]
.isFlag()) {
isBobm = true;
break;
} else if (!sartframe.getMineField().getMineLabel()[x][y]
.isExpanded()) {
open(x, y);
}
}
}
// 踩到雷
if (isBobm) {
openMine(rowIndex, colIndex);
}
}
}
public void doublePressedBeside(int rowIndex, int colIndex, int doubleType) {
doublePressed(rowIndex, colIndex, doubleType);
for (int x = Math.max(rowIndex - 1, 0); x <= Math.min(rowIndex + 1,
Tools.totalx - 1); x++) {
for (int y = Math.max(colIndex - 1, 0); y <= Math.min(colIndex + 1,
Tools.totaly - 1); y++) {
doublePressed(x, y, doubleType);
}
}
}
public void doublePressed(int i, int j, int doubleType) {
MineLabel minelabel = sartframe.getMineField().getMineLabel()[i][j];
if (!minelabel.isExpanded() && !minelabel.isFlag()) {
if (doubleType == 1) {
if (minelabel.getRightClickCount() == 2) {
minelabel.setIcon(Tools.iiask1);
} else {
minelabel.setIcon(Tools.mineCount[0]);
}
} else {
if (minelabel.getRightClickCount() == 2) {
minelabel.setIcon(Tools.iiask0);
} else {
minelabel.setIcon(Tools.iiblank);
}
}
}
}
public void openMine(int i, int j) {
for (int m = 0; m < Tools.totalx; m++) {
for (int n = 0; n < Tools.totaly; n++) {
MineLabel mineLabel = sartframe.getMineField().getMineLabel()[m][n];
//是雷的情况 且�
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
MineSweeper.rar (88个子文件)
MineSweeper
.project 387B
src
com
sf
minesweeper
dialog
About.java 3KB
Win.java 2KB
ShowWin.java 5KB
panel
MineState.java 3KB
MineField.java 4KB
menu
MineMenu.java 3KB
frame
SartFrame.java 4KB
timer
Timers.java 826B
tools
Tools.java 4KB
listener
MineMenuListener.java 2KB
MouseMotionListener.java 1KB
MouseListener.java 10KB
bean
Own.java 842B
MineLabel.java 2KB
.settings
org.eclipse.jdt.core.prefs 629B
image
start.jpg 135KB
face3.gif 189B
flag.gif 895B
face1.gif 171B
blood.gif 887B
mine3.gif 887B
mine2.gif 887B
face2.gif 200B
ask2.gif 873B
4.gif 879B
alarm1.wav 176KB
ask.gif 892B
blank.gif 873B
d8.gif 887B
ask1.gif 873B
3.gif 877B
d3.gif 893B
6.gif 877B
mine1.gif 905B
face4.gif 196B
d9.gif 895B
2.gif 878B
face8.gif 904B
d4.gif 897B
d2.gif 897B
7.gif 873B
d1.gif 890B
5.gif 872B
start.png 200KB
face6.gif 898B
face0.gif 188B
nine_flase.png 71KB
0.gif 855B
1.gif 872B
d10.gif 883B
icon.gif 1KB
d6.gif 893B
ask0.gif 892B
face9.gif 910B
mine.gif 887B
d7.gif 893B
hole.gif 92B
face5.gif 196B
8.gif 872B
d5.gif 893B
mine0.gif 887B
d0.gif 893B
face7.gif 911B
error.gif 905B
.classpath 301B
bin
com
sf
minesweeper
dialog
ShowWin$HeroListener.class 2KB
About.class 2KB
About$1.class 2KB
Win$1.class 1KB
About$2.class 737B
Win.class 2KB
ShowWin.class 6KB
panel
MineField.class 3KB
MineState$1.class 1KB
MineState.class 4KB
menu
MineMenu$2.class 803B
MineMenu$3.class 2KB
MineMenu.class 2KB
MineMenu$1.class 1KB
frame
SartFrame.class 4KB
timer
Timers.class 1KB
tools
Tools.class 4KB
listener
MineMenuListener.class 2KB
MouseMotionListener.class 1KB
MouseListener.class 6KB
bean
Own.class 1KB
MineLabel.class 2KB
共 88 条
- 1
资源评论
赤瞳寓言
- 粉丝: 56
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功