corrected movelogic

This commit is contained in:
Benjamin Feyer
2024-12-09 21:02:46 +01:00
parent 6ab8f2d90d
commit e79a1168c0
2 changed files with 34 additions and 172 deletions

View File

@@ -24,96 +24,6 @@ public ChoosePieceAutomatonState(ChoosePieceState choosePieceAutomaton, ServerGa
this.choosePieceAutomaton = choosePieceAutomaton;
}
/*
protected boolean canMove(Piece piece) {
int steps = logic.getGame().getDiceModifier() * logic.getGame().getDiceEyes();
if (piece.getState().equals(PieceState.HOME)) {
return canHomeMove(piece, steps);
} else {
int homeMoves = getHomeMoves(piece, steps);
if (homeMoves > 0) {
return canHomeMove(piece, homeMoves);
} else {
return canInfieldMove(piece, steps);
}
}
}
*/
/*
protected int getHomeMoves(Piece piece, int steps) {
int pieceIndex = logic.getGame().getBoard().getInfieldIndexOfPiece(piece);
Color color = piece.getColor();
int startIndex = logic.getGame().getPlayerByColor(color).getStartNodeIndex();
int moveIndex = pieceIndex + steps;
if (moveIndex > logic.getGame().getBoard().getInfield().length) {
if (startIndex > pieceIndex) {
return steps - (startIndex - pieceIndex - 1);
}
moveIndex %= logic.getGame().getBoard().getInfield().length;
if (moveIndex >= startIndex) {
return moveIndex - startIndex + 1;
}
return 0;
}
if (pieceIndex < startIndex && startIndex <= moveIndex) {
return moveIndex - startIndex + 1;
}
return 0;
}
*/
/*
private boolean canInfieldMove(Piece piece, int steps) {
int pieceIndex = logic.getGame().getBoard().getInfieldIndexOfPiece(piece);
int moveIndex = (pieceIndex + steps) % logic.getGame().getBoard().getInfield().length;
Piece occupant = logic.getGame().getBoard().getInfield()[moveIndex].getOccupant();
if (occupant != null){
if (occupant.isShielded()){
return false;
}
return occupant.getColor() != piece.getColor();
}
return true;
}
*/
/*
private boolean canHomeMove(Piece piece, int moveIndex) {
Color color = piece.getColor();
Player player = logic.getGame().getPlayerByColor(color);
Node[] homeNodes = player.getHomeNodes();
int index;
if (player.pieceInsideOfHome(piece)) {
index = player.getHomeIndexOfPiece(piece);
} else {
index = 0;
}
if (index + moveIndex >= homeNodes.length) {
return false;
} else {
for (int i = index; i <= index + moveIndex; i++) {
if (homeNodes[i].isOccupied()) {
return false;
}
}
return true;
}
}
*/
/*
protected int calculateTargetIndex(Piece piece) {
int steps = logic.getGame().getDiceModifier() * logic.getGame().getDiceEyes();
return (logic.getGame().getBoard().getInfieldIndexOfPiece(piece) + steps) % logic.getGame().getBoard().getInfield().length;
}
*/
/**
* returns true, if the piece can move inside the home or infield or move from the infield to the home
*
@@ -131,24 +41,33 @@ protected boolean canMove(Piece piece) {
System.out.println("Server: ChoosePieceStateMachine: canMove: piece.getState()" + piece.getState());
System.out.println("Server: ChoosePieceStateAutomaton: canMove:" + canPieceMoveInHome(piece, steps));
//checks if the piece can move in the home
if (canPieceMoveInHome(piece, steps)) {
System.out.println("Server: ChoosePieceStateMachine:canMove: entered canMove/canPieceMoveInHome");
return true;
}
//checks if the piece will not go over its home-field
else if(40 > targetIdx && (!piece.getState().equals(PieceState.HOME)||!piece.getState().equals(PieceState.HOMEFINISHED))) {
Color activeColor = logic.getGame().getActiveColor();
System.out.println("ChoosePieceAutomaton: targetindex:" + (pieceIdx + steps) % 40);
Node tartgetNode = logic.getGame().getBoard().getInfield()[(pieceIdx + steps) % 40];
//checks if the target-node is not occupied by an own color
if (!tartgetNode.isOccupied(activeColor)) {
//checks if the targetNode is not occupied or the occupant ha no shield
if (!tartgetNode.isOccupied() || tartgetNode.getOccupant().getShield() != ShieldState.ACTIVE) {
return true;
}
if (piece.getState().equals(PieceState.HOME)) {
if (canPieceMoveInHome(piece, steps)) {
System.out.println("Server: ChoosePieceStateMachine:canMove: entered canMove/canPieceMoveInHome");
return true;
}
}
//returns false it the piece can't move
else {
if (canPieceMoveInHome(piece, steps)) {
System.out.println("Server: ChoosePieceStateMachine:canMove: entered canMove/canPieceMoveInHome");
return true;
}
//checks if the piece will not go over its home-field
else if (40 > targetIdx && (!piece.getState().equals(PieceState.HOME) || !piece.getState().equals(PieceState.HOMEFINISHED))) {
Color activeColor = logic.getGame().getActiveColor();
System.out.println("ChoosePieceAutomaton: targetindex:" + (pieceIdx + steps) % 40);
Node tartgetNode = logic.getGame().getBoard().getInfield()[(pieceIdx + steps) % 40];
//checks if the target-node is not occupied by an own color
if (!tartgetNode.isOccupied(activeColor)) {
//checks if the targetNode is not occupied or the occupant ha no shield
if (!tartgetNode.isOccupied() || tartgetNode.getOccupant().getShield() != ShieldState.ACTIVE) {
return true;
}
}
}
//returns false it the piece can't move
return false;
}
return false;
}
@@ -168,9 +87,12 @@ protected boolean canPieceMoveInHome(Piece piece, int steps) {
int homeIdx = logic.getGame().getActivePlayer().getHomeIndexOfPiece(piece);
//tests if the steps are less than the possible movement
System.out.println("Server: ChoosePieceAutomaton: canPieceMoveInHome: reached second if: (4 - homeIdx) > steps:" + ((4 - homeIdx) > steps) + "steps:" + steps + "homeIdx:" + homeIdx);
if ((4 - homeIdx) > steps) {
System.out.println("Server: canPieceMoveInHome: !jumpOver" + !jumpOver(steps, homeIdx, false));
return !jumpOver(steps, homeIdx, false);
if ((3 - homeIdx) >= steps - 1) {
System.out.println("Server: canPieceMoveInHome: !jumpOver" + !jumpOver(steps-1, homeIdx, false));
return !jumpOver(steps-1, homeIdx, false);
}
else {
return false;
}
}
//tests if the piece can move in the home
@@ -183,20 +105,18 @@ else if (piece.getState() == PieceState.ACTIVE) {
if (targetIdx >= 40) {
int stepsToHome = 39 - normPieceIdx;
int restMovement = steps - stepsToHome - 1;
if(restMovement>=3) return false;
if (restMovement >= 3) return false;
System.out.println("Server: ChoosePieceStateMachine: canPieceMoveInHome: stepsToHome:" + stepsToHome + "restMovement:" + restMovement + "jumpOver:" + jumpOver(restMovement, 0, true) + "canPieceMoveInHome: return:" + true);
return !jumpOver(restMovement, 0, true);
}
} else {
}
else {
System.out.println("Server: ChoosePieceStateMachine: canPieceMoveInHome: return:" + false);
return false;
}
return false;
}
/**
* tests if the piece, when moved in or inside a home, must jump over another piece
*
@@ -263,7 +183,6 @@ protected int getInfieldTarget(Piece piece, int steps) {
return (steps + index) % 40;
}
/**
* this method is used for calculating the targetIndex
*
@@ -279,6 +198,4 @@ protected int calculateTargetIndex(Piece piece) {
System.out.println("Server: ChoosePieceStateAutomaton: calculate index in Infield:" + getInfieldTarget(piece, steps));
return getInfieldTarget(piece, steps);
}
}

View File

@@ -39,25 +39,6 @@ public void setMoveablePieces(ArrayList<Piece> moveablePieces) {
/**
* This method will be used whenever this state will be entered.
*/
/*
@Override
public void enter() {
LOGGER.log(System.Logger.Level.DEBUG, "Entered SelectPieceState state.");
int steps = logic.getGame().getDiceModifier() * logic.getGame().getDiceEyes();
for (Piece piece : moveablePieces) {
int homeMoves = getHomeMoves(piece, steps);
if (homeMoves > 0) {
isHomeMove.add(true);
targetIndex.add(homeMoves);
} else {
isHomeMove.add(false);
targetIndex.add(calculateTargetIndex(piece));
}
}
logic.getServerSender().send(logic.getGame().getActivePlayerId(), new SelectPieceMessage(moveablePieces, isHomeMove, targetIndex));
}
*/
@Override
public void enter(){
LOGGER.log(System.Logger.Level.DEBUG, "Entered SelectPieceState state in the Server.");
@@ -178,42 +159,6 @@ public void received(RequestMoveMessage msg, int from){
}
}
}
/*
Node oldNode = logic.getGame().getBoard().getInfield()[logic.getGame().getBoard().getInfieldIndexOfPiece(movePiece)];
oldNode.clearOccupant();
if (homeMove) {
//setPieceInHome
logic.getGame().getPlayerByColor(msg.getPiece().getColor()).setPieceInHome(targIdx, movePiece);
if (logic.getGame().getPlayerByColor(msg.getPiece().getColor()).isHomeFinished(logic.getGame().getPieceThroughUUID(msg.getPiece().getUuid()))) {
movePiece.setState(PieceState.HOMEFINISHED);
}
else {
movePiece.setState(PieceState.HOME);
}
movePiece.setShield(ShieldState.NONE);
} else {
Node targetNode = logic.getGame().getBoard().getInfield()[targIdx];
//TODO durch merge auskommentiert
if(targetNode.isBonus()) {
for (Player p : logic.getGame().getPlayersAsList()) {
if(p.getColor() == logic.getGame().getActiveColor()) {
logic.getServerSender().send(logic.getGame().getPlayerIdByColor(p.getColor()), new DrawCardMessage(logic.getGame().draw()));
} else {
logic.getServerSender().send(logic.getGame().getPlayerIdByColor(p.getColor()), new DrawCardMessage(new HiddenCard()));
}
}
}
Piece occ = targetNode.getOccupant();
if (occ != null) {
logic.getGame().getPlayerByColor(occ.getColor()).addWaitingPiece(occ);
}
targetNode.setOccupant(msg.getPiece());
}
*/
System.out.println("Server changes from SelectPieceState to movePieceState");
this.choosePieceAutomaton.getTurnAutomaton().setCurrentState(this.choosePieceAutomaton.getTurnAutomaton().getMovePieceState());
}