Есть ли лучший способ выполнить проверку ходов в моей шахматной программе?JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Есть ли лучший способ выполнить проверку ходов в моей шахматной программе?

Сообщение Anonymous »


Я чувствую, что моему проекту потребуется серьезная реструктуризация, но я не знаю, с чего начать. Я не уверен, делаю ли я все это более сложным, чем должно быть, делая много разных вещей в одном месте, или это просто по своей сути сложно.

Меня больше всего волнует вопрос о том, ставит ли ход под шах собственному королю игрока. На данный момент я выполняю ход, а затем проверяю, находится ли король под шахом. Если да, я отменяю ход, обращая логику типа хода и выдавая ошибку в 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»