📄 gamemain.java
字号:
package com.xinxi.mine;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JTextField;
import java.awt.GridLayout;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Vector;
/**
* 游戏主框架的程序实现.
* @author Administrator
*
*/
public class GameMain extends JFrame implements ActionListener,MouseListener{
private JButton but[][];//存放方块按钮的一个二维数组
private char thunder[][];//存放方块数值的一个二维数组
private int count;//雷的个数
private int remainCount;//剩余雷的数量.
private int remainDiamondCount;//剩余方块的数量,用于求成功的条件.
private int lengthx;//方块的横长
private int lengthy;//方块的纵长
private JTextField tf1;
private JTextField tf2;
private boolean flag=false;
int x, y;//鼠标点的方块的数组坐标
public GameMain(){
}
public GameMain(int count, int lengthx, int lengthy){
this.count = count;
this.remainCount = count;
this.remainDiamondCount = lengthx*lengthy;
this.lengthx = lengthx;
this.lengthy = lengthy;
but = new JButton[lengthx+1][lengthy+1];
for(int i=1; i<lengthx+1; i++){//把所有方块加入到所在的方框内,并加监听.
for(int j=1; j<lengthy+1; j++){
but[i][j]=new JButton("");
but[i][j].addActionListener(this);
but[i][j].addMouseListener(this);
}
}
}
public void start(){
this.setLocation(300, 300);
if(lengthx*45<300){
this.setSize(300, lengthy*40);
}else {
this.setSize(lengthx*45, lengthy*40);//设定程序大小与方块个数有关.
}
//以下用于求方块中雷的分布.
Distributing distributing = new Distributing(count, lengthx, lengthy);//对Distributing进行实例化
thunder = distributing.getThunder2();
this.addWindowListener(new MyWindowEvent());//程序的关闭实现.
JLabel b1 = new JLabel("剩余雷数");//设定雷区上面的显示信息
JLabel b2 = new JLabel("所用时间");
tf1 = new JTextField(5);
tf1.setText(String.valueOf(remainCount));//显示剩余雷的数量
tf1.setEditable(false);
tf2 = new JTextField(5);
tf2.setEditable(false);
//b1.setSize();
JPanel p1 = new JPanel();//存放雷区上面的显示信息
JPanel p2 = new JPanel();//存放雷区中所有方块的信息.
p1.add(b1);
p1.add(tf1);
p1.add(b2);
p1.add(tf2);
p2.setLayout(new GridLayout(lengthx, lengthy));
for(int i=1; i<lengthx+1; i++){//把所有的方块加入到p2中.
for(int j=1; j<lengthy+1; j++){
p2.add(but[i][j]);
}
}
this.setLayout(new BorderLayout());
this.add(p1, BorderLayout.NORTH);
this.add(p2, BorderLayout.CENTER);
this.setVisible(true);
}
public void mouseClicked(MouseEvent e) {
JButton b = (JButton)e.getSource();
x=0;//初使化它们为了在这层for循环中使用break;
y=0;
for(int i=1; i<but.length; i++){//为了找到是哪个按钮被点击了.
for(int j=1; j<but[0].length; j++){
if(but[i][j]==b){
x=i;
y=j;
break;
}
}
if(x!=0||y!=0){
break;
}
}
if(e.getButton()==MouseEvent.BUTTON1&&!but[x][y].getText().equals("*")){//左键单击------------
if(but[x][y].getText()==""){
remainDiamondCount--;
if(thunder[x][y]=='*'){//挖到雷,退出程序
//把所有雷都显示出来????????????????????????????????????
for(int i=1; i<but.length; i++){
for(int j=1; j<but[0].length; j++){
if(but[i][j].getText()==""&&thunder[i][j]=='*'){
but[i][j].setText("*");
}
}
}
Fail f = new Fail();
f.start();
} else{
but[x][y].setBackground(Color.lightGray);
but[x][y].setForeground(Color.RED);
if(thunder[x][y]!='0'){
but[x][y].setText(String.valueOf(thunder[x][y]));
} else{
//把周围没有雷的方块都显示出来.
this.openAround(x, y);
}
but[x][y].setEnabled(false);
}
}
}
else if(e.getButton()==MouseEvent.BUTTON3){//右键单击--------------------
if(but[x][y].getText().equals("*")){
remainCount++;
remainDiamondCount++;
tf1.setText(String.valueOf(remainCount));
but[x][y].setText("");
} else if(but[x][y].getText()==""){
remainDiamondCount--;
remainCount--;
tf1.setText(String.valueOf(remainCount));
but[x][y].setText("*");
}
}
if(remainDiamondCount==remainCount){
for(int i=1; i<but.length; i++){
for(int j=1; j<but[0].length; j++){
if(but[i][j].getText()==""&&thunder[i][j]=='*'){
but[i][j].setText("*");
}
}
}
Success success = new Success();//如果成功挖出所有雷的话,弹出成功话面.
success.start();
}
tf2.setText(String.valueOf(this.remainDiamondCount));
}
public void mouseEntered(MouseEvent arg0) {
}
public void mouseExited(MouseEvent arg0) {
}
public void mousePressed(MouseEvent arg0) {
}
public void mouseReleased(MouseEvent arg0) {
}
public void actionPerformed(ActionEvent e) {
}
public void openAround(int a, int b){
but[a][b].setText(" ");
but[a][b].setEnabled(false);
for(int i=a-1; i<a+2; i++){
for(int j=b-1; j<b+2; j++){
if(i>0&&i<lengthx+1&&j>0&&j<lengthy+1&&but[i][j].getText().equals("")){
//只有在but上面没有value值时(即:没被点击过),才执行
this.remainDiamondCount--;
but[i][j].setBackground(Color.lightGray);
but[i][j].setForeground(Color.RED);
if(thunder[i][j]!='0'){
//this.remainDiamondCount--;
but[i][j].setText(String.valueOf(thunder[i][j]));
but[i][j].setEnabled(false);
} else{//当挖到的方块周围没有雷的话,把所有它周围没有雷的显示出来.
this.openAround(i, j);
}
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -