菜鸟,暑假开始自学JAVA的。
对界面很干兴趣,所以费了好大力气,一边学一边写的,扫雷游戏
代码拙劣不堪……但是居然实现了基本功能……http://download.csdn.net/source/2611848
可以下载源代码和打包的JAR文件……贴出来请大家狠批,你的批评和意见是我进步的阶石……
MyButton.javaimport java.awt.*; 
import java.awt.event.*; 
import javax.swing.*;
/*按扭类*/public class MyButton extends JButton  

        public int num_x,num_y;       //第几号方块 
        public boolean isBomb;        //是否为雷 
        public boolean isClicked;     //是否被点击 
        public int BombFlag;          //探雷标记
        public boolean isRight;       //是否点击右键
 
        public  MyButton(int x, int y) 
        { 
                BombFlag = 0; 
                num_x = x;
                num_y = y; 
                isBomb = false; 
                isClicked = true;
                isRight = false;
        }

菜鸟,暑假开始自学JAVA的。
对界面很干兴趣,所以费了好大力气,一边学一边写的,扫雷游戏
代码拙劣不堪……但是居然实现了基本功能……http://download.csdn.net/source/2611848
可以下载源代码和打包的JAR文件……贴出来请大家狠批,你的批评和意见是我进步的阶石……

解决方案 »

  1.   

    Landmine.javaimport javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;public class Landmine extends JFrame 
    {       
            Playing  listener = new Playing(this);    //监听者    
            JPanel landminePanel = new JPanel();//创建地雷面板
            JPanel topPanel = new JPanel();//创建顶部面板
            public static ImageIcon dead = new ImageIcon("images/dead.gif");
            public static ImageIcon smallIcon  = new ImageIcon("images/smallIcon_10.png");  
            public static ImageIcon bombIcon  = new ImageIcon("images/Bomb.gif");        //时间图标
           
            public static MyButton [][] lei;//按钮数组
            public static int numberOfClicked ;
            public static int numberOfUnflaged ;
            public static JLabel numberOfUnflagedLabel = new JLabel();
            
            public Landmine()
            {
                    super("扫雷,1.0版");//标题
                    setSize(800,800);//窗口尺寸
                    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//最大化、最小化、关闭按钮
    BorderLayout ff = new BorderLayout();//创建布局管理器
    setLayout(ff);//关联布局管理器
    setResizable(false);//禁止最大化
    numberOfClicked = 0;
    numberOfUnflaged = 40;
    //设置地雷面板
    GridLayout dd = new GridLayout(16,16);  
    landminePanel.setLayout(dd);
                    lei = new MyButton[18][18];
    for(int i=0; i<18; ++i)
    {
            for(int j=0; j<18; ++j)
            {
                    lei[i][j] = new MyButton(i,j);
            } 
    }
    for(int i=1; i<17; ++i)
    {
            for(int j=1; j<17; ++j)
            {
                   landminePanel.add(lei[i][j]);    //按钮加入地雷面板
                   lei[i][j].setIcon(smallIcon);    //设置按钮图标
                   lei[i][j].isClicked = false;     //翻开标记设置为 假lei[i][j].setIcon(dead);
                   lei[i][j].addActionListener(listener); //加入监听者
                   lei[i][j].addMouseListener(listener);
            } 
    }
    add(landminePanel,BorderLayout.CENTER); //加入主框架中央

    //设置顶部面板
    numberOfUnflagedLabel.setText("剩余雷数:"+numberOfUnflaged);
    numberOfUnflagedLabel.setFont(new Font("null",Font.BOLD,20));
    numberOfUnflagedLabel.setIcon(bombIcon);
    JButton aboutJB = new JButton("关于");
    aboutJB.addActionListener(listener);
    topPanel.add(numberOfUnflagedLabel);
    topPanel.add(aboutJB);
    add(topPanel,BorderLayout.NORTH);//加入主面板上部

    addLandmine();//布雷
    setVisible(true);//显示之
            }
            
            /*布雷*/
            public static void addLandmine()
            {
                    for(int count = 0; count<40; /*blank*/)
                    {
                            int i = (int)(Math.random()*100 % 16 +1 ) ;
                            int j = (int)(Math.random()*100 % 16 +1 ) ;
                            if(lei[i][j].isBomb == false)
                            {
                                    lei[i][j].isBomb = true;
                                    count++;
                                    //lei[i][j].setIcon(dead);//设置SUI图标
                            }                                                     
                    }
            } 
            
            ////////       主函数        /////////
            public static void main(String[] argus)
            {
                    Landmine Zhang = new Landmine();
            }
            //////////////////////////////////////
    }
    //
    //      Playing类
    //
    class Playing implements ActionListener,MouseListener
    {
            public static Landmine gui;
            public static ImageIcon dead2 = new ImageIcon("images/dead.gif");
            public static ImageIcon flagIcon = new ImageIcon("images/flag_2.png");
           // public static Font zhangCao = new Font("章草",Font.PLAIN,20);
            public Playing(Landmine in )
            {
                    gui = in;
            }
            
            public void actionPerformed(ActionEvent event)
            {
                    //关于
                    if(event.getActionCommand()=="关于")
                            JOptionPane.showMessageDialog(null,"扫雷1.0版。。小老头出品");
                    //  
                                  
                    MyButton receive = (MyButton)event.getSource();                      
                    if(receive.isBomb==true)
                    {//如果翻到了雷。。
                            receive.setIcon(dead2);
                            JOptionPane.showMessageDialog(null,"孩子,你挂了…");
                            int yourChose = JOptionPane.showConfirmDialog(null,"你可能是一不小心点错了,再来一局?" );//显示对话框
                            if(yourChose == JOptionPane.OK_OPTION)
                            {//点击“是”时
                                    replay();
                            }
                            else
                            {//点击 “否” 或 “取消” 时退出程序
                                    System.exit(0);
                            }                                                
                    }
                    else if(receive.isClicked ==false)
                    {//未翻到雷
                            showBombNumber(receive);
                    }
                    //receive.setEnabled(false); 
                   
            }   
            public static void showBombNumber(MyButton in)
            {//翻开点击的按钮
                    int numberOfLandmine = 0;//记录雷的个数
                    in.isClicked = true;    //翻开标记设为真
                    /*检测周围8个方块是否为雷*/
                    if(gui.lei[in.num_x-1][in.num_y-1].isBomb == true) numberOfLandmine++;
                    if(gui.lei[in.num_x][in.num_y-1].isBomb == true) numberOfLandmine++;                
                    if(gui.lei[in.num_x+1][in.num_y-1].isBomb == true) numberOfLandmine++;
                    if(gui.lei[in.num_x+1][in.num_y].isBomb == true) numberOfLandmine++;
                    if(gui.lei[in.num_x+1][in.num_y+1].isBomb == true) numberOfLandmine++;
                    if(gui.lei[in.num_x][in.num_y+1].isBomb == true) numberOfLandmine++;
                    if(gui.lei[in.num_x-1][in.num_y+1].isBomb == true) numberOfLandmine++;
                    if(gui.lei[in.num_x-1][in.num_y].isBomb == true) numberOfLandmine++;
                    in.setIcon(new ImageIcon("images/"+numberOfLandmine+".png"));//根据周围的雷数显示数字图标
                    
                    gui.numberOfClicked++;                
                    if(gui.numberOfClicked==216)
                    {
                            int yourChoice = JOptionPane.showConfirmDialog(null,"恭喜你成功了!再来一盘吗?");
                            if(yourChoice == JOptionPane.OK_OPTION)
                                    replay();
                            else 
                                    System.exit(0);
                    }
                            //ifPassed();                
                    
                    if(numberOfLandmine==0)
                    {//如果周围无雷,则将周围未翻开的全部翻开
                            if(gui.lei[in.num_x-1][in.num_y-1].isClicked == false)
                                    showBombNumber(gui.lei[in.num_x-1][in.num_y-1]);
                            if(gui.lei[in.num_x][in.num_y-1].isClicked == false)
                                    showBombNumber(gui.lei[in.num_x][in.num_y-1]);
                            if(gui.lei[in.num_x+1][in.num_y-1].isClicked == false)
                                    showBombNumber(gui.lei[in.num_x+1][in.num_y-1]);
                            if(gui.lei[in.num_x+1][in.num_y].isClicked == false)
                                    showBombNumber(gui.lei[in.num_x+1][in.num_y]);
                            if(gui.lei[in.num_x+1][in.num_y+1].isClicked == false)
                                    showBombNumber(gui.lei[in.num_x+1][in.num_y+1]);
                            if(gui.lei[in.num_x][in.num_y+1].isClicked == false)
                                    showBombNumber(gui.lei[in.num_x][in.num_y+1]);
                            if(gui.lei[in.num_x-1][in.num_y+1].isClicked == false)
                                    showBombNumber(gui.lei[in.num_x-1][in.num_y+1]);
                            if(gui.lei[in.num_x-1][in.num_y].isClicked == false)
                                    showBombNumber(gui.lei[in.num_x-1][in.num_y]);                        
                    }
                    
            }
            public static void replay()
            {//重新开始
                    
                    gui.dispose(); //释放框架资源     
                    //gui.setVisible(false);
                    Landmine ff = new Landmine();//重新开始
            }
            
            public void mousePressed(MouseEvent e)
            {
                    int mods = e.getModifiers();
                    MyButton receive = (MyButton)e.getSource();
                    
                    if((mods & InputEvent.BUTTON3_MASK) != 0)//鼠标右键 
                    {
                            if(receive.isClicked == false)
                            {      
                                    receive.isRight = (receive.isRight==true)?false:true;//改变receive.isRight的值
                                    if(receive.isRight)
                                    {
                                            gui.numberOfUnflaged--;
                                            receive.setIcon(flagIcon);
                                    }
                                    else
                                    {
                                            gui.numberOfUnflaged++;
                                            receive.setIcon(new ImageIcon("images/smallIcon_10.png"));
                                    }
                                    gui.numberOfUnflagedLabel.setText("剩余雷数:"+gui.numberOfUnflaged);
                            }                }                 
            }
            public void mouseReleased(MouseEvent e){}
            public void mouseExited(MouseEvent e) {} 
            public void mouseClicked(MouseEvent e){}        
            public void mouseEntered(MouseEvent e){} 
    }
      

  2.   

    做的很好了!
    有个建议:雷太大了,建议做的精致些。比如格子的样式,虽然这个不是Java的强项!
      

  3.   

    OK,我试试看改变大小……格子是我用PS做的
      

  4.   

    我也是学计算机的呀,下学期开JAVA课,我暑假先看看的……
      

  5.   

    昨天无聊也写了个android版的,差不了多少
      

  6.   

    我也贴一下我的扫雷,上学期做的,咱上学期开始学的java se。。楼主我们对比一下互相学习,我的貌似还有bug,要借鉴借鉴学习学习你的。。import javax.swing.*;public class lei extends JButton{
    public lei(String string) {
    // TODO 自动生成构造函数存根
    super(string);
    } int flag = 0;
    boolean open = false;
    int countBomb = 0;
    public void setFlag(int x){
    this.flag = x;
    }
    public String getFlag(){
    return (flag + "");
    }

    public String getcountBomb(){
    return countBomb + "";
    }

    public boolean getopen(){
    return open;
    }
    public void setopen(boolean bl){
    this.open = bl;
    }
    public void setEnabled(boolean b) {
    // TODO 自动生成方法存根
    super.setEnabled(b);
    }
    }import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.*;
    import javax.swing.*;public class saolei extends JFrame implements ActionListener{ /**
     * @param args
     */
    lei[][] jb = null;
    GridLayout glo2;
    JPanel[][] jp;
    JPanel jp1;
    JPanel jp2;
    JMenuBar a;
    JMenu a1;
    JMenu a2;
    JMenuItem a11;
    JMenuItem a12;
    JMenuItem a13;
    JMenuItem a14;
    JMenuItem a15;
    JMenuItem a16;
    int row;
    int col;
    int bomdCount;

    saolei(int row , int col , int bomdCount){
    this.row = row;
    this.col = col;
    this.bomdCount = bomdCount;
    jb = new lei[row][col];

    jp = new JPanel[row][col];
    glo2 = new GridLayout(row,col);
    String[] str1 = new String[row * col];


    jp1 = new JPanel();
    a = new JMenuBar();// 菜单条
    a1 = new JMenu("游戏(G)");// 菜单1
    a2 = new JMenu("帮助(H)");// 菜单1
    a11 = new JMenuItem("初级开局(N)");// 菜单1的菜单项 
    a11.addActionListener(this);
    a11.setAccelerator(KeyStroke.getKeyStroke("F2"));
    a12 = new JMenuItem("中级开局");// 菜单1的菜单项 
    a12.addActionListener(this);
    a13 = new JMenuItem("高级开局");// 菜单1的菜单项 
    a13.addActionListener(this);
    a14 = new JMenuItem("退出", 'Q');// 菜单1的菜单项
    a14.addActionListener(this);
    a15 = new JMenuItem("帮助");// 菜单1的菜单项
    a15.addActionListener(this);
    a16 = new JMenuItem("关于作者");// 菜单1的菜单项
    a16.addActionListener(this);
    a1.add(a11);
    a1.add(a12);
    a1.add(a13);
    a1.insertSeparator(3);
    a1.add(a14);
    a2.add(a15);
    a2.add(a16);
    a.add(a1);
    a.add(a2);
    jp1.setLayout(new BorderLayout());
    jp1.add(a , BorderLayout.WEST);


    jp2 = new JPanel();
    jp2.setLayout(glo2);

    for(int i = 0 ; i <= (row * col - 1) ; i ++){
    str1[i] =  i + " ";
    }
    for(int i = 0 ; i < col ; i ++){
    for(int j = 0 ; j < row ; j ++){
    jp[i][j] = new JPanel(new BorderLayout());
    jb[i][j] = new lei("    ");
    jb[i][j].addActionListener(this);
    jp[i][j].add(jb[i][j]);
    }
    }

    for(int i = 0 ; i < col ; i ++){
    for(int j = 0 ; j < row ; j ++){
    jp2.add(jp[i][j]);
    }
    }


    Random r=new Random();
    for(int i = 0 ; i <= (bomdCount - 1) ; i ++){//进行随机布雷
    int index = r.nextInt(row - 1);
    int index2 = r.nextInt(col - 1);
    if(jb[index][index2].getFlag() != "1"){
    if(index > 9){
    index = 0;
    }
    else{
    index = index + 1;
    }
    }
    jb[index][index2].setFlag(1);
    }

    this.add(jp1 , BorderLayout.NORTH);
    this.add(jp2 , BorderLayout.SOUTH);
    this.setLocation(358,135);
    this.pack();
    //this.setResizable(false);// 不能用鼠标拉伸窗体
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//可以关闭窗体 
    Aroundbomb();
    this.setVisible(true);
    }



    // 找周围的雷的数量
    private void Aroundbomb() {//检查周围雷的数量

    for(int i = 0 ; i < col ; i ++){
    for(int j = 0 ; j < row ; j ++){
    //当需要检测的单元格本身无地雷的情况下,统计周围的地雷个数
    int count = 0;
    if (jb[i][j].flag == 0) {
    // 检测左边是否为地雷1
    if ( (j - 1) >= 0) {
    if (jb[i][j - 1].flag == 1) {
    count += 1; 
    }
    }

    // 检测右边是否为地雷2
    if ( (j + 1) < col ) {
    if (jb[i][j + 1].flag == 1) {
    count += 1; //右边
    }
    }
    //检测上方空格是否为地雷3
    if ( (i - 1) > 0 ) {
    if (jb[i - 1][j].flag == 1) {
    count += 1; 
    }
    } //检测下方空格是否为地雷4
    if ( (i + 1) < row) {
    if (jb[i + 1][j].flag == 1) {
    count += 1; 
    }
    }
    // 检测左上是否为地雷5
    if ( (j - 1 >= 0) && (i - 1 >= 0)) {
    if (jb[i - 1 ][j - 1].flag == 1) {
    count += 1; //
    }
    }
    // 检测左下是否为地雷6
    if ( (j - 1 >= 0) && (i + 1 < row)) {
    if (jb[i + 1][j - 1].flag == 1) {
    count += 1; //
    }
    } //检测右上方是否为地雷7
    if ( (i - 1 >= 0) && (j + 1 < col)) {
    if (jb[i - 1][j + 1].flag == 1) {
    count += 1; 
    }
    }
    // 检测右下是否为地雷8
    if ( (i + 1 > row) && (j + 1 < col)) {
    if (jb[i + 1][j + 1].flag == 1) {
    count += 1; //
    }
    }
    jb[i][j].countBomb = count;
    }
    }
    }
    } private int leaveGrid(){//计算剩下的格子数
    int leaveGrid = 0;
    for(int i = 0 ; i < col ; i ++){
    for(int j = 0 ; j < row ; j ++){
    if(jb[i][j].getopen() == false)
    leaveGrid += 1;
    }
    }
    return leaveGrid;
    }

    public static void main(String[] args) {
    // TODO 自动生成方法存根
    new saolei(4 , 4 , 4);
    }

    public void showAll(){//显示所有的灯地雷位置
    for(int i = 0 ; i < col ; i ++){
    for(int j = 0 ; j < row ; j ++){
    if(1 == jb[i][j].flag){
    jb[i][j].setEnabled(false);
    jb[i][j].setText("×");
    }
    /*else if(jb[i][j].getopen() == false){
    jb[i][j].setEnabled(false);
    jb[i][j].setText(jb[i][j].getFlag());
    }*/
    }
    } }

    public void DiaplayAround(int x , int y){//显示周围雷没有雷的方格
    if(jb[x][y].getopen() == true || jb[x][y].getFlag() == "1"){
    return ;
    } if(jb[x][y].countBomb == 0){
    jb[x][y].setEnabled(false);
    jb[x][y].setopen(true);
    jb[x][y].setText(jb[x][y].getcountBomb());
    }
    }

    public void actionPerformed(ActionEvent e) {
    // TODO 自动生成方法存根
    if(e.getSource() == a11){
    //System.out.println("点击了开始!");
    new saolei(4 , 4 , 4);
    }

    else if(e.getSource() == a12){
    //System.out.println("点击了开始!");
    new saolei(7 , 7 , 8);
    }

    else if(e.getSource() == a13){
    //System.out.println("点击了开始!");
    new saolei(10 , 10 , 10);
    }

    else if(e.getSource() == a14){
    //System.out.println("点击了退出!");
    System.exit(0);
    }

    else if(e.getSource() == a15){
    //System.out.println("点击了开始!");
    JOptionPane.showMessageDialog(this, "暂时无帮助");
    return;
    }

    else if(e.getSource() == a16){
    //System.out.println("点击了开始!");
    JOptionPane.showMessageDialog(this, "作者***");
    return;
    }

    for(int i = 0 ; i < col ; i ++){
    for(int j = 0 ; j < row ; j ++){

    if(e.getSource() == jb[i][j]){

    jb[i][j].setEnabled(false);
    jb[i][j].setopen(true);

    if(1 == jb[i][j].flag){

    jb[i][j].setText("×");
    JOptionPane.showMessageDialog(this, "点击到了雷,程序结束,显示所有");
    showAll();
    }

    else if(bomdCount == leaveGrid()){
    jb[i][j].setText(jb[i][j].getcountBomb());
    JOptionPane.showMessageDialog(this, "恭喜你游戏胜利!");
    showAll();
    }

    else{
    //jb[i][j].setText(jb[i][j].getFlag());//这里显示的应该是周围的雷的数量
    jb[i][j].setText(jb[i][j].getcountBomb());
    }
    diaoyongxianshi(i , j); }
    }
    }
    } private void diaoyongxianshi(int i , int j) {
    // TODO 自动生成方法存根
    if((i - 1) > 0 && (j - 1) > 0){
    DiaplayAround(i - 1 , j - 1);
    DiaplayAround(i , j - 1);
    DiaplayAround(i - 1 , j);
    }
    if((i +1 ) < row && (j - 1) > 0){
    DiaplayAround(i + 1 , j - 1);
    DiaplayAround(i + 1 , j);
    }
    if((i - 1) > 0 && (j + 1) < col){
    DiaplayAround(i - 1 , j + 1);
    }
    if((i + 1) < row && (j + 1) <col){
    DiaplayAround(i , j + 1);
    DiaplayAround(i + 1 , j + 1);
    }
    }
    }
      

  7.   

    Swing能做出这样的桌面应用来不错了建议楼主可以关注一下RCP项目,也是做图形界面的,比Swing要轻量级且架构更先进,美工也更好
      

  8.   

      提个小意见...
        请把你的设置窗体大小去除.. 改成setBounds(300,100,600,600);//设置坐标,大小总的来说. 你还是蛮强的.
      

  9.   

    嗯……对RCP还一无所知,我会看看的
      

  10.   

    copy了一下。。回去好好研究。。
      

  11.   

    copy了一下。。回去好好研究。。