Skip to content
This repository has been archived by the owner on Feb 21, 2022. It is now read-only.

Commit

Permalink
Слияние с game-update
Browse files Browse the repository at this point in the history
  • Loading branch information
Chae4ek committed Aug 8, 2021
2 parents 75c061d + 21203e7 commit fcecbaa
Show file tree
Hide file tree
Showing 15 changed files with 302 additions and 111 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@

## Интерфейс

![Интерфейс](misc/screen.jpg)
![Интерфейс](misc/screen.png)

# Компиляция

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ public static String action(ServerToClientType type, String json)
dto.move.getFrom().column,
dto.move.getTo().row,
dto.move.getTo().column,
dto.move.getTurnInto());
dto.move.turnInto);

ClientController.drawBoard();
return null;
Expand All @@ -137,7 +137,7 @@ public static Move makeMove(
for (Move move : set) {
if (to.equals(move.getTo())) {
try {
move.setTurnInto(figureType);
move.turnInto = figureType;
GameDAO.getGame().move(move);
} catch (ChessError e) {
e.printStackTrace();
Expand Down
55 changes: 20 additions & 35 deletions game/src/main/java/io/deeplay/qchess/game/logics/MoveSystem.java
Original file line number Diff line number Diff line change
Expand Up @@ -66,9 +66,9 @@ public Figure move(Move move, boolean useHistoryRecord) throws ChessError {
}
// превращение пешки
case TURN_INTO, TURN_INTO_ATTACK -> {
FigureType turnIntoType = move.getTurnInto();
Figure turnIntoFigure =
Figure.build(turnIntoType, moveFigure.getColor(), move.getTo());
Figure.build(
move.turnInto, moveFigure.getColor(), move.getTo());
Figure removed;
if (useHistoryRecord) {
removed = board.moveFigureUgly(move);
Expand All @@ -84,7 +84,7 @@ public Figure move(Move move, boolean useHistoryRecord) throws ChessError {
Cell from = move.getFrom().createAdd(new Cell(3, 0));
Cell to = move.getFrom().createAdd(new Cell(1, 0));
Move rookMove = new Move(MoveType.QUIET_MOVE, from, to);
board.getFigureUgly(from).setWasMoved(true);
board.getFigureUgly(from).wasMoved = true;
if (useHistoryRecord) {
board.moveFigureUgly(rookMove);
yield board.moveFigureUgly(move);
Expand All @@ -97,7 +97,7 @@ public Figure move(Move move, boolean useHistoryRecord) throws ChessError {
Cell from = move.getFrom().createAdd(new Cell(-4, 0));
Cell to = move.getFrom().createAdd(new Cell(-1, 0));
Move rookMove = new Move(MoveType.QUIET_MOVE, from, to);
board.getFigureUgly(from).setWasMoved(true);
board.getFigureUgly(from).wasMoved = true;
if (useHistoryRecord) {
board.moveFigureUgly(rookMove);
yield board.moveFigureUgly(move);
Expand All @@ -111,8 +111,8 @@ public Figure move(Move move, boolean useHistoryRecord) throws ChessError {
: board.moveFigureUglyWithoutRecalcHash(move);
};

history.setHasMovedBeforeLastMove(moveFigure.wasMoved());
moveFigure.setWasMoved(true);
history.setHasMovedBeforeLastMove(moveFigure.wasMoved);
moveFigure.wasMoved = true;
history.setRemovedFigure(removedFigure);
if (useHistoryRecord) {
history.checkAndAddPeaceMoveCount(move);
Expand Down Expand Up @@ -143,7 +143,7 @@ public void undoMove(boolean useHistoryRecord) throws ChessError {
if (useHistoryRecord) board.moveFigureUgly(revertMove);
else board.moveFigureUglyWithoutRecalcHash(revertMove);
Figure figureThatMoved = board.getFigureUgly(move.getFrom());
figureThatMoved.setWasMoved(hasMoved);
figureThatMoved.wasMoved = hasMoved;

switch (move.getMoveType()) {
// взятие на проходе
Expand All @@ -152,14 +152,14 @@ public void undoMove(boolean useHistoryRecord) throws ChessError {
new Pawn(
figureThatMoved.getColor().inverse(),
history.getLastMove().getTo());
pawn.setWasMoved(true);
pawn.wasMoved = true;
if (useHistoryRecord) board.setFigureUgly(pawn);
else board.setFigureUglyWithoutRecalcHash(pawn);
}
// превращение пешки
case TURN_INTO, TURN_INTO_ATTACK -> {
Pawn pawn = new Pawn(figureThatMoved.getColor(), move.getFrom());
pawn.setWasMoved(true);
pawn.wasMoved = true;
if (useHistoryRecord) {
board.setFigureUgly(pawn);
if (removedFigure != null) board.setFigureUgly(removedFigure);
Expand All @@ -176,15 +176,15 @@ public void undoMove(boolean useHistoryRecord) throws ChessError {
Move rookMove = new Move(MoveType.QUIET_MOVE, from, to);
if (useHistoryRecord) board.moveFigureUgly(rookMove);
else board.moveFigureUglyWithoutRecalcHash(rookMove);
board.getFigureUgly(to).setWasMoved(false);
board.getFigureUgly(to).wasMoved = false;
}
case LONG_CASTLING -> {
Cell to = move.getFrom().createAdd(new Cell(-4, 0));
Cell from = move.getFrom().createAdd(new Cell(-1, 0));
Move rookMove = new Move(MoveType.QUIET_MOVE, from, to);
if (useHistoryRecord) board.moveFigureUgly(rookMove);
else board.moveFigureUglyWithoutRecalcHash(rookMove);
board.getFigureUgly(to).setWasMoved(false);
board.getFigureUgly(to).wasMoved = false;
}
default -> {
if (removedFigure != null)
Expand Down Expand Up @@ -252,11 +252,12 @@ public List<Move> getAllCorrectMoves(Color color) throws ChessError {
/** @return true если ход корректный */
private boolean isCorrectMoveWithoutCheckAvailableMoves(Move move) throws ChessError {
try {
FigureType prevTurnInto = move.turnInto;
if (move.getMoveType() == MoveType.TURN_INTO
|| move.getMoveType() == MoveType.TURN_INTO_ATTACK)
move.setTurnInto(FigureType.QUEEN); // только для проверки виртуального хода
move.turnInto = FigureType.QUEEN; // только для проверки виртуального хода
boolean isCorrect = isCorrectVirtualMove(move);
move.setTurnInto(null);
move.turnInto = prevTurnInto;
return isCorrect;
} catch (ChessException | NullPointerException e) {
logger.warn(
Expand All @@ -281,22 +282,6 @@ public boolean isHasAnyCorrectMoveSilence(Color color) {
}
}

public int getMoveCounts(Color color) {
int count = 0;
try {
for (Figure f : board.getFigures(color))
for (Move m : f.getAllMoves(gs)) {
if (m.getMoveType() == MoveType.TURN_INTO
|| m.getMoveType() == MoveType.TURN_INTO_ATTACK) {
m.setTurnInto(FigureType.QUEEN); // только для проверки виртуального хода
}
if (isCorrectVirtualMoveSilence(m)) count++;
}
} catch (ChessError ignore) {
}
return count;
}

/**
* Использует реализацию низкого уровня из доски {@link Board#getAllPreparedMoves(GameSettings
* gs, Color color)}
Expand Down Expand Up @@ -361,18 +346,18 @@ private boolean checkCorrectnessIfSpecificMove(Move move) {
// превращение пешки
if (move.getMoveType() == MoveType.TURN_INTO
|| move.getMoveType() == MoveType.TURN_INTO_ATTACK)
return move.getTurnInto() != null
&& (move.getTurnInto() == FigureType.BISHOP
|| move.getTurnInto() == FigureType.KNIGHT
|| move.getTurnInto() == FigureType.QUEEN
|| move.getTurnInto() == FigureType.ROOK);
return move.turnInto != null
&& move.turnInto != FigureType.KING
&& move.turnInto != FigureType.PAWN;
return true;
}

/** @return true если ход лежит в доступных */
private boolean inAvailableMoves(Move move)
throws ChessException, ArrayIndexOutOfBoundsException {
return board.getFigureUgly(move.getFrom()).getAllMoves(gs).contains(move);
for (Move m : board.getFigureUgly(move.getFrom()).getAllMoves(gs))
if (m.equalsWithoutTurnInto(move)) return true;
return false;
}

@FunctionalInterface
Expand Down
22 changes: 11 additions & 11 deletions game/src/main/java/io/deeplay/qchess/game/model/Board.java
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ public List<Move> getAllPreparedMoves(GameSettings gs, Color color) throws Chess
for (Move move : figure.getAllMoves(gs)) {
if (move.getMoveType() == MoveType.TURN_INTO
|| move.getMoveType() == MoveType.TURN_INTO_ATTACK) {
move.setTurnInto(FigureType.QUEEN); // 1 тип превращения
move.turnInto = FigureType.QUEEN; // 1 тип превращения
// проверка на шах превращения (проверка для других типов
// превращения эквивалентна):
if (gs.moveSystem.isCorrectVirtualMoveSilence(move)) {
Expand Down Expand Up @@ -183,7 +183,7 @@ public boolean isHasAnyCorrectMove(GameSettings gs, Color color) throws ChessErr
if (move.getMoveType() == MoveType.TURN_INTO
|| move.getMoveType() == MoveType.TURN_INTO_ATTACK) {
// только для проверки виртуального хода:
move.setTurnInto(FigureType.QUEEN);
move.turnInto = FigureType.QUEEN;
// убирать фигуру не нужно, т.к. это копия хода
}
// проверка на шах хода пешки:
Expand Down Expand Up @@ -330,7 +330,7 @@ public Cell findKingCell(Color color) {
public int isCastlingPossible(Color color) throws ChessError {
Figure king = findKing(color);
if (king == null) throw new ChessError(KING_NOT_FOUND);
if (king.wasMoved()) return 0;
if (king.wasMoved) return 0;
return (isNotLeftRookStandardMoved(color) ? 1 : 0)
+ (isNotRightRookStandardMoved(color) ? 2 : 0);
}
Expand All @@ -344,7 +344,7 @@ public boolean isNotLeftRookStandardMoved(Color color) {
return rook != null
&& rook.figureType == FigureType.ROOK
&& rook.getColor() == color
&& !rook.wasMoved();
&& !rook.wasMoved;
}

/**
Expand All @@ -356,7 +356,7 @@ public boolean isNotRightRookStandardMoved(Color color) {
return rook != null
&& rook.figureType == FigureType.ROOK
&& rook.getColor() == color
&& !rook.wasMoved();
&& !rook.wasMoved;
}

/**
Expand All @@ -372,7 +372,7 @@ public Figure moveFigure(Move move) throws ChessException {
Figure figureFrom = getFigure(move.getFrom());
Figure figureTo = getFigure(move.getTo());
figureFrom.setCurrentPosition(move.getTo());
figureFrom.setWasMoved(true);
figureFrom.wasMoved = true;
setFigure(figureFrom);
removeFigure(move.getFrom());
logger.trace("Фигура была перемещена: {}", move);
Expand Down Expand Up @@ -480,11 +480,11 @@ public Figure removeFigureUglyWithoutRecalcHash(Cell cell) {

/** @return true, если клетка лежит на доске и она пустая, иначе false */
public boolean isEmptyCell(Cell cell) {
int column = cell.column;
int row = cell.row;
if (column >= 0 && row >= 0 && column < boardSize && row < boardSize)
return cells[row][column] == null;
return false;
try {
return cells[cell.row][cell.column] == null;
} catch (ArrayIndexOutOfBoundsException e) {
return false;
}
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,7 @@ private String getCastlingPossibility(Color color) throws ChessError {

Figure king = gameSettings.board.findKing(color);
if (king == null) throw new ChessError(KING_NOT_FOUND);
if (king.wasMoved()) return res;
if (king.wasMoved) return res;
if (gameSettings.board.isNotRightRookStandardMoved(color)) res += "k";
if (gameSettings.board.isNotLeftRookStandardMoved(color)) res += "q";

Expand Down
55 changes: 28 additions & 27 deletions game/src/main/java/io/deeplay/qchess/game/model/Move.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,20 +14,8 @@ public class Move {
@SerializedName("to")
private final Cell to;

/**
* Не должно влиять на equals и hashCode, чтобы, проверяя корректность ходов, у пешек не
* возникали дополнительные условия, т.к. пешки на доске не знают во что превратиться без
* запроса игрока, смотреть {@link
* io.deeplay.qchess.game.logics.MoveSystem#inAvailableMoves(Move move)}.
*
* <p>Он использует {@link java.util.List#contains(Object o)}, поэтому turnInto должно быть
* {@code null}. Проверка пешки на превращение вынесена в {@link
* io.deeplay.qchess.game.logics.MoveSystem#checkCorrectnessIfSpecificMove(Move move)}.
*
* <p>Также превращение проверяется в проверке виртуального хода
*/
@SerializedName("turnInto")
private FigureType turnInto;
public FigureType turnInto;

public Move(final MoveType moveType, final Cell from, final Cell to) {
this.moveType = moveType;
Expand All @@ -42,16 +30,6 @@ public Move(Move move, FigureType turnInto) {
this.turnInto = turnInto;
}

public FigureType getTurnInto() {
return turnInto;
}

// TODO: удалить
public void setTurnInto(final FigureType turnInto) {
this.turnInto = turnInto;
}

// TODO: удалить
public MoveType getMoveType() {
return moveType;
}
Expand All @@ -64,11 +42,33 @@ public Cell getTo() {
return to;
}

/** Не хеширует фигуру для превращения, читать подробнее: {@link #turnInto} */
/**
* Не использует {@code move.turnInto}, т.к. пешки на доске не знают во что превратиться без
* запроса игрока, смотреть {@link
* io.deeplay.qchess.game.logics.MoveSystem#inAvailableMoves(Move move)}.
*
* <p>Проверка пешки на превращение вынесена в {@link
* io.deeplay.qchess.game.logics.MoveSystem#checkCorrectnessIfSpecificMove(Move move)}.
*
* <p>Также превращение проверяется в проверке виртуального хода {@link
* io.deeplay.qchess.game.logics.MoveSystem#isCorrectMoveWithoutCheckAvailableMoves(Move move)}
*/
public boolean equalsWithoutTurnInto(Move move) {
return this == move
|| move != null
&& moveType == move.moveType
&& Objects.equals(from, move.from)
&& Objects.equals(to, move.to);
}

@Override
public int hashCode() {
return (Cell.hashCodes[from.column][from.row] * 31 + Cell.hashCodes[to.column][to.row]) * 10
+ moveType.ordinal();
int result = 31;
result = 31 * result + Cell.hashCodes[from.column][from.row];
result = 31 * result + Cell.hashCodes[to.column][to.row];
result = 31 * result + moveType.ordinal();
result = 31 * result + (turnInto == null ? 0 : turnInto.type);
return result;
}

@Override
Expand All @@ -78,7 +78,8 @@ public boolean equals(Object o) {
Move move = (Move) o;
return moveType == move.moveType
&& Objects.equals(from, move.from)
&& Objects.equals(to, move.to);
&& Objects.equals(to, move.to)
&& Objects.equals(turnInto, move.turnInto);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,9 @@ public abstract class Figure {

public final FigureType figureType;
protected final Color color;
protected boolean wasMoved = false;
/** Двигалась ли фигура на доске */
public boolean wasMoved;

protected Cell position;

protected Figure(Color color, Cell position, FigureType figureType) {
Expand Down Expand Up @@ -72,16 +74,6 @@ public void setCurrentPosition(Cell position) {
this.position = position;
}

/** Устанавливает, делала ли фигура хотя бы один ход */
public void setWasMoved(boolean wasMoved) {
this.wasMoved = wasMoved;
}

/** @return true, если фигура делала ход */
public boolean wasMoved() {
return wasMoved;
}

/** @return все возможные ходы фигуры, не учитывая шаха */
public abstract List<Move> getAllMoves(GameSettings settings);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,6 @@ public PlayerType getPlayerType() {
protected void turnIntoInQueen(Move move) {
if (move.getMoveType() == MoveType.TURN_INTO
|| move.getMoveType() == MoveType.TURN_INTO_ATTACK)
move.setTurnInto(FigureType.QUEEN);
move.turnInto = FigureType.QUEEN;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ private void specificMoveModification(Move chosenMove) throws ChessError {
if (chosenMove.getMoveType() == MoveType.TURN_INTO
|| chosenMove.getMoveType() == MoveType.TURN_INTO_ATTACK) {
System.out.println(TURN_INTO_INVITE);
chosenMove.setTurnInto(readTurnInto());
chosenMove.turnInto = readTurnInto();
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,6 @@ public PlayerType getPlayerType() {
protected void turnIntoInQueen(Move move) {
if (move.getMoveType() == MoveType.TURN_INTO
|| move.getMoveType() == MoveType.TURN_INTO_ATTACK)
move.setTurnInto(FigureType.QUEEN);
move.turnInto = FigureType.QUEEN;
}
}
Loading

0 comments on commit fcecbaa

Please sign in to comment.