📄 gamepanel.java
字号:
/*
* 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 + -