2013-10-02 201 views
2

这是我的滑块拼图游戏。到目前为止,它只能做3x3游戏。当我尝试传递板的变量l和w(长度和宽度)时,它不起作用。它只适用于当我设置变量ROWS和COLS为决赛。当我尝试改变它时,我收到错误。我不知道该怎么做,任何帮助,将不胜感激。滑块拼图问题

目前用户可以输入目前无法做任何事情的值。游戏开始时,会生成一个3x3的棋盘。用户可以使用不同的加扰板重新开始游戏,但解决棋盘上的按钮和将板重置为原始状态的按钮不起作用。

public class SlidePuzzle { 

public static void main(String[] args) 
{ 

    JFrame window = new JFrame("Slide Puzzle"); 
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    String length = JOptionPane.showInputDialog("Length"); 
    String width = JOptionPane.showInputDialog("Width"); 
    int l = Integer.parseInt(length); 
    int w = Integer.parseInt(width); 
    window.setContentPane(new SlidePuzzleGUI()); 
    window.pack(); 
    window.show(); 
    window.setResizable(false); 

} 
} 

public class SlidePuzzleGUI extends JPanel 
{ 

private GraphicsPanel _puzzleGraphics; 
private SlidePuzzleModel _puzzleModel = new SlidePuzzleModel(); 

这个类包含了拼图

public SlidePuzzleGUI() { 

    JButton newGameButton = new JButton("New Game"); 
    JButton resetButton = new JButton("Reset"); 
    JButton solveButton = new JButton("I GIVE UP :("); 

    resetButton.addActionListener(new ResetAction()); 
    newGameButton.addActionListener(new NewGameAction()); 


    JPanel controlPanel = new JPanel(); 
    controlPanel.setLayout(new FlowLayout()); 
    controlPanel.add(newGameButton); 
    controlPanel.add(resetButton); 
    controlPanel.add(solveButton); 


    _puzzleGraphics = new GraphicsPanel(); 

    this.setLayout(new BorderLayout()); 
    this.add(controlPanel, BorderLayout.NORTH); 
    this.add(_puzzleGraphics, BorderLayout.CENTER); 
} 

这是图形面板

class GraphicsPanel extends JPanel implements MouseListener { 
    private static final int ROWS = 3; 
    private static final int COLS = 3; 

    private static final int CELL_SIZE = 80; 
    private Font _biggerFont; 



    public GraphicsPanel() { 
     _biggerFont = new Font("SansSerif", Font.BOLD, CELL_SIZE/2); 
     this.setPreferredSize(
       new Dimension(CELL_SIZE * COLS, CELL_SIZE*ROWS)); 
     this.setBackground(Color.black); 
     this.addMouseListener(this); 
    } 



    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     for (int r=0; r<ROWS; r++) { 
      for (int c=0; c<COLS; c++) { 
       int x = c * CELL_SIZE; 
       int y = r * CELL_SIZE; 
       String text = _puzzleModel.getFace(r, c); 
       if (text != null) { 
        g.setColor(Color.gray); 
        g.fillRect(x+2, y+2, CELL_SIZE-4, CELL_SIZE-4); 
        g.setColor(Color.black); 
        g.setFont(_biggerFont); 
        g.drawString(text, x+20, y+(3*CELL_SIZE)/4); 
       } 
      } 
     } 
    } 



    public void mousePressed(MouseEvent e) { 

     int col = e.getX()/CELL_SIZE; 
     int row = e.getY()/CELL_SIZE; 

     if (!_puzzleModel.moveTile(row, col)) { 

      Toolkit.getDefaultToolkit().beep(); 
     } 

     this.repaint(); 
    } 



    public void mouseClicked (MouseEvent e) {} 
    public void mouseReleased(MouseEvent e) {} 
    public void mouseEntered (MouseEvent e) {} 
    public void mouseExited (MouseEvent e) {} 
} 

public class NewGameAction implements ActionListener { 
    public void actionPerformed(ActionEvent e) { 
     _puzzleModel.reset(); 
     _puzzleGraphics.repaint(); 
    } 
} 
public class ResetAction implements ActionListener { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     _puzzleModel.tryAgain(); 
     _puzzleGraphics.repaint(); 

    } 

} 

public class solveAction implements ActionListener 
{ 

