0

私は初心者なので、最初から良いOOPトレイルをたどりたいだけなので、あまりやけどしないでください:)だから、Swingを使用してJavaでマインスイーパをコーディングしています。今のところ、私のコードはこのような:

  • オブジェクト Minesweeper() を作成してゲームを開始する main() のみを持つクラス
  • メニュー用の JFRame、JPanel (およびそのための ActionListener) を作成し、Grid(x,y) オブジェクトを作成する Minesweeper クラス
  • JPanel を拡張する Grid(int width, int height) クラスを使用して、指定された寸法のグリッドを作成し、その上に地雷を置き、すべての再生を処理します

ただし、Grid() にはいくつかの懸念があります。ユーザーが爆弾以外の何かをクリックして周囲を表示する必要がある場合に備えて、必要な数の JButton の描画から、地雷の設定、クリックのリッスン (およびそれらのクリックへの対処) まで、finding_empty_cells アルゴリズムまですべてを処理しても問題ありませんか? 1つのクラスで空になりますか?それは単一責任の原則に違反していませんか?それとも大丈夫ですか?

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 に答える