2016-11-19 54 views
1

我使用Swing在Java中进行扫雷游戏,但是当我运行它时,JFrame不会弹出? (没有错误) 它运行,但没有窗口显示。试图调试没有成功。Java Swing JFrame无法打开(扫雷游戏)?

我真的很感谢你的帮助:)

注意,在类游戏键盘:

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个图像),由我创造的数字,而这些都是IMGS根据loadid上mouseadapter。

这是扫雷类的主要方法:

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);     
     } 
    }); 
} 




} 

的是这样的游戏键盘类:

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(); 
} 

} 

} 

} 

回答

1

你做了什么调试? :)

程序永远运行的最明显的原因是它永远不会留下循环。

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()方法(游戏键盘类)的这部分造成死循环,矿井变量从不更新的循环中。

给人一种快看看你的代码,我可以注意到一些不好的做法,例如:

  • 你不应该控制比赛状态或设置里面 的paintComponent()方法的标签文本。此方法自动调用,并且它应该只有绘制所有组件。所有其中的“逻辑” 可能会减慢你的程序,因为你无法控制该方法被调用的次数(当然你可以强制使用repaint()方法调用 )。
  • 您应该遵循java naming conventions

希望这有助于:)