rename references

This commit is contained in:
2023-09-28 20:24:18 +08:00
parent 50b5f8c2c1
commit 0be2781d70
274 changed files with 0 additions and 0 deletions

View File

@ -0,0 +1,197 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package minesweeper.gamestate;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import minesweeper.random.DefaultRNG;
import minesweeper.random.RNG;
import minesweeper.settings.GameSettings;
import minesweeper.structure.Location;
/**
* A Version of Minesweeper where the first click can be a mine
* @author David
*/
public class GameStateHard extends GameStateModelViewer {
private final int[][] board;
private RNG rng;
public GameStateHard(GameSettings gameSettings) {
this(gameSettings, new Random().nextLong());
}
public GameStateHard(GameSettings gameSettings, long seed) {
super(gameSettings, seed);
this.board = new int[width][height];
this.rng = DefaultRNG.getRNG(seed);
}
// in this gamestate we are building the board ourselves
@Override
protected void startHandle(Location m) {
int i=0;
while (i < mines) {
int y1 = (int) rng.random(this.height);
int x1 = (int) rng.random(this.width);
Location l1 = new Location(x1, y1);
if (board[x1][y1] != GameStateModel.MINE) {
//System.out.println("Mine added at " + x1 + "," + y1);
board[x1][y1] = GameStateModel.MINE;
i++;
// tell all the surrounding squares they are next to a mine
for (int j=0; j < DX.length; j++) {
if (x1 + DX[j] >= 0 && x1 + DX[j] < this.width && y1 + DY[j] >= 0 && y1 + DY[j] < this.height) {
if (board[x1+DX[j]][y1+DY[j]] != GameStateModel.MINE) {
board[x1+DX[j]][y1+DY[j]]++;
}
}
}
}
}
}
// in this gamestate there is nothing to do
@Override
protected void placeFlagHandle(Location m) {
}
@Override
protected int queryHandle(int x, int y) {
return board[x][y];
}
// in this gamestate we need to expand the clear if no mines are adjacent
@Override
protected boolean clearSquareHitMine(Location m) {
// if there are no mines next to this location expand reveal
if (board[m.x][m.y] == 0) {
explode(m);
//clearSurround(m);
}
if (board[m.x][m.y] == GameStateModel.MINE) {
return true;
} else {
return false;
}
//return board[m.x][m.y];
}
@Override
public int privilegedQuery(Location m, boolean showMines) {
int result = query(m);
if (result == GameStateModel.MINE) { // if we can see a mine using query it must be exploded
return GameStateModel.EXPLODED_MINE;
}
if (showMines && result == GameStateModel.HIDDEN && board[m.x][m.y] == GameStateModel.MINE) {
result = GameStateModel.MINE;
}
return result;
}
@Override
public String showGameKey() {
return "Seed = " + seed + " (" + rng.shortname() + ")";
}
/*
private void explode(Location loc) {
boolean[][] done = new boolean[width][height];
List<Location> interiorList = new ArrayList<>();
// add this location to the interior array list
done[loc.x][loc.y] = true;
interiorList.add(loc);
int processFrom = 0;
while (processFrom < interiorList.size()) {
// get the current location to process surrounding squares
Location cl = interiorList.get(processFrom);
for (int i=0; i < DX.length; i++) {
int x1 = cl.x + DX[i];
int y1 = cl.y + DY[i];
// check each of the surrounding squares which haven't already been checked
if (x1 >= 0 && x1 < width && y1 >= 0 && y1 < height) {
Location l = new Location(x1, y1);
if (!done[x1][y1] && query(l) == GameStateModel.HIDDEN) {
done[x1][y1] = true;
setRevealed(x1,y1);
// if this square is also a zero then add it to the list of locations to be exploded
if (query(l) == 0) {
interiorList.add(new Location(x1, y1));
}
}
}
}
processFrom++;
}
}
*/
@Override
public boolean supports3BV() {
return true;
}
@Override
protected boolean clearSurroundHandle(Location m) {
// otherwise, clear around this revealed square
for (int j=0; j < DX.length; j++) {
if (m.x + DX[j] >= 0 && m.x + DX[j] < this.width && m.y + DY[j] >= 0 && m.y + DY[j] < this.height) {
clearSquare(new Location(m.x+DX[j], m.y+DY[j]));
}
}
return true;
}
@Override
public boolean safeOpening() {
return false;
}
}