2

这是我的滑块益智游戏。到目前为止,它只能进行 3x3 游戏。当我尝试传递板的变量 l 和 w(长度和宽度)时,它不起作用。它仅在我将变量 ROWS 和 COLS 设置为 final 时才有效。当我尝试更改它时,我得到了错误。我不知道该怎么做,任何帮助将不胜感激。

目前,用户可以输入目前无法执行任何操作的值。游戏开始时,会生成一个 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();

此类包含滑块拼图的 GUI

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

我将如何制作以便用户可以指定游戏板的尺寸?

编辑公共课 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();

        }

    }
}
4

1 回答 1

3

您的关键类没有允许您将长度和宽度传递给它们的设置方法或构造函数参数。如果你想改变他们状态的这个方面,那么他们必须有一个机制来做到这一点。目前,您的 GraphicsPanel 被硬编码为使用 ROWS 和 COLS 常量,这将很难更改。而是将所有这些硬编码替换为变量,并确保将它们默认为默认构造函数中的 ROWS 和 COLS 常量,但还提供非默认构造函数,允许程序员传入不同的行和列设置。


编辑
你必须

  • 使用构造函数参数设置类字段,以便整个类可以使用这些值,而不仅仅是构造函数。
  • 调用正确的构造函数,即需要参数的构造函数!

IE,

public MyConstructor(int x, int y) {
   this.x = x;
   this.y = y;
}
于 2013-10-02T02:02:03.147 回答