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

📄 gamepanel.java

📁 扫雷游戏实现
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/*
 * GamePanel.java
 *
 * Created on 2007年8月21日, 上午11:39
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package minegame;

/**
 *
 * @author linda
 */


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

public class GamePanel extends JComponent implements ActionListener, MouseListener {
    
    private FieldCell[][] cells;
    
    public static final Color ACTIVE_COLOR = Color.blue.darker();
    public static final Color VICTORY_COLOR = Color.green.darker();
    public static final Color OVER_COLOR = Color.red.darker();
    
    private JButton newButton;
    private JLabel statusLabel1, statusLabel2;
    private JPanel statusBar,panel;
    private ConfigDialog cdialog;
    private JFrame frame;
    
    private JMenuBar mainMenu;
    private JMenu gameMenu, helpMenu; 
    private JMenuItem setting ,newGame,  topHelp, aboutGame,exit;
    private JTextArea help; 
    private JScrollPane scrollHelp;
    
    private int mineNum;
    private int r, c;
    private int w, h;
    private int flagNum, revealNum, totalNum;
    
    private static boolean gameActive ;
    
    public GamePanel() {
        statusBar = new JPanel(); //状态条面板
        panel = new JPanel();     //菜单面板
        panel.setLayout(new BorderLayout());
        statusBar.setLayout(new FlowLayout(FlowLayout.CENTER));
        //this指的是当前类,getClass转成Class类型,为了运用Class类的getResource方法。
        //getResource方法返回URL类型,一些类的构造方法需要URL类型的参数。例如ImageIcon
        ImageIcon img = new ImageIcon(this.getClass().getResource("icon.gif"));//状态条按钮图标
        newButton = new JButton(img);    //状态条按钮
        newButton.setPreferredSize(new Dimension(23, 23));
        statusLabel1 = new JLabel();//显示游戏信息
        statusLabel2 = new JLabel();//显示地雷数
        statusBar.add(statusLabel1);
        statusBar.add(newButton);
        newButton.addActionListener(this); 
        statusBar.add(statusLabel2);    
        
        mainMenu = new JMenuBar(); 
        gameMenu = new JMenu("游戏(G)"); //“游戏”菜单
        helpMenu = new JMenu("帮助(H)"); //“帮助”菜单
        
        //“游戏”菜单的菜单项
        newGame = new JMenuItem("新游戏(N)");      
        setting = new JMenuItem("设定(S)");
        exit = new JMenuItem("退出(X)");
        gameMenu.add(newGame);
        newGame.addActionListener(this);
        gameMenu.add(setting);
        setting.addActionListener(this);
        gameMenu.addSeparator();//cut line
        gameMenu.add(exit);
        exit.addActionListener(this);
        
        //“帮助”菜单的菜单项
        topHelp = new JMenuItem("帮助(H)");
        aboutGame = new JMenuItem("关于扫雷(A)");        
        help = new JTextArea(5, 20);
        scrollHelp = new JScrollPane(help); 
        help.setEditable(false); 
        help.append("1.扫雷概述\n"); 
        help.append("   扫雷游戏的目标是尽快找到雷区中的所有地雷,而不许踩到地雷。\n"); 
        help.append("   如果挖开的是地雷,您将输掉游戏。\n");        
        help.append("2.扫雷玩法\n"); 
        help.append("   在游戏菜单上,单击“新游戏”。\n"); 
        help.append("   通过单击即可挖开方块。如果挖开的是地雷,则您输掉游戏。\n"); 
        help.append("   如果方块上出现数字,则表示在其周围的八个方块中共有多少颗地雷。\n"); 
        help.append("   要标记您认为可能有地雷的方块,请右键单击它。\n"); 
        help.append("   如果无法判定某方块是否有雷,请用右键单击两次给它标记一个问号。\n"); 
        help.append("3.游戏设定\n"); 
        help.append("   在“游戏”菜单上,单击“设定”。\n");
        help.append("   在弹出的对话框左侧选择难度,\n");
        help.append("   或者左侧选择自定义,在右侧指定雷区中放置的地雷数,\n");
        help.append("   并通过指定水平和垂直显示的方块数来定制雷区尺寸。\n");
        help.append("4.退出游戏\n"); 
        help.append("   在游戏菜单上,单击“退出”。\n");                  
        helpMenu.add(topHelp); 
        topHelp.addActionListener(this);
        helpMenu.add(aboutGame);   
        aboutGame.addActionListener(this); 
    
        mainMenu.add(gameMenu); 
        mainMenu.add(helpMenu); 
        panel.add(mainMenu, BorderLayout.NORTH);
        
        
        setGameParam(10, 8, 8);  //设置默认游戏参数
        
        setActive(true);//设置游戏状态为可以进行游戏
        statusLabel1.setPreferredSize(statusLabel1.getPreferredSize());
        
        //设置加速器和快捷键
        KeyStroke ks = KeyStroke.getKeyStroke(KeyEvent.VK_X, Event.ALT_MASK);
        exit.setAccelerator(ks);
        exit.setMnemonic('X');    
        gameMenu.setMnemonic('G');
        KeyStroke ks1 = KeyStroke.getKeyStroke("F2");
        newGame.setAccelerator(ks1);
        newGame.setMnemonic('N');
        setting.setMnemonic('S');
        helpMenu.setMnemonic('H');
        topHelp.setMnemonic('H');
        aboutGame.setMnemonic('A');
    }
    
