Тетрис, больше тетриса! Этот тетрис оказался поголоволомней прошлого. Общая идея была понятна сразу, но «на местности» постоянно вылезали какие-то подводные камешки 🙂
Сначала думал пойти через byte[][]
, выставляя нужные биты в единицу (на что намекала ширина поля), но закопался в сдвигах (жаль, что ввод не оказался набором сдвиговых операций, или я не разгадал его).
Ну, хотя бы с идеей движения «окном» не промахнулся — во второй части она пригодилась.
Подготовительная работа
enum Move {
LEFT,
RIGHT;
private static final Map<Character, Move> cache = Map.of('<', LEFT, '>', RIGHT);
static Move of(char code) {
return cache.get(code);
}
}
class Triple {
public int left;
public int middle;
public List<Integer> right;
public Triple(int left, int middle, List<Integer> right) {
this.left = left;
this.middle = middle;
this.right = right;
}
public boolean equals(Object obj) {
if (obj == this) {
return true;
} else if (!(obj instanceof Triple)) {
return false;
} else {
Triple other = (Triple) obj;
return Objects.equals(left, other.left)
&& Objects.equals(middle, other.middle)
&& Objects.equals(right, other.right);
}
}
public int hashCode() {
return Objects.hashCode(left) ^ Objects.hashCode(middle)
^ Objects.hashCode(right);
}
}
static boolean hasMove(boolean[][] shape, int x, int y, Map<Integer, boolean[]> rows) {
for (int yIdx = 0; yIdx < shape.length; yIdx++) {
int currentY = y + (shape.length - yIdx);
if (rows.containsKey(currentY)) {
boolean[] shapeRow = shape[yIdx];
boolean[] fieldRow = rows.get(currentY);
for (int xIdx = 0; xIdx < shapeRow.length; xIdx++) {
if (fieldRow[x + xIdx] && shapeRow[xIdx]) return false;
}
}
}
return true;
}
Triple
позаимствовал в Apache Commons, чтобы не изгаляться с импортом в консольный скрипт.