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

📄 jmine.java.bak

📁 手机游戏 手机游戏 手机游戏 手机游戏 手机游戏
💻 BAK
字号:
/**
 * This program is written by Jerry Shen(Shen Ji Feng)
 * use the technology of SWING GUI and the OO design
 *
 * @author Jerry Shen
 * all rights reserved.
 */ 
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
import JMine.*;

class JMine extends JFrame implements MouseListener, ActionListener{
	private JMineArth mine;
	private JMineButton [][] mineButton;
    private GridBagConstraints constraints;
   	private JPanel pane;
    private GridBagLayout gridbag;
	private boolean gameStarted;
	private JCounter mineCounter;
	private JCounter timeCounter;

	private TimeCounterThread timerThread;
	public int numMine;
	public int numFlaged;

	private JMenuBar mb;
	private JMenu mGame;
	private JMenuItem miEasy;
	private JMenuItem miMiddle;
	private JMenuItem miHard;
	private JMenuItem miExit;
	private JMenu mHelp;
	private JMenuItem miAbout;
	private JPanel controlPane;
	private JButton bTest;
	
	private AboutFrame about;



	private ImageIcon [] mineNumIcon = { new ImageIcon("0.gif"), new ImageIcon("1.gif"),
					     new ImageIcon("2.gif"), new ImageIcon("3.gif"),
					     new ImageIcon("4.gif"), new ImageIcon("5.gif"),
					     new ImageIcon("6.gif"), new ImageIcon("7.gif"),
					     new ImageIcon("8.gif"), new ImageIcon("9.gif"),
					};
	private ImageIcon[] mineStatus = { new ImageIcon("0.gif"), new ImageIcon("flag.gif"), 
						new ImageIcon("question.gif") };
	private ImageIcon[] mineBombStatus = { new ImageIcon("0.gif"), new ImageIcon("mine.gif"), 
						new ImageIcon("wrongmine.gif"), new ImageIcon("bomb.gif") };
	private ImageIcon[] faceIcon = { new ImageIcon("smile.gif"), new ImageIcon("Ooo.gif")};
	
	// You lose
	private void bomb(int row, int col) {
		//System.out.println("Bomb!");
		timerThread.stop();
		
		for (int i = 0; i < 10; i++) {
			for (int j = 0; j < 10; j++) {
				mineButton[i][j].setIcon(mineBombStatus[0]);
				int toShow;
        		toShow = mine.mine[i][j]!=9? 0: 1;
				mineButton[i][j].setClickFlag(true);
 				if ( toShow == 1 && (i!=row || j!= col)) {
					mineButton[i][j].setIcon(mineBombStatus[toShow]);
					mineButton[i][j].setClickFlag(true);
				}
				else if (toShow == 1 && (i == row && j== col)) {
					mineButton[i][j].setIcon(mineBombStatus[3]);
					mineButton[i][j].setClickFlag(true);
				}
				else if (toShow == 0 && mineButton[i][j].getFlag() != 1) {
					mineButton[i][j].setEnabled(false); 
				}
				else if ( toShow == 0 && mineButton[i][j].getFlag() == 1) {
					mineButton[i][j].setIcon(mineBombStatus[2]);
					mineButton[i][j].setClickFlag(true);
				}
			}
		}
	}
	
	// check if you win() {
	private boolean isWin() {
		int minesCount=0;
		for (int i = 0; i < 10; i++) {
			for (int j=0; j <10; j++) {
				if(mine.mine[i][j]==9 && mineButton[i][j].getFlag() != 1) {
					return(false);
				}
				if(mine.mine[i][j]!=9 && mineButton[i][j].getFlag() == 1) {
					return(false);
				}
				if(mine.mine[i][j]!=9 && mineButton[i][j].getClickFlag() == false) {
					return(false);
				}				
			}
		}
		return(true);
	}
	
	// You Win
	private void win() {
		timerThread.stop();
		RestartRunner r = new RestartRunner();
		r.setMine(this);
		r.setTimer(timerThread);
		Thread t = new Thread(r);
		t.start();
		
	}
	
