85 lines
2.3 KiB
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;
|
|
}
|
|
}
|