|
|
@ -0,0 +1,149 @@ |
|
|
|
package Minesweeper; |
|
|
|
|
|
|
|
import java.awt.Point; |
|
|
|
|
|
|
|
import javax.swing.JOptionPane; |
|
|
|
|
|
|
|
public class Playfield { |
|
|
|
|
|
|
|
private static final int CELLSIZE = 50; |
|
|
|
public int Size; |
|
|
|
private MinesweeperGame MsG; |
|
|
|
public Cell[][] cells; |
|
|
|
private int bombAmount; |
|
|
|
private int cellsFlooded = 0; |
|
|
|
|
|
|
|
public Playfield(MinesweeperGame _MsG, int _Size, int _bombAmount) { |
|
|
|
MsG = _MsG; |
|
|
|
Size = _Size; |
|
|
|
bombAmount = _bombAmount; |
|
|
|
generatePlayfield(); |
|
|
|
} |
|
|
|
|
|
|
|
public void generatePlayfield() { |
|
|
|
|
|
|
|
cells = new Cell[Size][Size]; |
|
|
|
|
|
|
|
int[] bPlacement = new int[bombAmount]; |
|
|
|
for (int i = 0; i < bPlacement.length; i++) { |
|
|
|
bPlacement[i] = (int) (Math.random() * Size * Size); |
|
|
|
|
|
|
|
for (int j = 0; j < i; j++) { |
|
|
|
if (bPlacement[i] == bPlacement[j]) { |
|
|
|
i--; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
for (int i = 0; i < Size; i++) { |
|
|
|
for (int j = 0; j < Size; j++) { |
|
|
|
cells[i][j] = new Cell(CellType.Number, this, new Point(j, i)); |
|
|
|
|
|
|
|
cells[i][j].setBounds(j * CELLSIZE + (MsG.WIDTH / 2 - Size * CELLSIZE / 2), |
|
|
|
i * CELLSIZE + (MsG.HEIGTH / 2 - Size * CELLSIZE / 2), CELLSIZE, CELLSIZE); |
|
|
|
MsG.add(cells[i][j]); |
|
|
|
for (int k = 0; k < bPlacement.length; k++) { |
|
|
|
if (bPlacement[k] == i * Size + j) { |
|
|
|
cells[i][j].type = CellType.Bomb; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
for (int i = 0; i < Size; i++) { |
|
|
|
for (int j = 0; j < Size; j++) { |
|
|
|
if (cells[i][j].type == CellType.Number) { |
|
|
|
calculateBombProximity(i, j); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
MsG.repaint(); |
|
|
|
} |
|
|
|
|
|
|
|
public void reset() { |
|
|
|
cellsFlooded = 0; |
|
|
|
for (int i = 0; i < Size; i++) { |
|
|
|
for (int j = 0; j < Size; j++) { |
|
|
|
MsG.remove(cells[i][j]); |
|
|
|
} |
|
|
|
} |
|
|
|
generatePlayfield(); |
|
|
|
} |
|
|
|
|
|
|
|
public void calculateBombProximity(int row, int column) { |
|
|
|
|
|
|
|
if (row > 0) { |
|
|
|
if (column > 0) { |
|
|
|
if (cells[row - 1][column - 1].type == CellType.Bomb) { |
|
|
|
cells[row][column].value++; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (cells[row - 1][column].type == CellType.Bomb) { |
|
|
|
cells[row][column].value++; |
|
|
|
} |
|
|
|
|
|
|
|
if (column < cells.length - 1) { |
|
|
|
if (cells[row - 1][column + 1].type == CellType.Bomb) { |
|
|
|
cells[row][column].value++; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (row < cells.length - 1) { |
|
|
|
if (column > 0) { |
|
|
|
if (cells[row + 1][column - 1].type == CellType.Bomb) { |
|
|
|
cells[row][column].value++; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (cells[row + 1][column].type == CellType.Bomb) { |
|
|
|
cells[row][column].value++; |
|
|
|
} |
|
|
|
|
|
|
|
if (column < cells.length - 1) { |
|
|
|
if (cells[row + 1][column + 1].type == CellType.Bomb) { |
|
|
|
cells[row][column].value++; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (column > 0) { |
|
|
|
if (cells[row][column - 1].type == CellType.Bomb) { |
|
|
|
cells[row][column].value++; |
|
|
|
} |
|
|
|
} |
|
|
|
if (column < cells.length - 1) { |
|
|
|
if (cells[row][column + 1].type == CellType.Bomb) { |
|
|
|
cells[row][column].value++; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
public void cellFlooded() { |
|
|
|
cellsFlooded++; |
|
|
|
if (cellsFlooded >= Size * Size - bombAmount) { |
|
|
|
revealAllBombs(); |
|
|
|
JOptionPane.showMessageDialog(MsG, "You won, congratulations!"); |
|
|
|
reset(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public void revealAllBombs() { |
|
|
|
for (int i = 0; i < Size; i++) { |
|
|
|
for (int j = 0; j < Size; j++) { |
|
|
|
if(cells[i][j].type == CellType.Bomb) { |
|
|
|
cells[i][j].reveal(); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
MsG.repaint(); |
|
|
|
} |
|
|
|
|
|
|
|
public void cellDried() { |
|
|
|
cellsFlooded--; |
|
|
|
} |
|
|
|
} |