    public JComponent getStatusBar() {
        return statusBar;
    }
    
    public JComponent panel() {
        return panel;
    }
    
    public void actionPerformed(ActionEvent event) {//ActionEvent事件处理
    	
    	Object temp = event.getSource(); 
    	try{    		
            if(temp == newGame||temp == newButton){//按下“新游戏”菜单或者状态条图标按钮
    		if(gameActive==false){
                    int m=10,c=8,r=8;
                    setGameParam(m, r, c);
                    setActive(true);
                    repaint();
                    frame.setExtendedState(JFrame.NORMAL);
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    gameActive=true;
    		}else if(gameActive==true){
                    int m = cdialog.getMine(), r = cdialog.getRow(), c = cdialog.getColumn();
	            setGameParam(m, r, c);
	            setActive(true);
	            repaint();
	            frame.setExtendedState(JFrame.NORMAL);
	            frame.pack();
	            frame.setLocationRelativeTo(null);
                }
            }else if (temp == topHelp) { //按下“帮助”菜单
                JOptionPane.showMessageDialog(panel, scrollHelp,"帮助",JOptionPane.PLAIN_MESSAGE); 
            }else if (temp == aboutGame) { //按下“关于扫雷”菜单
                JOptionPane.showMessageDialog(panel, "Java扫雷1.0  版权所有","关于",JOptionPane.PLAIN_MESSAGE); 
            }else if (temp == exit) { //按下“退出”菜单
            	System.exit(0);
            }else {//按下“设定”菜单
                if (cdialog == null) {//创建“设定”对话框
                    Component c = this.getParent();
                    while (!(c instanceof JFrame))
                        c = c.getParent();
                    frame = (JFrame) c;
                    cdialog = new ConfigDialog(frame, true);
                    cdialog.setLocationRelativeTo(frame);
                }
                cdialog.setVisible(true);
                cdialog.dispose();
                if (cdialog.getReturnStatus() == ConfigDialog.RET_OK) {//“设定”对话框点击确定按钮
                    int m = cdialog.getMine(), r = cdialog.getRow(), c = cdialog.getColumn();//获取参数
                    setGameParam(m, r, c);//设置参数
                    setActive(true);
                    repaint();
                    frame.setExtendedState(JFrame.NORMAL);
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                }
            }	        
	}catch (Exception e) {} 
    }
 
    private void gameWin() {//游戏获胜
        repaint();
        statusLabel1.setForeground(VICTORY_COLOR);
        statusLabel1.setText("Victory!!!");
        JOptionPane.showMessageDialog(this, "恭喜你!你赢了!!", 
                "胜利!", JOptionPane.INFORMATION_MESSAGE);
    }
    
    private void gameOver() {//游戏失败

⌨️ 快捷键说明

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