Files
NodeCames/src/main/java/com/bernard/nodecames/model/GridConfig.java
T
2026-09-11 03:04:02 +02:00

157 lines
5.9 KiB
Java

package com.bernard.nodecames.model;
import static com.bernard.nodecames.model.GridConfig.CardColors.BB;
import static com.bernard.nodecames.model.GridConfig.CardColors.BG;
import static com.bernard.nodecames.model.GridConfig.CardColors.BW;
import static com.bernard.nodecames.model.GridConfig.CardColors.GB;
import static com.bernard.nodecames.model.GridConfig.CardColors.GG;
import static com.bernard.nodecames.model.GridConfig.CardColors.GW;
import static com.bernard.nodecames.model.GridConfig.CardColors.WB;
import static com.bernard.nodecames.model.GridConfig.CardColors.WG;
import static com.bernard.nodecames.model.GridConfig.CardColors.WW;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import com.bernard.nodecames.model.Card.Color;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Value;
@Getter
@AllArgsConstructor
public class GridConfig {
public static final List<CardColors> CLASSICAL25 = List.of(
BB,BW,WB,BG,GB,GG,GG,GG,WG,WG,WG,WG,WG,GW,GW,GW,GW,GW,WW,WW,WW,WW,WW,WW,WW
);
public static final Set<Integer> BASE_HINTWORDCOUNT = Set.of(
0,1,2,3,4,5,6,7,8,9,-1
);
public static final GridConfig CODENAMES_CLASSICAL = new GridConfig(
9, true, true, CLASSICAL25, true,
true, true, 9, BASE_HINTWORDCOUNT, true,
Integer.MAX_VALUE, true, true,
true, false);
public static final GridConfig ZERO = new GridConfig(
9, false, false, CLASSICAL25, true,
true, false, 1, Set.of(1), false,
3, false, false,
false, false);
// Immutable options
// Maximum of maximom number of hints
// This is to trigger end of game
private int maxMaxHint;
private boolean structuredGrid;
private boolean anyoneStarts;
private List<CardColors> wordDistribution;
private boolean maybeSuddenDeath; //TODO
private boolean maybeOneMoreGuess; //TODO
// If onlyOneGreenGreen is false and having it true would have meant we won,
// prevend death and enter WIN_IF_GREEN_GREEN state, else just die
private boolean onlyOneGreenGreenPreventDeath;
// Mutable options
private int maxHint;
private Set<Integer> availableHintWordCount;
private boolean oneMoreGuess;
private int hintMaxLength;
private boolean endGuessing;
private boolean onlyOneGreenGreen;
private boolean suddenDeath;
private boolean hintsInARow;
public int getWordCount() {
return wordDistribution.size();
}
public void set(MutableOption opt, Object value) {
try{
switch(opt) {
case MAX_HINT:
this.maxHint = (Integer) value;
return;
case AVAILABLE_HINT_WORD_COUNT:
// We check value is a set of integers
this.availableHintWordCount = ((Set<?>)value).stream().map(i -> (Integer)i).collect(Collectors.toUnmodifiableSet());
return;
case ONE_MORE_GUESS:
this.oneMoreGuess = (Boolean) value;
return;
case HINT_MAX_LENGTH:
this.hintMaxLength = (Integer) value;
return;
case END_GUESSING:
this.endGuessing = (Boolean) value;
return;
case ONLY_ONE_GREEN_GREEN:
this.onlyOneGreenGreen = (Boolean) value;
return;
case SUDDEN_DEATH:
this.suddenDeath = (Boolean) value;
return;
case HINTS_IN_A_ROW:
this.hintsInARow = (Boolean) value;
return;
}
} catch (ClassCastException e) {
throw new IllegalArgumentException("Given value does not have the right type: "+opt.getDataClass().toGenericString(),e);
}
}
public Map<MutableOption, Object> getMutableOptions() {
return Map.of(
MutableOption.MAX_HINT, this.getMaxHint(),
MutableOption.AVAILABLE_HINT_WORD_COUNT, this.getAvailableHintWordCount(),
MutableOption.ONE_MORE_GUESS, this.isOneMoreGuess(),
MutableOption.HINT_MAX_LENGTH, this.getHintMaxLength(),
MutableOption.END_GUESSING, this.isEndGuessing(),
MutableOption.ONLY_ONE_GREEN_GREEN, this.isOnlyOneGreenGreen(),
MutableOption.SUDDEN_DEATH, this.isSuddenDeath(),
MutableOption.HINTS_IN_A_ROW, this.isHintsInARow()
);
}
public static final boolean isGenericallyValidHintWordCount(int i) {
return 0 <= i || i == -1;
}
@Value(staticConstructor = "of")
public static final class CardColors {
Color faceA;
Color faceB;
public static final CardColors WW = CardColors.of(Color.WHITE, Color.WHITE);
public static final CardColors WB = CardColors.of(Color.WHITE, Color.BLACK);
public static final CardColors BW = CardColors.of(Color.BLACK, Color.WHITE);
public static final CardColors WG = CardColors.of(Color.WHITE, Color.GREEN);
public static final CardColors GW = CardColors.of(Color.GREEN, Color.WHITE);
public static final CardColors GG = CardColors.of(Color.GREEN, Color.GREEN);
public static final CardColors GB = CardColors.of(Color.GREEN, Color.BLACK);
public static final CardColors BG = CardColors.of(Color.BLACK, Color.GREEN);
public static final CardColors BB = CardColors.of(Color.BLACK, Color.BLACK);
}
@AllArgsConstructor
@Getter
public enum MutableOption {
MAX_HINT(Integer.class),
AVAILABLE_HINT_WORD_COUNT(Set.class),
ONE_MORE_GUESS(Boolean.class),
HINT_MAX_LENGTH(Integer.class),
END_GUESSING(Boolean.class),
ONLY_ONE_GREEN_GREEN(Boolean.class),
SUDDEN_DEATH(Boolean.class),
HINTS_IN_A_ROW(Boolean.class);
Class<?> dataClass;
}
}