以下每行代码,文字均为原创,转载请注明出处.
程序一共分为7个文件,每个文件为一个类
文件名
功能描述
Test.java
测试类,包含main()函数
Mine.java
设计主界面,
Calmine.java
随机雷的位置.计算雷区点击后应该显示的数字
My_button.java
继承自button类,添加按钮的坐标x,y.
Num_Mine.java
雷数,包括用户以标记的雷数,标记正确的雷数,以及总雷数
ClickLone.java
鼠标左击处理
ClickRone.java
鼠标右击处理
Test.java
测试类,Mine()接受的三个参数分别为雷区的长,宽,总雷数
package mine_sweep;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
new Mine(16,16,20);
}
}
Mine.java
继承自JFame类,采用BorderLayout()布局,.NORTH区域放置显示面板JPanel,提示用户以标记的雷数,.SOUTH区域放置雷区,采用GridLayout布局
用一个双重循环向雷区minepanel添加按钮,同时在buttons[]中储存该按钮的引用.
同时添加按钮监听器..在用户点击了右键后,负责更新标记的类数
package mine_sweep;
import java.awt.*;
import java.awt.event.*;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
@SuppressWarnings("serial")
public class Mine extends JFrame {
Integer rn;//用户已标记的雷数
Integer sn;//标记对的雷数
public Mine(int rows,int cols,int n)//雷区的行数,列数,雷数
{
My_button buttons[]=new My_button[rows*cols];//记录每个按钮的引用
Integer mine[]= new Integer[rows*cols];//每个位置的数字
Boolean ismine[]=new Boolean[rows*cols];//是否有雷的标志
new Calmine(mine,ismine,rows,cols,n);
this.setSize(500, 450);
this.setTitle("mine_sweep");
this.setLayout(new BorderLayout());
rn=new Integer(0);//用户标记的雷数
sn=new Integer(0);//标记对的雷数
JPanel showpanel=new JPanel();//设置控制面板
showpanel.setLayout(new FlowLayout(FlowLayout.LEFT));
JTextArea showArea=new JTextArea("sum of mine: "+n);
JTextArea showrmArea=new JTextArea("num of marked mine: "+rn.intValue());
showArea.setEditable(false);
showrmArea.setEditable(false);
showpanel.add(showrmArea );
showpanel.add(showArea);
this.add(showpanel,BorderLayout.NORTH);
JPanel minepanel=new JPanel();//设置雷区
minepanel.setLayout(new GridLayout(rows,cols));
minepanel.setSize(500, 450);
Mine t=this;
for(int i=0;i
{
for(int j=0;j
{
My_button btn=new My_button(i,j);
buttons[i*cols+j]=btn;
minepanel.add(buttons[i*cols+j] );
btn.setBackground(Color.blue);
btn.addMouseListener(new MouseAdapter()
{
public void mouseClick