0

我是新手,所以请不要烫伤我,因为我只想从一开始就遵循良好的 OOP 路径:) 所以我正在使用 Swing 用 Ja​​va 编写扫雷器,现在,我的代码看起来像这样:

  • 一个只有 main() 的类,它通过创建一个对象 Minesweeper() 来开始游戏
  • Minesweeper 类,我在其中创建 JFRame,JPanel 用于菜单(以及 ActionListener)并创建 Grid(x,y) 对象
  • 扩展 JPanel 的 Grid(int width, int height) 类,我使用它创建具有给定尺寸的网格,在其上放置地雷并处理所有播放

不过,我对 Grid() 有点担心。是否可以处理所有事情,从绘制所需数量的 JButton,通过设置地雷和监听点击(以及解决这些点击)到 find_empty_cells 算法,以防用户点击炸弹以外的东西,我们必须显示周围空在一个班级?这不违反单一责任原则吗?或者可以吗?

4

1 回答 1

1

我对swing不熟悉,所以只能给你一些伪java代码。但是,它应该服务于演示目的。当您想达到 OOP 的下一个级别时,我建议为扫雷网格中的单元格创建一个类。

public class Cell extends JPanel {

    private MinesweepController controller;
    private int points;
    private boolean revealed;

    // Index in the grid.
    private int x, y;

    public Cell(MinesweepController controller_, int x_, int y_, int points_) {
        controller = controller_;
        points = points_;
        x = x_;
        y = y_;
    }

    public void onClick(MouseEvent event) {
        controller.reveal(x, y);
    }

    public void paint(Graphics gfx) {
        if (revealed) {
            if (points < 0) {
                drawBomb(getX(), getY())
            }
            else {
                drawPoints(getX(), getY(), points);
            }
        }
        else {
            drawRect(getX(), getY());
        }
    }

    public int getPoints() {
        return points;
    }

    public boolean isRevealed() {
        return revealed;
    }

    public void reveal() {
        revealed = true;
    }

}

public class MinesweepController {

    private Grid grid;
    private int score;

    // ...

    public boid reveal(int x, int y) {
        Cell cell = grid.getCell(x, y);
        if (cell.getPoints() < 0) {
            // End game.
        }
        else {
            score += cell.getPoints();
            // Reveal ascending cells.
        }
    }

}
于 2013-01-11T10:54:17.650 回答