Есть ли лучший способ выполнить проверку ходов в моей шахматной программе? ⇐ JAVA
Есть ли лучший способ выполнить проверку ходов в моей шахматной программе?
Я чувствую, что моему проекту потребуется серьезная реструктуризация, но я не знаю, с чего начать. Я не уверен, делаю ли я все это более сложным, чем должно быть, делая много разных вещей в одном месте, или это просто по своей сути сложно.
Меня больше всего волнует вопрос о том, ставит ли ход под шах собственному королю игрока. На данный момент я выполняю ход, а затем проверяю, находится ли король под шахом. Если да, я отменяю ход, обращая логику типа хода и выдавая ошибку в Game, которая должна быть обработана там. Я действительно не думаю, что это лучший способ сделать это с точки зрения простоты и удобства обслуживания. Буду признателен за любой отзыв, спасибо!
public Move movePiece (позиция позиции, позиция назначения, логическое значение isWhiteTurn) выдает IllegalMoveException { ChessPiece thisPiece = submitPiece(position, isWhiteTurn); // Подтверждаем, что фигура существует и является правильной командой validateMove (thisPiece, позиция, пункт назначения); // Подтверждаем правильность хода для фигуры ChessPieceotherPiece = getPiece(пункт назначения); Move.MoveType moveType = defineMoveType(thisPiece, Position, OtherPiece, Destination); Move.CheckType checkType = определитьCheckType(thisPiece,otherPiece); пытаться { выполнитьMove (thisPiece, позиция, OtherPiece, пункт назначения, moveType); // Обрабатывает своего короля под шахом } catch (IllegalMoveException e) { undoMove (thisPiece, позиция, другая часть, пункт назначения, тип перемещения); throw new IllegalMoveException("Ход ставит под шах собственного короля"); } ... } Private void PerformMove(ChessPiece thisPiece, Position Position, ChessPieceotherPiece, Место назначения, Move.MoveType moveType) выдает IllegalMoveException { if (moveType == Move.MoveType.CASTLE) { PerformCastle(thisPiece, позиция, OtherPiece, пункт назначения); } иначе если (moveType == Move.MoveType.EN_PASSANT) { PerformEnPassant (thisPiece, позиция, OtherPiece, пункт назначения); } иначе, если (otherPiece != ноль) { захватPiece (другойPiece); movePiece(thisPiece, позиция, пункт назначения); } еще { movePiece(thisPiece, позиция, пункт назначения); } Позиция kingPos = findKingPos(thisPiece.isWhite()); if (isAttacked(!thisPiece.isWhite(), kingPos)) { throw new IllegalMoveException("Ход ставит под шах собственного короля"); } } Private void undoMove(ChessPiece thisPiece, Position Position, ChessPieceotherPiece, Position location, Move.MoveType moveType) { if (moveType == Move.MoveType.CASTLE) { undoCastle(thisPiece, позиция, другая часть, пункт назначения); } если (moveType == Move.MoveType.EN_PASSANT) { undoEnPassant (thisPiece, позиция, OtherPiece, пункт назначения); } еще { undoMove(thisPiece, позиция, пункт назначения); если (otherPiece != ноль) { undoCapture (otherPiece, пункт назначения); } } } Private void capturePiece (фигура шахматной фигуры) { Позиция позиции = Piece.getPosition(); удалитьPiece (позиция); если (piece.isWhite()) { whitePieces.remove(позиция); blackCaptured.add(кусок); } еще { blackPieces.remove(позиция); whiteCaptured.add(кусок); } } Private void movePiece (фигура ChessPiece, позиция позиции, пункт назначения позиции) { if (getPiece(destination) != null) { throw new IllegalArgumentException("Там есть кусок"); } удалитьPiece (позиция); setPiece(кусок, пункт назначения); если (piece.isWhite()) { whitePieces.remove(позиция); whitePieces.put(пункт назначения, кусок); } еще { blackPieces.remove(позиция); blackPieces.put(пункт назначения, кусок); } } Private void undoMove (фигура шахматной фигуры, позиция позиции, пункт назначения позиции) { movePiece(кусок, пункт назначения, позиция); } Private void undoCapture (фигура шахматной фигуры, позиция позиции) { setPiece(кусок, позиция); если (piece.isWhite()) { whitePieces.put(позиция, кусок); blackCaptured.remove(кусок); } еще { blackPieces.put(позиция, фигура); whiteCaptured.remove(кусок); } } Private void PerformCastle(ChessPiece thisPiece, Position Position, ChessPieceotherPiece, Position назначения) { if (thisPiece экземпляр King) { если (destination.col() == 0) { выполнитьQueenSideCastle (thisPiece, позиция, OtherPiece, пункт назначения); } еще { выполнитьKingSideCastle(thisPiece, позиция,otherPiece, пункт назначения); } } еще { если (destination.col() == 0) { выполнитьQueenSideCastle (otherPiece, пункт назначения, thisPiece, позиция); } еще { выполнитьKingSideCastle (otherPiece, пункт назначения, thisPiece, позиция); } } } Private void undoCastle(ChessPiece thisPiece, Position Position, ChessPieceotherPiece, Position назначение) { if (thisPiece экземпляр King) { если (destination.col() == 0) { undoQueenSideCastle(thisPiece, позиция,otherPiece, пункт назначения); } еще { undoKingSideCastle(thisPiece, позиция,otherPiece, пункт назначения); } } еще { если (destination.col() == 0) { undoQueenSideCastle (otherPiece, пункт назначения, thisPiece, позиция); } еще { undoKingSideCastle (otherPiece, пункт назначения, thisPiece, позиция); } } } Private void PerformQueenSideCastle(ChessPiece king, Position kingPosition, ChessPiece ладья, Position rookPosition) { если (king.isWhite()) { movePiece(king, kingPosition, новая позиция(0, 2)); movePiece(ладья, ладьяПозиция, новая позиция(0, 3)); } еще { movePiece(king, kingPosition, новая позиция(7, 2)); movePiece(ладья, ладьяПозиция, новая позиция(7, 3)); } } Private void undoQueenSideCastle(ChessPiece king, Position kingPosition, ChessPiece ладья, Position rookPosition) { если (king.isWhite()) { undoMove(king, kingPosition, новая позиция(0, 2)); undoMove(ладья, ладьяПозиция, новая позиция(0, 3)); } еще { undoMove(king, kingPosition, новая позиция(7, 2)); undoMove(ладья, ладьяПозиция, новая позиция(7, 3)); } } Private void PerformKingSideCastle(ChessPiece king, Position kingPosition, ChessPiece ладья, Position rookPosition) { если (king.isWhite()) { movePiece(king, kingPosition, новая позиция(0, 6)); movePiece(ладья, ладьяПозиция, новая позиция(0, 5)); } еще { movePiece(king, kingPosition, новая позиция(7, 6)); movePiece(ладья, ладьяПозиция, новая позиция(7, 5)); } } Private void undoKingSideCastle(ChessPiece king, Position kingPosition, ChessPiece ладья, Position rookPosition) { если (king.isWhite()) { undoMove(king, kingPosition, новая позиция(0, 6)); undoMove(ладья, ладьяПозиция, новая позиция(0, 5)); } еще { undoMove(king, kingPosition, новая позиция(7, 6)); undoMove(ладья, ладьяПозиция, новая позиция(7, 5)); } } Private void PerformEnPassant(ChessPiece thisPiece, Position Position, ChessPieceotherPiece, Position location) { movePiece(thisPiece, позиция, пункт назначения); захватPiece (другойPiece); } Private void undoEnPassant(ChessPiece thisPiece, позиция позиции, ChessPieceotherPiece, позиция назначения) { undoMove(thisPiece, позиция, пункт назначения); undoCapture(otherPiece,otherPiece.getPosition()); } публичная запись Move(Позиция позиции, Назначение позиции, ChessPiece movingPiece, ChessPiece capturePiece, Move.MoveType moveType, Move.CheckType checkType) { общественное перечисление MoveType { НОРМАЛЬНЫЙ, ЗАМОК, EN_PASSANT, АКЦИЯ } публичное перечисление CheckType { НЕТ, ШАХ, ПАТ, МАТ } } └── источник ├── контроллер │ └── Game.java ├── модель │ ├── Бишоп.java │ ├── Board.java │ ├── ChessPiece.java │ ├── King.java │ ├── Knight.java │ ├── Pawn.java │ ├── Queen.java │ └── Rook.java └── утилита ├── ChessPieceFactory.java ├── IllegalMoveException.java ├── Move.java └── Position.java
Я чувствую, что моему проекту потребуется серьезная реструктуризация, но я не знаю, с чего начать. Я не уверен, делаю ли я все это более сложным, чем должно быть, делая много разных вещей в одном месте, или это просто по своей сути сложно.
Меня больше всего волнует вопрос о том, ставит ли ход под шах собственному королю игрока. На данный момент я выполняю ход, а затем проверяю, находится ли король под шахом. Если да, я отменяю ход, обращая логику типа хода и выдавая ошибку в Game, которая должна быть обработана там. Я действительно не думаю, что это лучший способ сделать это с точки зрения простоты и удобства обслуживания. Буду признателен за любой отзыв, спасибо!
public Move movePiece (позиция позиции, позиция назначения, логическое значение isWhiteTurn) выдает IllegalMoveException { ChessPiece thisPiece = submitPiece(position, isWhiteTurn); // Подтверждаем, что фигура существует и является правильной командой validateMove (thisPiece, позиция, пункт назначения); // Подтверждаем правильность хода для фигуры ChessPieceotherPiece = getPiece(пункт назначения); Move.MoveType moveType = defineMoveType(thisPiece, Position, OtherPiece, Destination); Move.CheckType checkType = определитьCheckType(thisPiece,otherPiece); пытаться { выполнитьMove (thisPiece, позиция, OtherPiece, пункт назначения, moveType); // Обрабатывает своего короля под шахом } catch (IllegalMoveException e) { undoMove (thisPiece, позиция, другая часть, пункт назначения, тип перемещения); throw new IllegalMoveException("Ход ставит под шах собственного короля"); } ... } Private void PerformMove(ChessPiece thisPiece, Position Position, ChessPieceotherPiece, Место назначения, Move.MoveType moveType) выдает IllegalMoveException { if (moveType == Move.MoveType.CASTLE) { PerformCastle(thisPiece, позиция, OtherPiece, пункт назначения); } иначе если (moveType == Move.MoveType.EN_PASSANT) { PerformEnPassant (thisPiece, позиция, OtherPiece, пункт назначения); } иначе, если (otherPiece != ноль) { захватPiece (другойPiece); movePiece(thisPiece, позиция, пункт назначения); } еще { movePiece(thisPiece, позиция, пункт назначения); } Позиция kingPos = findKingPos(thisPiece.isWhite()); if (isAttacked(!thisPiece.isWhite(), kingPos)) { throw new IllegalMoveException("Ход ставит под шах собственного короля"); } } Private void undoMove(ChessPiece thisPiece, Position Position, ChessPieceotherPiece, Position location, Move.MoveType moveType) { if (moveType == Move.MoveType.CASTLE) { undoCastle(thisPiece, позиция, другая часть, пункт назначения); } если (moveType == Move.MoveType.EN_PASSANT) { undoEnPassant (thisPiece, позиция, OtherPiece, пункт назначения); } еще { undoMove(thisPiece, позиция, пункт назначения); если (otherPiece != ноль) { undoCapture (otherPiece, пункт назначения); } } } Private void capturePiece (фигура шахматной фигуры) { Позиция позиции = Piece.getPosition(); удалитьPiece (позиция); если (piece.isWhite()) { whitePieces.remove(позиция); blackCaptured.add(кусок); } еще { blackPieces.remove(позиция); whiteCaptured.add(кусок); } } Private void movePiece (фигура ChessPiece, позиция позиции, пункт назначения позиции) { if (getPiece(destination) != null) { throw new IllegalArgumentException("Там есть кусок"); } удалитьPiece (позиция); setPiece(кусок, пункт назначения); если (piece.isWhite()) { whitePieces.remove(позиция); whitePieces.put(пункт назначения, кусок); } еще { blackPieces.remove(позиция); blackPieces.put(пункт назначения, кусок); } } Private void undoMove (фигура шахматной фигуры, позиция позиции, пункт назначения позиции) { movePiece(кусок, пункт назначения, позиция); } Private void undoCapture (фигура шахматной фигуры, позиция позиции) { setPiece(кусок, позиция); если (piece.isWhite()) { whitePieces.put(позиция, кусок); blackCaptured.remove(кусок); } еще { blackPieces.put(позиция, фигура); whiteCaptured.remove(кусок); } } Private void PerformCastle(ChessPiece thisPiece, Position Position, ChessPieceotherPiece, Position назначения) { if (thisPiece экземпляр King) { если (destination.col() == 0) { выполнитьQueenSideCastle (thisPiece, позиция, OtherPiece, пункт назначения); } еще { выполнитьKingSideCastle(thisPiece, позиция,otherPiece, пункт назначения); } } еще { если (destination.col() == 0) { выполнитьQueenSideCastle (otherPiece, пункт назначения, thisPiece, позиция); } еще { выполнитьKingSideCastle (otherPiece, пункт назначения, thisPiece, позиция); } } } Private void undoCastle(ChessPiece thisPiece, Position Position, ChessPieceotherPiece, Position назначение) { if (thisPiece экземпляр King) { если (destination.col() == 0) { undoQueenSideCastle(thisPiece, позиция,otherPiece, пункт назначения); } еще { undoKingSideCastle(thisPiece, позиция,otherPiece, пункт назначения); } } еще { если (destination.col() == 0) { undoQueenSideCastle (otherPiece, пункт назначения, thisPiece, позиция); } еще { undoKingSideCastle (otherPiece, пункт назначения, thisPiece, позиция); } } } Private void PerformQueenSideCastle(ChessPiece king, Position kingPosition, ChessPiece ладья, Position rookPosition) { если (king.isWhite()) { movePiece(king, kingPosition, новая позиция(0, 2)); movePiece(ладья, ладьяПозиция, новая позиция(0, 3)); } еще { movePiece(king, kingPosition, новая позиция(7, 2)); movePiece(ладья, ладьяПозиция, новая позиция(7, 3)); } } Private void undoQueenSideCastle(ChessPiece king, Position kingPosition, ChessPiece ладья, Position rookPosition) { если (king.isWhite()) { undoMove(king, kingPosition, новая позиция(0, 2)); undoMove(ладья, ладьяПозиция, новая позиция(0, 3)); } еще { undoMove(king, kingPosition, новая позиция(7, 2)); undoMove(ладья, ладьяПозиция, новая позиция(7, 3)); } } Private void PerformKingSideCastle(ChessPiece king, Position kingPosition, ChessPiece ладья, Position rookPosition) { если (king.isWhite()) { movePiece(king, kingPosition, новая позиция(0, 6)); movePiece(ладья, ладьяПозиция, новая позиция(0, 5)); } еще { movePiece(king, kingPosition, новая позиция(7, 6)); movePiece(ладья, ладьяПозиция, новая позиция(7, 5)); } } Private void undoKingSideCastle(ChessPiece king, Position kingPosition, ChessPiece ладья, Position rookPosition) { если (king.isWhite()) { undoMove(king, kingPosition, новая позиция(0, 6)); undoMove(ладья, ладьяПозиция, новая позиция(0, 5)); } еще { undoMove(king, kingPosition, новая позиция(7, 6)); undoMove(ладья, ладьяПозиция, новая позиция(7, 5)); } } Private void PerformEnPassant(ChessPiece thisPiece, Position Position, ChessPieceotherPiece, Position location) { movePiece(thisPiece, позиция, пункт назначения); захватPiece (другойPiece); } Private void undoEnPassant(ChessPiece thisPiece, позиция позиции, ChessPieceotherPiece, позиция назначения) { undoMove(thisPiece, позиция, пункт назначения); undoCapture(otherPiece,otherPiece.getPosition()); } публичная запись Move(Позиция позиции, Назначение позиции, ChessPiece movingPiece, ChessPiece capturePiece, Move.MoveType moveType, Move.CheckType checkType) { общественное перечисление MoveType { НОРМАЛЬНЫЙ, ЗАМОК, EN_PASSANT, АКЦИЯ } публичное перечисление CheckType { НЕТ, ШАХ, ПАТ, МАТ } } └── источник ├── контроллер │ └── Game.java ├── модель │ ├── Бишоп.java │ ├── Board.java │ ├── ChessPiece.java │ ├── King.java │ ├── Knight.java │ ├── Pawn.java │ ├── Queen.java │ └── Rook.java └── утилита ├── ChessPieceFactory.java ├── IllegalMoveException.java ├── Move.java └── Position.java
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как узнать, что какой-то ход является допустимым для моей шахматной партии?
Anonymous » » в форуме JAVA - 0 Ответы
- 16 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как узнать, что какой-то ход является допустимым для моей шахматной партии? [закрыто]
Anonymous » » в форуме JAVA - 0 Ответы
- 19 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Почему printf () в моей программе SDL не печатает в окне вывода моей IDE?
Anonymous » » в форуме C++ - 0 Ответы
- 2 Просмотры
-
Последнее сообщение Anonymous
-