Auch wenn ich hier wieder allen den Spaß verderbe, aber hier ist meine objektorientierte Lösung (im Sinne von, die Zellen sind selbst für’s Aufdecken verantwortlich) …public void uncover() { if (isBomb) { JOptionPane.showConfirmDialog(null, "you hit a bomb", "Looser!", JOptionPane.ERROR_MESSAGE); throw new RuntimeException("Game Over"); } else { isUncovered = true; defaultTableModel.fireTableDataChanged(); if (0 == neigbourBombCount) { for (Cell cell : neigbours) { cell.uncoverByNeigbour(); } } } } private void uncoverByNeigbour() { if (!isUncovered) { uncover(); } } public void addNeigbour(Cell cell) { neigbours.add(cell); neigbourBombCount += cell.isBomb ? 1 : 0; }
KSKB
[spoiler]Die Buttons in der Zelle habe ich kopiert, die funktionieren nicht so richtig, man muss auf eine zweite Zelle klicken, damit was passiert…```package minesweeper;
import java.awt.Component;
import java.awt.Dimension;
import java.util.Collection;
import java.util.EventObject;
import java.util.HashSet;
import java.util.Random;
import javax.swing.AbstractCellEditor;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
public class MinesweeperTest {
private static final int MAX_I = 20;
private static final int MAX_J = 20;
int bombChanceInPercent = 10;
private static class Cell {
private final boolean isBomb;
int neigbourBombCount;
private boolean isUncovered = false;
private final Collection<Cell> neigbours = new HashSet<MinesweeperTest.Cell>();
private DefaultTableModel defaultTableModel;
public Cell(boolean isBomb, int i, int j, DefaultTableModel defaultTableModel) {
super();
this.isBomb = isBomb;
this.defaultTableModel = defaultTableModel;
}
public String getDisplay() {
return isUncovered ? (isBomb ? "B" : 0 == neigbourBombCount ? " " : String.valueOf(neigbourBombCount))
: "*";
}
public void uncover() {
if (isBomb) {
String title = "Looser!";
Object message = "you hit a bomb";
JOptionPane.showConfirmDialog(null, message, title, JOptionPane.ERROR_MESSAGE);
throw new RuntimeException("Game Over");
} else {
isUncovered = true;
defaultTableModel.fireTableDataChanged();
if (0 == neigbourBombCount) {
for (Cell cell : neigbours) {
cell.uncoverByNeigbour();
}
}
}
}
private void uncoverByNeigbour() {
if (!isUncovered) {
uncover();
}
}
public void addNeigbour(Cell cell) {
neigbours.add(cell);
neigbourBombCount += cell.isBomb ? 1 : 0;
}
}
public static void main(String[] args) {
new MinesweeperTest().start();
}
@SuppressWarnings("serial")
private void start() {
Cell[][] cells = new Cell[MAX_I][MAX_J];
DefaultTableModel defaultTableModel = new DefaultTableModelExtension(cells);
Random random = new Random();
for (int i = 0; i < MAX_I; i++) {
for (int j = 0; j < MAX_J; j++) {
cells**[j] = new Cell(bombChanceInPercent > random.nextInt(100), i, j, defaultTableModel);
}
}
for (int i = 0; i < MAX_I; i++) {
for (int j = 0; j < MAX_J; j++) {
if (0 < j)
cells**[j].addNeigbour(cells**[j - 1]);
if (j < MAX_J - 1)
cells**[j].addNeigbour(cells**[j + 1]);
if (0 < i)
cells**[j].addNeigbour(cells[i - 1][j]);
if (i < MAX_I - 1)
cells**[j].addNeigbour(cells[i + 1][j]);
if (0 < i)
if (0 < j)
cells**[j].addNeigbour(cells[i - 1][j - 1]);
if (0 < i)
if (j < MAX_J - 1)
cells**[j].addNeigbour(cells[i - 1][j + 1]);
if (i < MAX_I - 1)
if (0 < j)
cells**[j].addNeigbour(cells[i + 1][j - 1]);
if (i < MAX_I - 1)
if (j < MAX_J - 1)
cells**[j].addNeigbour(cells[i + 1][j + 1]);
}
}
JTable jTable = new JTable(defaultTableModel);
EditorAndRenderer editorAndRenderer = new EditorAndRenderer();
jTable.setDefaultRenderer(String.class, editorAndRenderer);
jTable.setDefaultEditor(String.class, editorAndRenderer);
jTable.setMaximumSize(new Dimension(10 * MAX_I, 10 * MAX_J));
JOptionPane.showMessageDialog(null, jTable);
}
@SuppressWarnings("serial")
class EditorAndRenderer extends AbstractCellEditor implements TableCellEditor, TableCellRenderer {
private final JButton renderer = new JButton();
private final JButton editor = new JButton();
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
renderer.setText((String) value);
renderer.setMaximumSize(new Dimension(10, 10));
return renderer;
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row,
int column) {
editor.setText((String) value);
editor.setMinimumSize(new Dimension(10, 10));
return editor;
}
@Override
public Object getCellEditorValue() {
return editor.getText();
}
@Override
public boolean isCellEditable(EventObject ev) {
return true;
}
@Override
public boolean shouldSelectCell(EventObject ev) {
return false;
}
}
private final class DefaultTableModelExtension extends DefaultTableModel {
private Cell[][] cells;
public DefaultTableModelExtension(Cell[][] cells) {
this.cells = cells;
// TODO Auto-generated constructor stub
}
@Override
public int getRowCount() {
return MAX_I;
}
@Override
public int getColumnCount() {
return MAX_J;
}
@Override
public String getColumnName(int columnIndex) {
return null;
}
@Override
public Class<?> getColumnClass(int columnIndex) {
return String.class;
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return !cells[rowIndex][columnIndex].isUncovered;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
return cells[rowIndex][columnIndex].getDisplay();
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
cells[rowIndex][columnIndex].uncover();
}
}
}```[/spoiler]
bye
TT