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

📄 mainframe.java

📁 Java扫雷游戏
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
package nicholas.game.mine;

import java.awt.*;
import java.awt.event.*;
import java.io.*;

import javax.swing.*;

import nicholas.awt.LedNumber;
import nicholas.swing.AboutDialog;

public class MainFrame extends JFrame implements ActionListener {
	
	//UI components	
	private JLabel mineLabel;
	private JLabel timeLabel;
	private JLabel statusButton;
	private JPanel gridPanel;
	private JPanel statusPanel;
	
	private Dimension gpd;
	private Dimension spd;
	private MineGrid grid[][];
	private boolean mode[][];
	
	private final int margin = 7;
	private final int titleh = 52;
	
	private int xBound;
	private int yBound;
	private int mineCount;
	private int showCount;		//the amount of grids opened
	private int leftCount;		//the amount of mines not labeled
	private int timepassed;
	private boolean firstClick;
	private boolean markCheck;
	
	//Menu Components
	private JMenuItem startItem;
	private JMenuItem exitItem;
	private JMenuItem logItem;
	private JMenuItem aboutItem;
	private JRadioButtonMenuItem levelItem[];
	private JCheckBoxMenuItem markCheckItem;
		
	//Game informations
	private LevelInfo levelInfo;
	private int currentLevel;
	private LevelLog log[];
	
	private LedNumber led;
	
	private GridMouseAdapter gma;
	private StatusMouseAdapter sma;
	private TimeThread timeThread;
	
	public MainFrame() {
		
		super("扫雷");
		
		//default
		currentLevel = 0;
		levelInfo = LevelInfo.DEFAULT_LEVEL[currentLevel];
		
		log = new LevelLog[3];
		for(int i=0;i<3;i++)
			log[i] = new LevelLog();
		
		//read from file
		readLog();
		
		led = new LedNumber();
			
		gma = new GridMouseAdapter();
		sma = new StatusMouseAdapter();
		
		//setup menus
		setMenuBar();
		
		setStatusPanel();
		resetPane();
		
		addWindowListener(
			new WindowAdapter() {
				public void windowClosing(WindowEvent e) {
					writeLog();
					System.exit(0);
				}
			}
		);
		
		setIconImage(ImageFactory.getInstance().getImageicon(16).getImage());
		setResizable(false);
	}
	
	//execution application
	public static void main(String args[]) {
		MainFrame application = new MainFrame();
		try {
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
		} catch(Exception e) {}
	}
	
	//file operation
	private void readLog() {
		try {
			File logFile = new File("mine.log");
			if(!logFile.exists()) return;
			ObjectInputStream ois = new ObjectInputStream(new FileInputStream(logFile));
			for(int i=0;i<3;i++) {
				log[i] = (LevelLog)ois.readObject();
			}
			markCheck = ois.readBoolean();
			currentLevel = ois.readInt();
			if(currentLevel==3) {
				levelInfo = (LevelInfo)ois.readObject();
			} else {
				levelInfo = LevelInfo.DEFAULT_LEVEL[currentLevel];
			}
			ois.close();
		} catch (Exception e) {System.out.println("read fail");}
	}
	
