リンク済み: MouseListener を使用してグリッド内のセル範囲を選択する
2 つのグリッドを持つ戦艦ゲームを作成しています。ユーザーは自分の船を 1 つのグリッドに配置してから、もう 1 つのグリッドを爆撃します。
10x10 のセルのグリッドを作成する Grid という抽象クラスがあります (これは JPanel クラスを拡張します)。次のように、各セルにリスナーを与えます。
public Grid() {
setPreferredSize(new Dimension(300, 300));
setLayout(new GridLayout(GRID_SIZE,GRID_SIZE));
for (int x = 0; x < GRID_SIZE; x++)
for (int y = 0; y < GRID_SIZE; y++) {
final Cell cell = new Cell(x, y);
cellArray[x][y] = cell;
add(cell);
cell.addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
mouseClick(e, cellArray);
}
@Override
public void mouseEntered(MouseEvent e) {
mouseEnter(e, cellArray);
}
@Override
public void mouseExited(MouseEvent e) {
mouseExit(e, cellArray);
}
@Override
public void mousePressed(MouseEvent e) {
mousePress(e, cellArray);
}
@Override
public void mouseReleased(MouseEvent e) {
mouseRelease(e, cellArray);
}
});
}
}
したがって、これらのリスナーは 2 つのサブクラスからアクセスできます。リスナーは、上記のコードに見られるように別のメソッドを呼び出します。これらのメソッドはコンストラクタの下に含まれており、すべて抽象的です。
public abstract void mouseClick(MouseEvent e, Cell[][] cellArray);
public abstract void mouseEnter(MouseEvent e, Cell[][] cellArray);
public abstract void mouseExit(MouseEvent e, Cell[][] cellArray);
public abstract void mousePress(MouseEvent e, Cell[][] cellArray);
public abstract void mouseRelease(MouseEvent e, Cell[][] cellArray);
次に、2 つの具体的なサブクラスを作成します。1 つは「プレイヤー グリッド」用で、もう 1 つは「コンピューター グリッド」用です。主な違いは、プレーヤー グリッドでは、リスナーを使用してすぐに船を配置することです。コンピューター グリッドでは、船は自動的に配置されます (クラスのオブジェクトが構築されるときに行われます)。
つまり、Computer グリッド クラスのリスナーは、ユーザーが正方形を爆撃しようとする試みに応答するためだけに存在するということです。プレイヤー グリッドは、船が配置されると、コンピューターによって自動的に爆撃されるはずです。
これは私が困難に遭遇したところです。PlayerGrid クラスに computerAttack() というメソッドを作成しましたが、クラスの外部からメソッドにアクセスする方法がわかりません。2 つのサブクラスを通信させるにはどうすればよいですか? さらに、これはそれを行う適切な方法ですか、それともこれら 2 つのクラスでやりすぎているのでしょうか? ここでは必要なだけ多くの情報を提供しようとしましたが、2 つのサブクラスの実際の内容が必要な場合は、それらを提供できます。