package ClearMine;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.net.URL;
import javax.swing.*;
public class GameFrame extends JFrame{
private JMenuBar menuBar = new JMenuBar();
private HeadPanel headPanel = new HeadPanel();
private JPanel drawPanel = new JPanel();
private MineData mineData ;
private static final int gridSize = 16;
private Color[] colors = {Color.black,Color.blue,new Color(0,128,0),Color.red,new Color(0,0,160),
new Color(0,128,128),new Color(128,0,64),new Color(128,0,0),new Color(64,0,128)};
private JButton[][] uiObjects;
ImageIcon markIcon = null;
ImageIcon mineIcon = null;
ImageIcon redMineIcon = null;
ImageIcon unknowIcon = null;
private int endRow = -1;
private int endCol = -1;
private boolean isStart = false;
private int rowCount;
private int colCount;
private int mineCount;
public GameFrame(){
setTitle("扫雷");
URL url = this.getClass().getResource("mark.GIF");
markIcon = new ImageIcon(url);
url = this.getClass().getResource("mine.GIF");
mineIcon = new ImageIcon(url);
url = this.getClass().getResource("unknow.GIF");
unknowIcon = new ImageIcon(url);
url = this.getClass().getResource("redmine.GIF");
redMineIcon = new ImageIcon(url);
setLayout(new BorderLayout());
add(headPanel,BorderLayout.NORTH);
add(drawPanel,BorderLayout.CENTER);
this.setResizable(false);
JMenu mainMenu = new JMenu("游戏(G)");
mainMenu.setMnemonic('G');
JMenuItem item = new JMenuItem(new AbstractAction("开局(N)"){
public void actionPerformed(ActionEvent e) {
resetGame();
}
});
item.setMnemonic('N');
mainMenu.add(item);
mainMenu.addSeparator();
ButtonGroup bg = new ButtonGroup();
item = new JRadioButtonMenuItem(new AbstractAction("初级(B)"){
public void actionPerformed(ActionEvent e) {
readyToPlay(9,9,10);
}
});
item.setMnemonic('B');
item.setSelected(true);
mainMenu.add(item);
bg.add(item);
item = new JRadioButtonMenuItem(new AbstractAction("中级(I)"){
public void actionPerformed(ActionEvent e) {
readyToPlay(16,16,40);
}
});
item.setMnemonic('I');
mainMenu.add(item);
bg.add(item);
item = new JRadioButtonMenuItem(new AbstractAction("高级(E)"){
public void actionPerformed(ActionEvent e) {
readyToPlay(16,32,99);
}
});
item.setMnemonic('E');
mainMenu.add(item);
bg.add(item);
item = new JRadioButtonMenuItem(new AbstractAction("自定义(C)..."){
public void actionPerformed(ActionEvent e) {
doCustomGame();
}
});
item.setMnemonic('C');
mainMenu.add(item);
bg.add(item);
mainMenu.addSeparator();
item = new JMenuItem(new AbstractAction("扫雷英雄榜(T)"){
public void actionPerformed(ActionEvent e) {
}
});
item.setMnemonic('T');
mainMenu.add(item);
mainMenu.addSeparator();
item = new JMenuItem(new AbstractAction("退出(X)"){
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
item.setMnemonic('X');
mainMenu.add(item);
menuBar.add(mainMenu);
this.setJMenuBar(menuBar);
}
public void doCustomGame(){
GameCustom dlg = new GameCustom(this);
if (dlg.isSelectOK()){
readyToPlay(dlg.getRowCount(),dlg.getColCount(),dlg.getMineCount());
}
}
public void endGame(int row,int col){
endRow = row;
endCol = col;
headPanel.stopTimer();
headPanel.makeDespair();
isStart = false;
}
public void readyToPlay(int rowCount,int colCount,int mineCount){
mineData = new MineData(rowCount,colCount,mineCount);
this.rowCount = rowCount;
this.colCount = colCount;
this.mineCount = mineCount;
headPanel.setMineCount(mineData.getMineCount());
uiObjects = new JButton[rowCount][colCount];
drawPanel.setLayout(new GridLayout(rowCount,colCount));
drawPanel.setPreferredSize(new Dimension(colCount * gridSize,rowCount * gridSize));
refreshUI();
pack();
isStart = false;
endRow = -1;
endCol = -1;
}
public void resetGame(){
readyToPlay(rowCount,colCount,mineCount);
}
public void startGame(){
refreshUI();
headPanel.startTimer();
isStart = true;
}
public boolean isGameComplete(){
for ( int i = 0; i < mineData.getRowCount(); ++i){
for ( int j = 0; j < mineData.getColCount(); ++j){
if (mineData.getGameMark()[i][j] != MineData.clearCode ){
if (mineData.getGameMark()[i][j] != MineData.markCode){
return false;
}
else if(mineData.getGameMark()[i][j] == MineData.markCode){
if( mineData.getGameData()[i][j] != MineData.mineCode){
return false;
}
}
}
}
}
return true;
}
private void refreshUI(){
for ( int i = 0; i < mineData.getRowCount(); ++i){
for ( int j = 0; j < mineData.getColCount(); ++j){
if (uiObjects[i][j] == null){
uiObjects[i][j] = new UnClearedArea(i,j) ;
continue;
}
if (endRow >= 0 && endCol >= 0){
if (mineData.getGameData()[i][j] == MineData.mineCode)
{
uiObjects[i][j] = new ClearedArea(i,j) ;
}
}
if (mineData.getGameMark()[i][j] == 3){
uiObjects[i][j] = new ClearedArea(i,j) ;
}
}
}
drawPanel.removeAll();
for ( int i = 0; i < mineData.getRowCount(); ++i){
for ( int j = 0; j < mineData.getColCount(); ++j){
drawPanel.add(uiObjects[i][j]);
}
}
drawPanel.doLayout();
}
public static void main(String[] args){
GameFrame frame = new GameFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.readyToPlay(9, 9, 10);
Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
frame.setLocation(dim.width / 2 - frame.getWidth()/2 , dim.height / 2 - frame.getHeight()/2);
frame.setVisible(true);
}
class HeadPanel extends JPanel{
JLabel mineLabel = new JLabel("000");
JLabel timeLabel = new JLabel("000");
JButton contrlButton = new JButton();
ImageIcon smile ;
ImageIcon surprise ;
ImageIcon despair ;
Timer timer ;
int timeCounter = 0;
int mineCount = 0;
public HeadPanel(){
timer = new Timer(1000,new ActionListener()
{
public void actionPerformed(ActionEvent e) {
String s = String.format("%03d", ++timeCounter);
timeLabel.setText(s);
}
});
URL url = this.getClass().getResource("smile.GIF");
smile = new ImageIcon(url);
url = this.getClass().getResource("surprise.GIF");
surprise = new ImageIcon(url);
url = this.getClass().getResource("despair.GIF");
despair = new ImageIcon(url);
contrlButton.setIcon(smile);
mineLabel.setFont(new Font("Arial",Font.BOLD,15));
timeLabel.setFont(new Font("Arial",Font.BOLD,15));
contrlButton.setBorder(BorderFactory.createRaisedBevelBorder());
contrlButton.setPreferredSize(new Dimension(22,22));
contrlButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e) {
timeCounter = 0;
makeSmile();
timeLabel.setText("000");
resetGame();
stopTimer();
}
});
setLayout(new GridBagLayout());
GridBagConstraints cons1 = new GridBagConstraints();
cons1.anchor = GridBagConstraints.WEST;
cons1.gridx = 0;
cons1.insets = new Insets(5,5,5,0);
add(mineLabel,cons1);
GridBagConstraints cons2 = new GridBagConstraints();
cons2.anchor = GridBagConstraints.CENTER;
cons2.gridx = 1;
cons2.weightx = 1.0;
cons2.insets = new Insets(5,0,5,0);
add(contrlButton,cons2);
GridBagConstraints cons3 = new GridBagConstraints();
cons3.anchor = GridBagConstraints.EAST;
cons3.gridx = 2;
cons3.insets = new Insets(5,0,5,5);
add(timeLabel,cons3);
}
public void startTimer(){
timeCounter = 0 ;
timer.start();
}
public void stopTimer(){
timer.stop();
}
public void setMineCount(int count){