    @Override 
    public void actionPerformed(ActionEvent e) 
     { 
      _puzzleModel.solve(); 
      _puzzleGraphics.repaint(); 

     } 

    } 
} 
public class SlidePuzzleModel { 
private static final int ROWS = 3; 
private static final int COLS = 3; 

private Tile[][] _contents; 
private Tile[][] _solved; 
private Tile  _emptyTile; 



public SlidePuzzleModel() { 
    _contents = new Tile[ROWS][COLS]; 
    reset(); 
} 



String getFace(int row, int col) { 
    return _contents[row][col].getFace(); 
} 



public void reset() { 
    for (int r=0; r<ROWS; r++) { 
     for (int c=0; c<COLS; c++) { 
      _contents[r][c] = new Tile(r, c, "" + (r*COLS+c+1)); 
     } 
    } 

    _emptyTile = _contents[ROWS-1][COLS-1]; 
    _emptyTile.setFace(null); 


    for (int r=0; r<ROWS; r++) { 
     for (int c=0; c<COLS; c++) { 
      exchangeTiles(r, c, (int)(Math.random()*ROWS) 
           , (int)(Math.random()*COLS)); 
     } 
    } 
} 

public void tryAgain() 
{ 

} 

public void solve() 
{ 
    for (int i = 1; i < ROWS+1;i++) 
    { 
     for(int j = 1; j < COLS+1;j++) 
     { 
      exchangeTiles(i, j, i, j); 
     } 
    } 
} 


public boolean moveTile(int r, int c) { 

    return checkEmpty(r, c, -1, 0) || checkEmpty(r, c, 1, 0) 
     || checkEmpty(r, c, 0, -1) || checkEmpty(r, c, 0, 1); 
} 

private boolean checkEmpty(int r, int c, int rdelta, int cdelta) { 
    int rNeighbor = r + rdelta; 
    int cNeighbor = c + cdelta; 

    if (isLegalRowCol(rNeighbor, cNeighbor) 
       && _contents[rNeighbor][cNeighbor] == _emptyTile) { 
     exchangeTiles(r, c, rNeighbor, cNeighbor); 
     return true; 
    } 
    return false; 
} 

public boolean isLegalRowCol(int r, int c) { 
    return r>=0 && r<ROWS && c>=0 && c<COLS; 
} 



private void exchangeTiles(int r1, int c1, int r2, int c2) { 
    Tile temp = _contents[r1][c1]; 
    _contents[r1][c1] = _contents[r2][c2]; 
    _contents[r2][c2] = temp; 
} 

public boolean isGameOver() { 
    for (int r=0; r<ROWS; r++) { 
     for (int c=0; c<ROWS; c++) { 
      Tile trc = _contents[r][c]; 
      return trc.isInFinalPosition(r, c); 
     } 
    } 


    return true; 
} 
} 

class Tile { 

private int _row;  
private int _col;  
private String _face; 

public Tile(int row, int col, String face) { 
    _row = row; 
    _col = col; 
    _face = face; 
} 
public void setFace(String newFace) { 
    _face = newFace; 
} 
public String getFace() { 
    return _face; 
} 
public boolean isInFinalPosition(int r, int c) { 
    return r==_row && c==_col; 
} 
} 

我将如何让这个用户可以指定游戏的尺寸GUI板?

