maze-generator/src/main/java/ch/fritteli/maze/generator/model/Tile.java

85 lines
2.3 KiB
Java

package ch.fritteli.maze.generator.model;
import io.vavr.collection.Stream;
import io.vavr.control.Option;
import lombok.AccessLevel;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NonNull;
import lombok.ToString;
import lombok.experimental.FieldDefaults;
import java.util.EnumSet;
import java.util.Random;
@FieldDefaults(level = AccessLevel.PRIVATE)
@EqualsAndHashCode
@ToString
public class Tile {
final Walls walls = new Walls();
boolean visited = false;
@Getter
boolean solution = false;
public Tile() {
this.walls.setAll();
}
/**
* INTERNAL API.
* Exists only for deserialization. Not to be called from user code.
*
* @param walls
* @param solution
*/
private Tile(@NonNull final EnumSet<Direction> walls, final boolean solution) {
for (final Direction direction : walls) {
this.walls.set(direction);
this.walls.harden(direction);
}
this.visited = true;
this.solution = solution;
}
public void preventDiggingToOrFrom(@NonNull final Direction direction) {
this.walls.harden(direction);
}
public void enableDiggingToOrFrom(@NonNull final Direction direction) {
this.walls.unharden(direction);
}
public boolean digFrom(@NonNull final Direction direction) {
if (this.visited) {
return false;
}
this.visited = true;
return this.walls.clear(direction);
}
public boolean digTo(@NonNull final Direction direction) {
return this.walls.clear(direction);
}
public void undigTo(@NonNull final Direction direction) {
this.walls.set(direction);
}
public Option<Direction> getRandomAvailableDirection(@NonNull final Random random) {
final Stream<Direction> availableDirections = this.walls.getUnhardenedSet();
if (availableDirections.isEmpty()) {
return Option.none();
}
final int index = random.nextInt(availableDirections.length());
return Option.of(availableDirections.get(index));
}
public boolean hasWallAt(@NonNull final Direction direction) {
return this.walls.isSet(direction);
}
public void setSolution() {
this.solution = true;
}
}