	// Constructor of the game 
	public JMine() {
		super("JMine Game");
		setSize(250, 350);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		Insets space = new Insets(0,0,0,0);
		
		// Game vars
		gameStarted = false;
		numMine = 12;
		numFlaged = 0;
		
		ImageIcon myIcon = new ImageIcon("0.gif");
		gridbag = new GridBagLayout();
		constraints = new GridBagConstraints();
		pane = new JPanel();
		pane.setLayout(gridbag);
		constraints.fill = GridBagConstraints.BOTH;
		constraints.anchor = GridBagConstraints.CENTER;


		// Begin Menu Set
		mb = new JMenuBar();
		mGame = new JMenu("Game");
		miEasy = new JMenuItem("Easy");
		miEasy.addActionListener(this);
		miMiddle = new JMenuItem("Middle");
		miMiddle.addActionListener(this);
		miHard = new JMenuItem("Hard");
		miHard.addActionListener(this);
		miExit = new JMenuItem("Exit");
		miExit.addActionListener(this);
		mGame.add(miEasy);
		mGame.add(miMiddle);
		mGame.add(miHard);
		mGame.addSeparator();
		mGame.add(miExit);
		mb.add(mGame);

		mHelp = new JMenu("Help");
		miAbout = new JMenuItem("About...");
		mHelp.add(miAbout);
		miAbout.addActionListener(this);
		mb.add(mHelp);
		this.setJMenuBar(mb);
		// end of Menu Set

		// Control Panel
		controlPane = new JPanel();
		bTest = new JButton(faceIcon[0]);
		bTest.setSize(26, 27);
		bTest.setMargin(space);
		bTest.addMouseListener(this);
		bTest.setPressedIcon(faceIcon[1]);
	
		mineCounter = new JCounter(numMine);
		timeCounter = new JCounter();
		controlPane.add(mineCounter);
		controlPane.add(bTest);
		controlPane.add(timeCounter);
		buildConstraints(constraints, 0, 0, 10, 2, 100, 100);
		gridbag.setConstraints(controlPane, constraints);
		pane.add(controlPane);
			
		// Bottons
		mineButton = new JMineButton[10][10];		
		for (int i=0; i <10; i++) {
			for (int j=0; j < 10; j++) {
				mineButton[i][j] = new JMineButton(i,j, myIcon);
				mineButton[i][j].addMouseListener(this);
				mineButton[i][j].setMargin(space);
				buildConstraints(constraints, j, i+3, 1, 1, 100, 100);
				gridbag.setConstraints(mineButton[i][j], constraints);
				pane.add(mineButton[i][j]);
			}
		}

		// Content Pane
		setContentPane(pane);
		setLocation(200, 150);
		setVisible(true);
		
		// About Frame
		about = new AboutFrame("JMine About");
	}
	
	// Set the GUI objects positions
	void buildConstraints(GridBagConstraints gbc, int gx, int gy, int gw, int gh, int wx, int wy) {
		gbc.gridx = gx;
		gbc.gridy = gy;
		gbc.gridwidth = gw;
		gbc.gridheight = gh;
		gbc.weightx = wx;
		gbc.weighty = wy;
	}
	
	// the methods to check if there were mines, to be nested
	void checkMine(int row, int col) {
		int i,j;
		i=row<0?0:row;
		i=i>9?9:i;
		j=col<0?0:col;
		j=j>9?9:j;
		//System.out.println("Check Mine row:"+i + ",col:" +j);
		if (mine.mine[i][j] == 9) {
			bomb(i,j);
		}
		else if (mine.mine[i][j] == 0 && mineButton[i][j].getClickFlag() == false) {
			mineButton[i][j].setClickFlag(true);
            		showLabel(i,j);
			for (int ii= i -1; ii <= i+1; ii++)
				for (int jj = j-1; jj <= j+1; jj++)
					checkMine(ii,jj);
			
		}
		else {
			showLabel(i,j);
			mineButton[i][j].setClickFlag(true);
		}
		if (isWin()) {
			win();
		}
	}

	private void clearAll(int row, int col) {
		int top,bottom, left, right, count=0;
		top=row-1>0?row-1:0;
		bottom=row+1<10?row+1:9;
		left=col-1>0?col-1:0;
		right=col+1<10?col+1:9;
		for (int i=top; i<=bottom; i++) {
			for(int j=left; j<= right; j++) {
				if (mineButton[i][j].getFlag()!=1) checkMine(i,j);
			}
		}

	}
	
	private void resetAll() {
		for (int i=0; i<10; i++) {
			for(int j=0; j< 10; j++) {
				mineButton[i][j].setFlag(0);
				mineButton[i][j].setClickFlag(false);
				mineButton[i][j].setIcon(mineStatus[0]);
				mineButton[i][j].setEnabled(true);
				mineButton[i][j].setVisible(true);
			}
		}
	}

	
	// to flag the mine you want to flag out
	void flagMine(int row, int col) {
		//System.out.println("Jerry Arrives here!");
		int i,j;
		i=row<0?0:row;
		i=i>9?9:i;
		j=col<0?0:col;
		j=j>9?9:j;
		if(mineButton[i][j].getFlag() == 0) {
			numFlaged++;
		} else if(mineButton[i][j].getFlag() == 1){
			numFlaged--;
		}
		mineCounter.resetCounter(numMine - numFlaged>=0?numMine - numFlaged:0);
		mineButton[i][j].setFlag((mineButton[i][j].getFlag() + 1) %3) ;
		showFlag(i,j);
		if (isWin()) {
			win();
		}	
	}