编辑 公共类SlidePuzzle {

public static void main(String[] args) 
{ 

    JFrame window = new JFrame("Slide Puzzle"); 
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    String length = JOptionPane.showInputDialog("Length"); 
    String width = JOptionPane.showInputDialog("Width"); 
    int l = Integer.parseInt(length); 
    int w = Integer.parseInt(width); 
    window.setContentPane(new SlidePuzzleGUI()); 
    window.pack(); 
    window.show(); 
    window.setResizable(false); 

} 

} 公共类SlidePuzzleGUI扩展JPanel {

private GraphicsPanel _puzzleGraphics; 
private SlidePuzzleModel _puzzleModel = new SlidePuzzleModel(); 




public SlidePuzzleGUI(int l, int w) { 

    JButton newGameButton = new JButton("New Game"); 
    JButton resetButton = new JButton("Reset"); 
    JButton solveButton = new JButton("I GIVE UP :("); 

    resetButton.addActionListener(new ResetAction()); 
    newGameButton.addActionListener(new NewGameAction()); 


    JPanel controlPanel = new JPanel(); 
    controlPanel.setLayout(new FlowLayout()); 
    controlPanel.add(newGameButton); 
    controlPanel.add(resetButton); 
    controlPanel.add(solveButton); 


    _puzzleGraphics = new GraphicsPanel(l,w); 

    this.setLayout(new BorderLayout()); 
    this.add(controlPanel, BorderLayout.NORTH); 
    this.add(_puzzleGraphics, BorderLayout.CENTER); 
} 

class GraphicsPanel extends JPanel implements MouseListener { 
    private int ROWS; 
    private int COLS; 

    private static final int CELL_SIZE = 80; 
    private Font _biggerFont; 



    public GraphicsPanel(int l, int w) { 
     _biggerFont = new Font("SansSerif", Font.BOLD, CELL_SIZE/2); 
     this.setPreferredSize(
       new Dimension(CELL_SIZE * COLS, CELL_SIZE*ROWS)); 
     this.setBackground(Color.black); 
     this.addMouseListener(this); 
     ROWS = l; 
     COLS = w; 
    } 



    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     for (int r=0; r<ROWS; r++) { 
      for (int c=0; c<COLS; c++) { 
       int x = c * CELL_SIZE; 
       int y = r * CELL_SIZE; 
       String text = _puzzleModel.getFace(r, c); 
       if (text != null) { 
        g.setColor(Color.gray); 
        g.fillRect(x+2, y+2, CELL_SIZE-4, CELL_SIZE-4); 
        g.setColor(Color.black); 
        g.setFont(_biggerFont); 
        g.drawString(text, x+20, y+(3*CELL_SIZE)/4); 
       } 
      } 
     } 
    } 



    public void mousePressed(MouseEvent e) { 

     int col = e.getX()/CELL_SIZE; 
     int row = e.getY()/CELL_SIZE; 

     if (!_puzzleModel.moveTile(row, col)) { 

      Toolkit.getDefaultToolkit().beep(); 
     } 

     this.repaint(); 
    } 



    public void mouseClicked (MouseEvent e) {} 
    public void mouseReleased(MouseEvent e) {} 
    public void mouseEntered (MouseEvent e) {} 
    public void mouseExited (MouseEvent e) {} 
} 

public class NewGameAction implements ActionListener { 
    public void actionPerformed(ActionEvent e) { 
     _puzzleModel.reset(); 
     _puzzleGraphics.repaint(); 
    } 
} 
public class ResetAction implements ActionListener { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     _puzzleModel.tryAgain(); 
     _puzzleGraphics.repaint(); 

    } 

} 

public class solveAction implements ActionListener 
{ 

    @Override 
    public void actionPerformed(ActionEvent e) 
     { 
      _puzzleModel.solve(); 
      _puzzleGraphics.repaint(); 

     } 

    } 
} 
+0

你得到了什么错误,在哪里? –

+0

好吧,现在你输入的是长度和宽度,但不对它们做任何事情,并且在'GraphicsPanel'中对行和列使用常量。可能将长度和宽度参数添加到'SlidePuzzleGUI'构造函数和'GraphicsPanel'构造函数中?然后,主程序在构造'SlidePuzzleGUI'时使用它们,并且在构造'GraphicsPanel'时使用'SlidePuzzleGUI' ......或者还有其他一些问题吗? – ajb

回答

3

你重点班有没有setter方法或构造函数的参数,使您可以通过长和宽度给他们。如果你想改变他们国家的这一方面,那么他们必须有一个机制来做到这一点。目前你的GraphicsPanel被硬编码以使用ROWS和COLS常量,这将很难改变。相反,将所有这些硬编码替换为变量,并确保它们默认为默认构造函数中的ROWS和COLS常量,但也提供了一个非默认构造函数,允许程序员通过不同的行和列设置。


编辑
你得

  • 使用构造函数的参数来设定领域,使整个类可以使用这些值,而不仅仅是构造函数。
  • 致电正确的构造函数,需要参数!

public MyConstructor(int x, int y) { 
    this.x = x; 
    this.y = y; 
} 
+0

我试图把它们放在构造函数的参数中,但是这给了我错误,如果你给我一分钟我可以重新键入我之前尝试的内容 – user2776808

+0

@ user2776808:将更改后的代码添加到当前文章的底部,但保留当前代码也到位。 –

+0

添加了一些编辑 – user2776808