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

📄 sweepminebuttoneventlistener.java

📁 Java版拼图游戏
💻 JAVA
字号:
/*
 * @(#)SweepMineButtonEventListener.java 1.0 03/08/22
 * Copyright 2003 Entao Zhang, All rights reserved.
 */

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

/**
 * 扫雷的事件处理类.
 */
public class SweepMineButtonEventListener extends
		ComponentsEventListener implements MouseListener,ActionListener{
	private Timer doneDelay=new Timer(200,this);
	private int loc,swap;
	//bothButton标识双键按下而未释放时时间段.
	private boolean bothButton=false;
	private SweepMineButtonManager cm;
	public SweepMineButtonEventListener(ImageRevertUnitPane ir,
				SweepMineButtonManager cm){
		super(ir);
		this.cm=cm;
	}

	public void addListener(Component c){
		c.addMouseListener(this);
	}
	
	/**
     * 如果处于bothButton状态,则判断是否左键被释放掉,如已被释放掉,则取消
     * bothButton状态,并把进入bothButton状态时按下的grids复原.
     *
     * 如果释放的仅是左键并不处于bothButton状态,并且未播开并未标记则调用
     * 播开处理方法.
     */
	public void mouseReleased(MouseEvent e){
		if (ir.isConfused()){
			JButton source=(JButton)e.getSource();
			loc=Integer.parseInt(source.getName());
			if (bothButton){
				if ((e.getModifiersEx() & InputEvent.BUTTON1_DOWN_MASK) !=
						InputEvent.BUTTON1_DOWN_MASK){
					boolean around[]=cm.checkAround(loc);
					if (cm.button[loc].getText()==cm.str[0] && 
								ir.grids[loc]!=cm.OPENED)
						cm.componentStateChange(loc,true);
					for (int i=0; i<around.length; i++){
						if(around[i]){
							swap=loc+cm.aroundOffset[i];
							if (cm.button[swap].getText()==cm.str[0] && 
										ir.grids[swap]!=cm.OPENED)
								cm.componentStateChange(swap,true);
						}
					}
					bothButton=false;
				}
			}else if (e.getButton()==MouseEvent.BUTTON1){
				if(ir.grids[loc]!=cm.OPENED && source.getText()!=cm.strFlag){
					cm.chainOpen(loc);
					if (cm.sum+cm.num==ir.gridLength) {
						doneDelay.start();
					}
				}
			}
		}
	}
	
	/**
     * 鼠标同时按下左右键或中键则把周围没有播开并没有标记为雷的grids按下.
     * 如果点的是被播开的grids并且其数字和周围已标记为雷的grids数量相等,
     * 则把周围未播开的都播开,否则标记bothButton等待释放.
     *
     * 如果按下的只是右键,并未播开则调用mainPane管理类的标记方法.
     */
	public void mousePressed(MouseEvent e){
		if (ir.isConfused()){
			loc=Integer.parseInt(((JButton)e.getSource()).getName());
			if ((e.getModifiersEx() & (InputEvent.BUTTON1_DOWN_MASK |
					InputEvent.BUTTON3_DOWN_MASK))==(InputEvent.BUTTON1_DOWN_MASK
					| InputEvent.BUTTON3_DOWN_MASK)
					||e.getButton()==MouseEvent.BUTTON2){
				String locText=cm.button[loc].getText();
				boolean opened=ir.grids[loc]==cm.OPENED && locText!=cm.str[0];
				boolean around[]=cm.checkAround(loc);
				int flagSum=0;
				if(ir.grids[loc]!=cm.OPENED && locText!=cm.strFlag)
					cm.componentStateChange(loc,false);
				for (int i=0; i<around.length; i++){
					if(around[i]){
						swap=loc+cm.aroundOffset[i];
						if(opened){
							if (cm.button[swap].getText()==cm.strFlag) flagSum++;
						}
						if(ir.grids[swap]!=cm.OPENED && cm.button[swap].getText()
									!=cm.strFlag)
							cm.componentStateChange(swap,false);
					}
				}
				if (String.valueOf(flagSum).equals(locText)){
					for (int i=0; i<around.length; i++){
						if(around[i]){
							swap=loc+cm.aroundOffset[i];
							if (ir.grids[swap]!=cm.OPENED && 
										cm.button[swap].getText()
								!=cm.strFlag) cm.chainOpen(swap);
						}
					}
					if (cm.sum+cm.num==ir.gridLength) {
						doneDelay.start();
					}
				}else bothButton=true;
			}else if (e.getButton()==MouseEvent.BUTTON3){
				if(ir.grids[loc]!=cm.OPENED){
					cm.markButton(loc);
				}
			}
		}
	}
	
	public void mouseExited(MouseEvent e){
	};
	public void mouseEntered(MouseEvent e){
	};
	public void mouseClicked(MouseEvent e){
	};
	
	//处理完成并结束过程.把所有未标记grids标记出来.
	public void actionPerformed(ActionEvent e){
		doneDelay.stop();
		cm.timer.stop();
		for (int i=0; i<ir.gridLength; i++){
			if(ir.grids[i]==cm.MINE && cm.button[i].getText()!=cm.strFlag){
				cm.button[i].setForeground(cm.strFlagColor);
				cm.button[i].setText(cm.strFlag);
			}
		}
		ir.done();
	}
}

⌨️ 快捷键说明

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