Swing组件开发的扫雷小游戏(主要用到的是JButton)

package com.sxt.java.Swing;


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
/**
 * Swing组件开发的扫雷小游戏(主要用到的是JButton)
 * @author Administrator
 *
 */


public class Mine extends MouseAdapter{
private JFrame mainFrame;
private int[][] data;
private JButton[][] buttons;
private JButton startJB;
private Label l;
private int row;
private int col;
private int mineNumber;
private int mineCount;
private boolean isOver;
public Mine(){
row=15;
col=15;
mainFrame=new JFrame("扫雷v1.0");
data=new int[row][col];
buttons=new JButton[row][col];
startJB=new JButton("start");
l=new Label("welcome to mine !");
mineNumber=row*col/7;
}
public void init(){//初始化方法
JPanel north=new JPanel();
JPanel center=new JPanel();
JPanel south=new JPanel();
north.setLayout(new FlowLayout());
center.setLayout(new FlowLayout());
south.setLayout(new GridLayout(row,col,4,4));
mainFrame.setLayout(new BorderLayout());
mainFrame.add(north,BorderLayout.NORTH);
mainFrame.add(center,BorderLayout.CENTER);
mainFrame.add(south,BorderLayout.SOUTH);
north.add(l);
startJB.addActionListener(new ActionListener() {//开始按钮的监听器
@Override
public void actionPerformed(ActionEvent e) {
//一切初始化后重新开始
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
buttons[i][j].setText(" ");
buttons[i][j].setBackground(Color.WHITE);
data[i][j]=0;
isOver=false;
}
}
hashMine();
mineCount=0;
l.setText("let's go !");
}
});
center.add(startJB);
for (int i = 0; i < row; i++) {//初始化按钮信息
for (int j = 0; j < col; j++) {
buttons[i][j]=new JButton(" ");
buttons[i][j].setName(i+":"+j);//按钮的名字记录着行号和列号
//buttons[i][j].setSize(10, 30);
buttons[i][j].setBackground(Color.WHITE);
buttons[i][j].addMouseListener(this);
south.add(buttons[i][j]);
}
}
hashMine();//随机布局类
}


private void hashMine() {//随机布雷的方法
//得到随机数,确定类的位置
for (int i = 0; i < mineNumber; i++) {
data[(int) (Math.random()*row)][(int) (Math.random()*col)]=-1;
}
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if(data[i][j]==-1)
continue;
int sum=0;//确定每个格子周围雷的数量
for (int m = -1; m <=1 ; m++) {
for (int n = -1; n <=1; n++) {
if(i+m>=0 && j+n>=0 && i+m<row && j+n<col){
if(data[i+m][j+n]==-1)
sum++;
}
}
}
data[i][j]=sum;

}
}
}
public void start(){
mainFrame.setSize(800, 600);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.setVisible(true);
for (int i = 0; i < mineNumber; i++) {
data[(int)(Math.random()*row)][(int)(Math.random()*col)]=-1;
}
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (data[i][j]==-1) 
continue;
int sum=0;//确定每个格子雷的数量
for (int m = -1; m <= 1; m++) {
for (int n = -1; n <=1;n++) {
if (i+m>=0 && j+n>=0 && i+m<row && j+n<col) {
if(data[i+m][j+n]==-1)
sum++;
}
}
}
data[i][j]=sum;
}
}
}
private void gameOver(boolean over){//游戏结束
if(over==true){//雷被点中
for (int i = 0; i < row; i++) {//把所有的类都显示出来
for (int j = 0; j < col; j++) {
if(data[i][j]==-1){
buttons[i][j].setText("M");
buttons[i][j].setBackground(Color.RED);
}
}
}
l.setText("-_-");
isOver=true;
return;
}
int sumPress=0;//统计被着色的按钮数
for(int i = 0;i < row; i++){
for (int j = 0; j < col; j++) {
if(!buttons[i][j].getText().equals(" ")){
sumPress++;
}
}
}
if (sumPress==row*col) {
int sum=0;
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if(data[i][j]==-1 && buttons[i][j].getText().equals("M")){
sum++;
}
}
}
if(sum>=mineNumber){
System.out.println(mineNumber);
l.setText("^_^");//游戏胜利
}
}
}
public void mousePressed(MouseEvent e){//实现mouselistner中的方法,监听鼠标单击事件
try{
if(isOver)
return;
if(e.getButton()==MouseEvent.BUTTON3){//右击
JButton jb=(JButton)e.getSource();//获得被点击的按钮对象
if(jb.getText().equals("M")){ //取消标志
jb.setText(" ");
mineCount--;
jb.setBackground(Color.WHITE);
}else{
if(mineCount<mineNumber){//标志还没用完
jb.setText("M");//
jb.setBackground(Color.BLUE);
mineCount++;
}else{//标志已经用完
l.setText("the mine flag is over!");
}
}
}else{
JButton jb=(JButton)e.getSource();
mousePress(jb);//调用mousePressed()方法处理鼠标左键单击事件
}
}catch(Exception ex){
ex.printStackTrace();
}
gameOver(false);//盘低端游戏是否结束,即雷是否找完
}
private void mousePress(JButton jb){
String str[]=jb.getName().split(":");//得到行号和列号
int i=Integer.parseInt(str[0]);
int j=Integer.parseInt(str[1]);
if (data[i][j]==-1) {//如果点到累了
gameOver(true);
return;
} else {
jb.setText(data[i][j]+"");//设置文本和颜色
jb.setBackground(Color.YELLOW);
if (data[i][j]==0) {//如果四周没有雷
for (int m = -1; m <= 1; m++) {
for (int n = -1; n <=1; n++) {
if (i+m>=0 && j+n>=0 && i+m<row && j+n< col) {
if(buttons[i+m][j+n].getText().equals(" "))
mousePress(buttons[i+m][j+n]);//撬开旁边的按钮
}
}
}
}
}
}
public static void main(String[] args) {//主方法
Mine mine=new Mine();
mine.init();
mine.start();
}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值