	// show the numbers of the nearby mines
	void showLabel(int row, int col) {
		//System.out.println("ShowLabel row:" + row + ",col:" + col);
        	int toShow;
        	toShow = mine.mine[row][col];
		if (toShow != 0) {
			mineButton[row][col].setIcon(mineNumIcon[toShow]);
			mineButton[row][col].setClickFlag(true);
			//mineButton[row][col].setEnabled(false);
		} 
		else {
			//mineButton[row][col].setIcon(mineNumIcon[0]);
			//mineButton[row][col].setClickFlag(true);
			mineButton[row][col].setEnabled(false);
		}
	}
	
	// circle the flag with blank, flaged, questioned
	void showFlag(int row, int col) {			
		mineButton[row][col].setIcon(mineStatus[mineButton[row][col].getFlag()]);
	}
	
	// the mouse events listener methods
	public void mouseEntered(MouseEvent e) {
		//System.out.println("Jerry Test");

	}
	
	// method to start the new game
	private void startNewGame(int num, int row, int col) {
		mine = new JMineArth(num, row, col);
		//mine.printMine();
		gameStarted = true;

		timerThread = new TimeCounterThread(timeCounter);
		timerThread.start(); 
	}
	
	public void setNewGame(int num) {
		resetAll();
		numMine = num;
		numFlaged = 0;
		gameStarted = false;
		mineCounter.resetCounter(numMine);
		timeCounter.resetCounter(0);	
	}

	// the event handle to deal with the mouse click
	public void mouseClicked(MouseEvent e) {
		if(e.getSource() == bTest) {
			setNewGame(numMine);
			return;
		}
		int  row,col;
		row=((JMineButton)e.getSource()).getRow();
		col=((JMineButton)e.getSource()).getCol();
		if (!gameStarted) {
			startNewGame(numMine, row, col);
		}

		if (e.getModifiers() == (InputEvent.BUTTON1_MASK+InputEvent.BUTTON3_MASK)) {
			//System.out.println("HA");
			clearAll(row, col);
		}
		if (!mineButton[row][col].getClickFlag()) {

			if (e.getModifiers() == InputEvent.BUTTON1_MASK) { 
				//System.out.println("LeftButton");
				if (mineButton[row][col].getFlag() == 1 ) { 
					return;
				}
				else {
					checkMine(row, col);
				}
			}
			else if (e.getModifiers() == InputEvent.BUTTON3_MASK){
				//System.out.println("RightButton");
				flagMine(row, col);
			} else {
				//System.out.println("MiddleButton");
			}
		}
	}
	public void mousePressed(MouseEvent e) {
		//System.out.println("Jerry Press");

	}
	public void mouseReleased(MouseEvent e) {
		//System.out.println("Jerry Release");
	}
	public void mouseExited(MouseEvent e) {
		//System.out.println("Jerry Exited");

	}
	public void actionPerformed(ActionEvent e) {
		if(e.getSource() == miEasy) {
			setNewGame(12);
			return;
		}
		if(e.getSource() == miMiddle) {
			setNewGame(24);
			return;
		}
		if(e.getSource() == miHard) {
			setNewGame(36 );
			return;
		}
		if(e.getSource() == miExit) {
			System.exit(0);
		}
		if(e.getSource() == miAbout) {
			about.setVisible(true);
		}
	}
}

class RestartRunner implements Runnable {
	private WinFrame win;
	private JMine mine;
	private boolean isMineSet;
	
	private TimeCounterThread timer;
	
	public void setMine(JMine mine) {
		this.mine = mine;
	}

	public void setTimer(TimeCounterThread timer) {
		this.timer = timer;
	}
	
	public void run() {
		isMineSet = false;
		win = new WinFrame("You win!");
		while (!this.win.getWinOk()||isMineSet) {
			//System.out.println("Not start!");
		}
		mine.numMine = win.getMineNum();
		mine.setNewGame(mine.numMine);
		timer.stop();
		win.setVisible(false);		
	}

}

class TimeCounterThread extends Thread {
	private JCounter timeCounter;

	TimeCounterThread (JCounter time) {
		timeCounter = time;
	}

	public void run() {
		while (true) {
			try {
				sleep(990);
				timeCounter.resetCounter(timeCounter.getCounterNum() +1);
				//System.out.println("zzz");
			}
			catch(InterruptedException e) {}
		}	
	}
}





⌨️ 快捷键说明

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