首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java不打开(扫雷游戏)?

Java不打开(扫雷游戏)?
EN

Stack Overflow用户
提问于 2016-11-19 16:21:36
回答 1查看 133关注 0票数 1

我用Swing在Java中做了一个扫雷游戏,但是当我运行它时,JFrame不会弹出吗?(没有错误)它运行,但没有显示窗口。试图调试,但没有成功。

我非常感谢你的帮助:)

注意,在GameBoard类中:

代码语言:javascript
复制
imgs = new Image[13]; //Number of images used
    //Loading images, used later
    for (int i = 0; i < 13; i++) {
        imgs[i] = (new ImageIcon(i + ".png")).getImage();
    }

这些行加载代表图像的数字(13幅图像),由我创建,而这些img是讨厌的,这取决于鼠标适配器。

这是带有main方法的MineSweeper类:

代码语言:javascript
复制
package minesweeper;

import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

public class MineSweeper extends JFrame {

public  JLabel label;

public MineSweeper(){
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setSize(600, 600);
    this.setLocationRelativeTo(null);
    this.setTitle("Minesweeper");

    label = new JLabel("");
    this.add(label, BorderLayout.SOUTH);

    GameBoard game = new GameBoard(label);
    this.add(game);

    setResizable(false);

}


public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {                
            MineSweeper jf = new MineSweeper();
            jf.setVisible(true);                
        }
    });
}




}

A这是GameBoard类:

代码语言:javascript
复制
package minesweeper;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Random;

import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;



public class GameBoard extends JPanel {


//Adding constant variables
private final int SIZE_OF_CELL = 20;
private static final int NUM_OF_ROWS = 20;
private static final int NUM_OF_CL = 20;
private final int SIZE_OF_FIELD = NUM_OF_ROWS * NUM_OF_CL;
//Adding other variables
private int NUM_OF_MINES_LEFT;
private Image[] imgs;
private static int[][] gameboard;
public static int mines = 40;

private int all_cells;
private static JLabel label;
boolean gamestarted = true; // Game is in progress, already started

//Constructor 1 parameter
public GameBoard(JLabel inputlabel) {

    this.label = inputlabel;
    imgs = new Image[13]; //Number of images used
    //Loading images, used later
    for (int i = 0; i < 13; i++) {
        imgs[i] = (new ImageIcon(i + ".png")).getImage();
    }

    setDoubleBuffered(true);
    addMouseListener(new Manager());
    StartNewGame();
}


//Find mines around cell[i][j]
public static int FindMines(int ro, int co){
    int cnt=0;

    for(int y=-1;y<=1;y++){
        for(int x = -1; x<=1;x++){
            if(x==0 && y ==0) continue;
            if(ro+y<0) continue;
            if(co+x<0) continue;
            if(gameboard[ro+y][co+x]==19) cnt++; 
        }
    }
    return cnt;
}



public static void StartNewGame(){



    //NUM_OF_MINES_LEFT = 40; // Default value for number of mines is 30
    gameboard = new int[20][20];
    int minesleft=mines;
    int row,col;
   // int mines = NUM_OF_MINES_LEFT;
    Random rng=new Random();
    label.setText(Integer.toString(minesleft));

    //initialize mine field
    for(int i=0;i<20;i++){
        for (int j=0;j<20;j++){
            gameboard[i][j]=10;//default value is 10 -> its covered
        }
    }

   //Set mines in random positions 
    while (mines>0){                          
        row=rng.nextInt(NUM_OF_ROWS);
        col=rng.nextInt(NUM_OF_CL);
        if ((gameboard[row][col])!=19){
            gameboard[row][col]+=9;;
            minesleft--;
        }
    }



    //Set numbers
    for(int i=0;i<20;i++){
        for (int j=0;j<20;j++){

            if(gameboard[i][j]==19) gameboard[i][j]=19; 

            if(gameboard[i][j]==10){
                gameboard[i][j]+= FindMines(i,j);
            }
        }
    }

 }



   //public int FindEmptyCells(){



  //}
  @Override
  public void paintComponent(Graphics grap){

    int gamewon=0;
    int[][] temp = new int[20][20];

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

            temp[i][j]=gameboard[i][j];

            if(gamestarted && temp[i][j]==9) gamestarted=false;

            if(gamestarted == false){
                if(temp[i][j]==19){
                    temp[i][j]= 9;
                }else if(temp[i][j]==29){//10+11 for mark
                    temp[i][j]=11;
                }else if(temp[i][j]>9){
                    temp[i][j]=10;
                }
            }else{
                if (temp[i][j] > 19)
                    temp[i][j] = 11;
                else if (temp[i][j] > 9) {
                    temp[i][j] = 10;
                    gamewon=1;
                }
            }
            int toload= temp[i][j];
            grap.drawImage(imgs[toload],j*15,i*15,this);


        }
    }

    if(gamestarted==true && gamewon==0){
        gamestarted=false;
        label.setText("You won!");
    }else if(gamestarted==false){
        label.setText("You Lost!");
    }
}

class Manager extends MouseAdapter{

@Override   
public void mousePressed(MouseEvent ev){


    boolean newpaint = false;

    //Get event coordinates
    int x= ev.getX();
    int y= ev.getY();
    int hit_cl= x / 15;
    int hit_row= y/ 15;

    if(gamestarted==false){
        StartNewGame();
        repaint();
    }


    if( (x < 20 * 15) && (y < 20 * 15) ){

        if(ev.getButton() ==  MouseEvent.BUTTON3){

            if(gameboard[hit_cl][hit_row] > 9){
                newpaint=true;

                if(gameboard[hit_cl][hit_row] <= 19){
                    if(mines > 0){
                        mines--;
                        String show=Integer.toString(mines);
                        gameboard[hit_cl][hit_row]+=11;
                        label.setText(show);

                    }else{
                        label.setText("Marks: 0");
                    }
                }else{
                    mines++;
                    String show=Integer.toString(mines);
                    label.setText(show);
                    gameboard[hit_cl][hit_row]-=11;
                }

            }


        }else{
        if(gameboard[hit_cl][hit_row] > 19){
            return;
        }
            if((gameboard[hit_cl][hit_row] > 9) && (gameboard[hit_cl]   
  [hit_row] <29)){
                newpaint=true;
                gameboard[hit_cl][hit_row]-=10;

            if(gameboard[hit_cl][hit_row] == 9) gamestarted=false;
            //if(gameboard[hit_cl][hit_row] == 10); //find_empty();


        }
    }
    if(newpaint==true) repaint();
}

}   

}

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-19 17:39:17

你做了什么调试?:)

这个程序要永远运行的最明显的原因是它从不留下一个循环。

代码语言:javascript
复制
while (mines>0){                          
        row=rng.nextInt(NUM_OF_ROWS);
        col=rng.nextInt(NUM_OF_CL);
        if ((gameboard[row][col])!=19){
            gameboard[row][col]+=9;;
            minesleft--;
        }
    }

StartNewGame()方法的这一部分(GameBoard类)导致了一个没完没了的循环,挖掘变量从未在循环中更新过。

快速查看您的代码,我可以注意到一些不好的做法,例如:

  • 您不应该在paintComponent()方法中控制游戏状态或设置标签文本。这个方法是自动调用的,它应该只绘制所有组件。它中的所有“逻辑”都会减慢程序的速度,因为您无法控制该方法被调用了多少次(例如,您当然可以强制使用force ()方法来调用该方法)。
  • 你应该跟着java命名约定

希望这会有所帮助:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40695162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档