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

📄 gamemain.java

📁 用JAVA实现的一个挖雷的小游戏 不过只是为了实现这个小游戏 所以没有增加级别等级
💻 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 + -