	private void writeLog() {
		try {
			File logFile = new File("mine.log");
			ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(logFile));
			for(int i=0;i<3;i++) {
				oos.writeObject(log[i]);
			}
			oos.writeBoolean(markCheck);
			oos.writeInt(currentLevel);
			if(currentLevel==3) {
				oos.writeObject(levelInfo);
			}
			oos.close();
		} catch (Exception e) {System.out.println("write fail");}
	}
	
	/*
	 *add status label to status panel
	 */
	private void setStatusPanel() {
		
		JPanel temp;
		statusPanel = new JPanel(new BorderLayout());
		
		mineLabel = new JLabel();
		mineLabel.setBorder(BorderFactory.createLoweredBevelBorder());
		temp = new JPanel(new FlowLayout(1,4,4));
		temp.add(mineLabel);
		temp.setBackground(Color.LIGHT_GRAY);
		statusPanel.add(temp,BorderLayout.WEST);
		
		timeLabel = new JLabel();
        timeLabel.setBorder(BorderFactory.createLoweredBevelBorder());
		temp = new JPanel(new FlowLayout(1,4,4));
		temp.add(timeLabel);
		temp.setBackground(Color.LIGHT_GRAY);
		statusPanel.add(temp,BorderLayout.EAST);
        
        statusButton = new JLabel();
		statusButton.setBorder(BorderFactory.createRaisedBevelBorder());
		statusButton.addMouseListener(sma);
		temp = new JPanel(new FlowLayout(1,0,4));
		temp.setBackground(Color.LIGHT_GRAY);
		temp.add(statusButton);
		statusPanel.add(temp,BorderLayout.CENTER);
		
		statusPanel.setSize(10,37);
		statusPanel.setBorder(BorderFactory.createLoweredBevelBorder());
		
		spd = statusPanel.getSize();
	}
	
	private void resetStatusPanel() {
		mineLabel.setIcon(new ImageIcon(led.getLedImage(leftCount,3)));
		timeLabel.setIcon(new ImageIcon(led.getLedImage(timepassed,3)));
		statusButton.setIcon(ImageFactory.getInstance().getImageicon(17));
	}

	private void setGridPanel() {
		
		xBound = levelInfo.getXBound();
		yBound = levelInfo.getYBound();
		mineCount = levelInfo.getMineCount();
		MineGrid.xBound = this.xBound;
		MineGrid.yBound = this.yBound;
		grid = new MineGrid[xBound][yBound];
		mode = new boolean[xBound][yBound];
		
		gridPanel = new JPanel();
		gridPanel.setBackground(Color.GRAY);
		//initialize grid panel
		gridPanel.setLayout(null);
		
		for(int x = 0; x < xBound; x++) {
			for(int y =0; y < yBound; y++) {
				grid[x][y] = new MineGrid(x,y);
				grid[x][y].setIcon(ImageFactory.getInstance().getImageicon(9));
				grid[x][y].setBounds(1+y*MineGrid.SIZE,x*MineGrid.SIZE,MineGrid.SIZE,MineGrid.SIZE);
				grid[x][y].addMouseListener(gma);
				gridPanel.add(grid[x][y],null);
			}
		}
		gpd = new Dimension(yBound*MineGrid.SIZE+6, xBound*MineGrid.SIZE+6);
	}//end of set grid panel
	
	private void resetGridPanel() {
		
		leftCount = 0;
		int x,y,i,j;
		boolean temp;
		for(x = 0; x < xBound; x++) {
			for(y =0; y < yBound; y++) {
				grid[x][y].setIcon(ImageFactory.getInstance().getImageicon(9));
				grid[x][y].setStatus(MineGrid.NORMAL);
				//lay mines
				if(leftCount < mineCount) {
					mode[x][y] = true;
					leftCount++;
				} else {
					mode[x][y] = false;
				}
			}
		}
		//exchange
		showCount = leftCount;
		for(x = 0; x < xBound; x++) {
			for(y =0; y < yBound; y++) {
				if(showCount==0) break;
				i = (int)(Math.random()*xBound);
				j = (int)(Math.random()*yBound);
				temp = mode[x][y];
				mode[x][y] = mode[i][j];
				mode[i][j] = temp;
				showCount--;
			}
		}
	}
	
	/*
	 *set up menu bar
	 */
	private void setMenuBar() {
		
        JMenuBar menuBar = new JMenuBar();
        menuBar.setBorder(BorderFactory.createLineBorder(Color.WHITE, 2));
        
        JMenu gameMenu = new JMenu("游戏(G)");
        JMenu helpMenu = new JMenu("帮助(H)");
        gameMenu.setMnemonic('G');
        helpMenu.setMnemonic('H');
        
        startItem = new JMenuItem("开局(N)");
		startItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F2,0));
        logItem = new JMenuItem("扫雷英雄榜(T)...");
        markCheckItem = new JCheckBoxMenuItem("标记(?)(M)");
        exitItem = new JMenuItem("退出(X)");
        aboutItem = new JMenuItem("关于扫雷(A)...");
        startItem.setMnemonic('N');
        exitItem.setMnemonic('X');
        aboutItem.setMnemonic('A');
		aboutItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1,0));
        logItem.setMnemonic('T');
        markCheckItem.setMnemonic('M');
        markCheckItem.setSelected(markCheck);
        
        gameMenu.add(startItem);
        gameMenu.addSeparator();
        
        //radio group
        levelItem = new JRadioButtonMenuItem[4];
        ButtonGroup levelGroup = new ButtonGroup();
        levelItem[0] = new JRadioButtonMenuItem("初级(B)");
        levelItem[1] = new JRadioButtonMenuItem("中级(I)");
        levelItem[2] = new JRadioButtonMenuItem("高级(E)");
        levelItem[3] = new JRadioButtonMenuItem("自定义(C)...");
        levelItem[0].setMnemonic('B');
        levelItem[1].setMnemonic('I');
        levelItem[2].setMnemonic('E');
        levelItem[3].setMnemonic('C');
        for(int i=0;i<4;i++) {
	        levelGroup.add(levelItem[i]);
	        levelItem[i].addActionListener(this);
			gameMenu.add(levelItem[i]);
        }
        levelItem[currentLevel].setSelected(true);
        
        gameMenu.addSeparator();
        gameMenu.add(markCheckItem);
        gameMenu.addSeparator();
        gameMenu.add(logItem);
        gameMenu.addSeparator();
        gameMenu.add(exitItem);
        
        helpMenu.add(aboutItem);
        
        startItem.addActionListener(this);
        markCheckItem.addActionListener(this);
        logItem.addActionListener(this);
        exitItem.addActionListener(this);
        aboutItem.addActionListener(this);
        
        menuBar.add(gameMenu);
        menuBar.add(helpMenu);
        setJMenuBar(menuBar);
	}
	
	private void showAboutDialog() {
		String readme = "";
		File file = new File("readme.txt");
		if(file.exists()) {
			try {
				BufferedReader input = new BufferedReader(new FileReader(file));
				StringBuffer buffer = new StringBuffer();
				String text;
				while((text = input.readLine())!=null)
					buffer.append(text+"\n");
				input.close();
				readme = buffer.toString();
			} catch(IOException ioException) {}
		}
		AboutDialog dialog = new AboutDialog(this, "扫雷",readme,
		ImageFactory.getInstance().getImageicon(14),
		ImageFactory.getInstance().getImageicon(16));
		dialog = null;
	}
	
	public void actionPerformed(ActionEvent ae) {
		
		if(ae.getSource()==startItem) {
			restartGame();
		} else if(ae.getSource()==markCheckItem) {
			markCheck = markCheckItem.isSelected();
		} else if(ae.getSource()==logItem) {
			//show heros
			LogDialog dialog = new LogDialog(this, log);
			dialog = null;
		} else if(ae.getSource()==exitItem) {
			writeLog();
			System.exit(0);
		} else if(ae.getSource()==aboutItem) {
			showAboutDialog();
		} else {
			//radio buttons
			int x;
			for(x = 0; x < 3; x++) {
				if(ae.getSource()==levelItem[x]) break;
			}
			if(x < 3) {
				if(currentLevel!=x) {
					currentLevel = x;
					levelInfo = LevelInfo.DEFAULT_LEVEL[currentLevel];
					resetPane();
				}
			} else {
				LevelInfo newLevel = CustomDialog.getUserLevel(this, levelInfo);
				if(newLevel!=null) {
					currentLevel = x;
					levelInfo = newLevel;
					resetPane();
				}
				levelItem[currentLevel].setSelected(true);
			}
		}//radio buttons
	}

⌨️ 快捷键说明

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