added more logic for the move

This commit is contained in:
Benjamin Feyer
2024-12-09 14:15:05 +01:00
parent 25fff99ff0
commit 08db05a7d6
5 changed files with 106 additions and 72 deletions

View File

@@ -4,6 +4,7 @@
import pp.mdga.client.ClientState; import pp.mdga.client.ClientState;
import pp.mdga.client.gamestate.turnstate.ChoosePieceState; import pp.mdga.client.gamestate.turnstate.ChoosePieceState;
import pp.mdga.game.Piece; import pp.mdga.game.Piece;
import pp.mdga.game.PieceState;
import pp.mdga.message.client.RequestMoveMessage; import pp.mdga.message.client.RequestMoveMessage;
import pp.mdga.message.client.SelectedPiecesMessage; import pp.mdga.message.client.SelectedPiecesMessage;
import pp.mdga.message.server.MoveMessage; import pp.mdga.message.server.MoveMessage;
@@ -49,10 +50,30 @@ public void selectPiece(Piece piece) {
public void received(MoveMessage msg) { public void received(MoveMessage msg) {
Piece piece = logic.getGame().getPieceThroughUUID(msg.getPiece().getUuid()); Piece piece = logic.getGame().getPieceThroughUUID(msg.getPiece().getUuid());
//logic.getGame().getBoard().getInfield()[logic.getGame().getBoard().getInfieldIndexOfPiece(piece)].clearOccupant(); //logic.getGame().getBoard().getInfield()[logic.getGame().getBoard().getInfieldIndexOfPiece(piece)].clearOccupant();
System.out.println("Client: selectPieceState: receivedMoveMessage: msg.isHomeMoved():"+msg.isHomeMove());
if (msg.isHomeMove()) { if (msg.isHomeMove()) {
System.out.println("Client: selectPieceState: receivedMoveMessage: msg.getPiece.getState():"+piece.getState());
if(piece.getState().equals(PieceState.ACTIVE)){
logic.addNotification(new HomeMoveNotification(piece.getUuid(), msg.getTargetIndex()));
int infieldIndex=logic.getGame().getBoard().getInfieldIndexOfPiece(piece);
System.out.println("Client: SelectState: activePiece in Home: infieldIndex"+infieldIndex);
logic.getGame().getBoard().getInfield()[infieldIndex].clearOccupant();
logic.getGame().getPlayerByColor(piece.getColor()).setPieceInHome(msg.getTargetIndex(), piece);
}
else{
System.out.println("Client: SelectPieceState: receivedMoveMessage:reached else");
logic.addNotification(new HomeMoveNotification(piece.getUuid(), msg.getTargetIndex()));
System.out.println("Client: electPieceState: homeindex"+logic.getGame().getActivePlayer().getHomeIndexOfPiece(piece));
int pieceHomeIndex = logic.getGame().getActivePlayer().getHomeIndexOfPiece(piece);
logic.getGame().getActivePlayer().getHomeNodes()[pieceHomeIndex].clearOccupant();
logic.getGame().getPlayerByColor(piece.getColor()).setPieceInHome(msg.getTargetIndex(), piece);
}
/*
logic.addNotification(new HomeMoveNotification(piece.getUuid(), msg.getTargetIndex())); logic.addNotification(new HomeMoveNotification(piece.getUuid(), msg.getTargetIndex()));
logic.getGame().getBoard().getInfield()[logic.getGame().getBoard().getInfieldIndexOfPiece(piece)].clearOccupant(); logic.getGame().getBoard().getInfield()[logic.getGame().getBoard().getInfieldIndexOfPiece(piece)].clearOccupant();
logic.getGame().getPlayerByColor(piece.getColor()).setPieceInHome(msg.getTargetIndex(), piece); logic.getGame().getPlayerByColor(piece.getColor()).setPieceInHome(msg.getTargetIndex(), piece);
*/
} else { } else {
int oldIndex = logic.getGame().getBoard().getInfieldIndexOfPiece(piece); int oldIndex = logic.getGame().getBoard().getInfieldIndexOfPiece(piece);

View File

@@ -87,7 +87,7 @@ public Game() {
gameStatistics = new Statistic(); gameStatistics = new Statistic();
initializeDrawPile(); initializeDrawPile();
board = new Board(); board = new Board();
die = new Die(2,5,6,3,6); die = new Die(5,5,5,5,5,5,5,5,1,2,1,2,2,6,3,6);
} }
/** /**

View File

@@ -124,6 +124,7 @@ protected boolean canMove(Piece piece){
System.out.println("Server: ChoosePieceStateMachine: canMove: piece.getState()" + piece.getState()); System.out.println("Server: ChoosePieceStateMachine: canMove: piece.getState()" + piece.getState());
int steps = logic.getGame().getDiceModifier() * logic.getGame().getDiceEyes(); int steps = logic.getGame().getDiceModifier() * logic.getGame().getDiceEyes();
System.out.println("Server: ChoosePieceStateAutomaton: canMove:" + canPieceMoveInHome(piece, steps)); System.out.println("Server: ChoosePieceStateAutomaton: canMove:" + canPieceMoveInHome(piece, steps));
//checks if the piece can move in the home
if (canPieceMoveInHome(piece, steps)) { if (canPieceMoveInHome(piece, steps)) {
System.out.println("Server: ChoosePieceStateMachine:canMove: entered canMove/canPieceMoveInHome"); System.out.println("Server: ChoosePieceStateMachine:canMove: entered canMove/canPieceMoveInHome");
return true; return true;
@@ -133,22 +134,26 @@ protected boolean canMove(Piece piece){
int startIdx = logic.getGame().getActivePlayer().getStartNodeIndex(); int startIdx = logic.getGame().getActivePlayer().getStartNodeIndex();
int normPieceIdx = (-startIdx + pieceIdx + 40) % 40; int normPieceIdx = (-startIdx + pieceIdx + 40) % 40;
int targetIdx = normPieceIdx + steps; int targetIdx = normPieceIdx + steps;
//checks if the piece will not go over its home-field
if (40 > targetIdx) { if (40 > targetIdx) {
Color activeColor = logic.getGame().getActiveColor(); Color activeColor = logic.getGame().getActiveColor();
System.out.println("ChoosePieceAutomaton: targetindex:" + (pieceIdx + steps) % 40); System.out.println("ChoosePieceAutomaton: targetindex:" + (pieceIdx + steps) % 40);
Node tartgetNode = logic.getGame().getBoard().getInfield()[(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)) { 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) { if (!tartgetNode.isOccupied() || tartgetNode.getOccupant().getShield() != ShieldState.ACTIVE) {
return true; return true;
} }
} }
return true;
} }
//returns false it the piece can't move
return false; return false;
} }
/** /**
* tests if the piece can move in the home or inside the home * tests if the piece can move in the home or inside the home
*
* @param piece * @param piece
* @param steps * @param steps
* @return false, if the piece can't move in the home * @return false, if the piece can't move in the home
@@ -156,9 +161,12 @@ protected boolean canMove(Piece piece){
protected boolean canPieceMoveInHome(Piece piece, int steps) { protected boolean canPieceMoveInHome(Piece piece, int steps) {
//tests if the piece can move inside the home //tests if the piece can move inside the home
System.out.println("Server: ChoosePieceStateMachine: canPieceMoveInHome: pieceState:" + piece.getState()); System.out.println("Server: ChoosePieceStateMachine: canPieceMoveInHome: pieceState:" + piece.getState());
steps = logic.getGame().getDiceModifier() * logic.getGame().getDiceEyes();
if (piece.getState() == PieceState.HOME) { if (piece.getState() == PieceState.HOME) {
System.out.println("Server: ChoosePieceStateMachine: canPieceMoveInHome: pieceState:reached if(piece.getState()==PieceState.HOME)"); System.out.println("Server: ChoosePieceStateMachine: canPieceMoveInHome: pieceState:reached if(piece.getState()==PieceState.HOME)");
int homeIdx = logic.getGame().getActivePlayer().getHomeIndexOfPiece(piece); 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) { if ((4 - homeIdx) > steps) {
System.out.println("Server: canPieceMoveInHome: !jumpOver" + !jumpOver(steps, homeIdx, false)); System.out.println("Server: canPieceMoveInHome: !jumpOver" + !jumpOver(steps, homeIdx, false));
return !jumpOver(steps, homeIdx, false); return !jumpOver(steps, homeIdx, false);
@@ -170,24 +178,19 @@ protected boolean canPieceMoveInHome(Piece piece, int steps){
int startIdx = logic.getGame().getActivePlayer().getStartNodeIndex(); int startIdx = logic.getGame().getActivePlayer().getStartNodeIndex();
int normPieceIdx = (-startIdx + pieceIdx + 40) % 40; int normPieceIdx = (-startIdx + pieceIdx + 40) % 40;
int targetIdx = normPieceIdx + steps; int targetIdx = normPieceIdx + steps;
System.out.println("Server: ChoosePieceStateMachine: canPieceMoveInHome: pieceIndex:" +pieceIdx); System.out.println("Server: ChoosePieceStateMachine: canPieceMoveInHome: pieceIndex:" + pieceIdx + "targetIdx:" + targetIdx);
System.out.println("Server: ChoosePieceStateMachine: canPieceMoveInHome: targetIdx:" +targetIdx);
if (targetIdx >= 40) { if (targetIdx >= 40) {
int stepsToHome = 39 - normPieceIdx; int stepsToHome = 39 - normPieceIdx;
int restMovement = steps-stepsToHome; int restMovement = steps - stepsToHome - 1;
System.out.println("Server: ChoosePieceStateMachine: canPieceMoveInHome: stepsToHome:" +stepsToHome); System.out.println("Server: ChoosePieceStateMachine: canPieceMoveInHome: stepsToHome:" + stepsToHome + "restMovement:" + restMovement + "jumpOver:" + jumpOver(restMovement, 0, true) + "canPieceMoveInHome: return:" + true);
System.out.println("Server: ChoosePieceStateMachine: canPieceMoveInHome: restMovement:" +restMovement);
System.out.println("Server: ChoosePieceStateMachine: canPieceMoveInHome: jumpOver:" +jumpOver(restMovement,0,true));
if(4> restMovement){
System.out.println("Server: ChoosePieceStateMachine: canPieceMoveInHome: return:" +true);
return !jumpOver(restMovement, 0, true); return !jumpOver(restMovement, 0, true);
} }
} }
}
System.out.println("Server: ChoosePieceStateMachine: canPieceMoveInHome: return:" + false); 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 * tests if the piece, when moved in or inside a home, must jump over another piece
* *
@@ -199,11 +202,12 @@ protected boolean canPieceMoveInHome(Piece piece, int steps){
private boolean jumpOver(int stepsInHome, int homeIdx, boolean outside) { private boolean jumpOver(int stepsInHome, int homeIdx, boolean outside) {
//tests if the piece comes from the outside in the home //tests if the piece comes from the outside in the home
if (outside) { if (outside) {
System.out.println("Server: ChoosePieceState: jumpOver: from outside");
for (int i = 0; i < stepsInHome; i++) { for (int i = 0; i < stepsInHome; i++) {
if (logic.getGame().getActivePlayer().getHomeNodes()[i].isOccupied()) return true; if (logic.getGame().getActivePlayer().getHomeNodes()[i].isOccupied()) return true;
} }
} }
//tests if the piece jumps over a piece inside the home //tests if the piece jumps over a piece from inside the home
else { else {
for (int i = 1 + homeIdx; i < homeIdx + stepsInHome; i++) { for (int i = 1 + homeIdx; i < homeIdx + stepsInHome; i++) {
if (logic.getGame().getActivePlayer().getHomeNodes()[i].isOccupied()) return true; if (logic.getGame().getActivePlayer().getHomeNodes()[i].isOccupied()) return true;
@@ -218,8 +222,8 @@ private boolean jumpOver(int stepsInHome,int homeIdx,boolean outside){
* @param piece the give piece * @param piece the give piece
* @return the index in the home, where the piece will go * @return the index in the home, where the piece will go
*/ */
protected int getHomeTargetIdx (Piece piece){ protected int getHomeTargetIdx(Piece piece, int steps) {
int steps = logic.getGame().getDiceModifier() * logic.getGame().getDiceEyes(); //tests if the piece is active and move in the house
if (piece.getState() == PieceState.ACTIVE) { if (piece.getState() == PieceState.ACTIVE) {
//gets the id's //gets the id's
int pieceIdx = logic.getGame().getBoard().getInfieldIndexOfPiece(piece); int pieceIdx = logic.getGame().getBoard().getInfieldIndexOfPiece(piece);
@@ -229,9 +233,10 @@ protected int getHomeTargetIdx (Piece piece){
//calculate the steps to the home //calculate the steps to the home
int stepsToHome = 39 - normPieceIdx; int stepsToHome = 39 - normPieceIdx;
//calculates the rest-movement inside a home //calculates the rest-movement inside a home
int restMovement = steps-stepsToHome; int restMovement = steps - stepsToHome - 1;
return restMovement; return restMovement;
} }
//the else handles the logic if the piece is in the home and moves inside the house
else { else {
int pieceHomeIdx = logic.getGame().getActivePlayer().getHomeIndexOfPiece(piece); int pieceHomeIdx = logic.getGame().getActivePlayer().getHomeIndexOfPiece(piece);
return pieceHomeIdx + steps; return pieceHomeIdx + steps;
@@ -244,22 +249,27 @@ protected int getHomeTargetIdx (Piece piece){
* @param piece the piece given * @param piece the piece given
* @return the index in the infield * @return the index in the infield
*/ */
protected int getInfieldTarget(Piece piece){ protected int getInfieldTarget(Piece piece, int steps) {
int steps = logic.getGame().getDiceModifier() * logic.getGame().getDiceEyes();
int index = logic.getGame().getBoard().getInfieldIndexOfPiece(piece); int index = logic.getGame().getBoard().getInfieldIndexOfPiece(piece);
return (steps + index) % 40; return (steps + index) % 40;
} }
/**
* this method is used for calculating the targetIndex
*
* @param piece
* @return
*/
protected int calculateTargetIndex(Piece piece) { protected int calculateTargetIndex(Piece piece) {
int steps = logic.getGame().getDiceModifier() * logic.getGame().getDiceEyes(); int steps = logic.getGame().getDiceModifier() * logic.getGame().getDiceEyes();
if (canPieceMoveInHome(piece, steps)) { if (canPieceMoveInHome(piece, steps)) {
System.out.println("Server: ChoosePieceStateAutomaton: calculate index in home:"+getHomeTargetIdx(piece)); System.out.println("Server: ChoosePieceStateAutomaton: calculate index in home:" + getHomeTargetIdx(piece, steps));
return getHomeTargetIdx(piece); return getHomeTargetIdx(piece, steps);
} }
return getInfieldTarget(piece); System.out.println("Server: ChoosePieceStateAutomaton: calculate index in Infield:" + getInfieldTarget(piece, steps));
return getInfieldTarget(piece, steps);
} }
} }

View File

@@ -59,7 +59,6 @@ private void checkSelectPiece(Player activePlayer){
ArrayList<Piece> moveablePieces = new ArrayList<>(); ArrayList<Piece> moveablePieces = new ArrayList<>();
for (Piece piece : activePlayer.getPieces()){ for (Piece piece : activePlayer.getPieces()){
if (piece.getState().equals(PieceState.ACTIVE) || piece.getState().equals(PieceState.HOME)){ if (piece.getState().equals(PieceState.ACTIVE) || piece.getState().equals(PieceState.HOME)){
System.out.println("Server: NoPieceState: movablePieces.size()"+piece.getState());
moveablePieces.add(piece); moveablePieces.add(piece);
} }
} }

View File

@@ -64,13 +64,13 @@ public void enter(){
for (Piece piece : moveablePieces) { for (Piece piece : moveablePieces) {
if(canPieceMoveInHome(piece,steps)){ if(canPieceMoveInHome(piece,steps)){
int target= getHomeTargetIdx(piece); int target= getHomeTargetIdx(piece,steps);
System.out.println("Server: SelectPieceState: enter in canPieceMoveInHome: targetIndex:"+target); System.out.println("Server: SelectPieceState: enter in canPieceMoveInHome: targetIndex:"+target);
targetIndex.add(target); targetIndex.add(target);
isHomeMove.add(true); isHomeMove.add(true);
} }
else{ else{
int target = getInfieldTarget(piece); int target = getInfieldTarget(piece,steps);
System.out.println("Server: SelectPieceState: enter in else: targetIndex:"+target); System.out.println("Server: SelectPieceState: enter in else: targetIndex:"+target);
targetIndex.add(target); targetIndex.add(target);
isHomeMove.add(false); isHomeMove.add(false);
@@ -85,6 +85,7 @@ public void received(RequestMoveMessage msg, int from){
if(!moveablePieces.contains(msg.getPiece())){ if(!moveablePieces.contains(msg.getPiece())){
throw new RuntimeException("invalid Piece"); throw new RuntimeException("invalid Piece");
} }
int indexOfPiece = moveablePieces.indexOf(msg.getPiece()); int indexOfPiece = moveablePieces.indexOf(msg.getPiece());
int steps = logic.getGame().getDiceModifier() * logic.getGame().getDiceEyes(); int steps = logic.getGame().getDiceModifier() * logic.getGame().getDiceEyes();
Piece piece = moveablePieces.get(indexOfPiece); Piece piece = moveablePieces.get(indexOfPiece);
@@ -96,7 +97,7 @@ public void received(RequestMoveMessage msg, int from){
int homeIndex = logic.getGame().getActivePlayer().getHomeIndexOfPiece(piece); int homeIndex = logic.getGame().getActivePlayer().getHomeIndexOfPiece(piece);
Node oldNode = logic.getGame().getActivePlayer().getHomeNodes()[homeIndex]; Node oldNode = logic.getGame().getActivePlayer().getHomeNodes()[homeIndex];
//gets the targetNode //gets the targetNode
int targetHomeIdx = getHomeTargetIdx(piece); int targetHomeIdx = getHomeTargetIdx(piece,steps);
Node targetNode = logic.getGame().getActivePlayer().getHomeNodes()[targetHomeIdx]; Node targetNode = logic.getGame().getActivePlayer().getHomeNodes()[targetHomeIdx];
oldNode.clearOccupant(); oldNode.clearOccupant();
@@ -114,7 +115,7 @@ public void received(RequestMoveMessage msg, int from){
Node oldNode = logic.getGame().getBoard().getInfield()[oldNoteIdx]; Node oldNode = logic.getGame().getBoard().getInfield()[oldNoteIdx];
//gets the targetNode //gets the targetNode
int targetHomeIdx = getHomeTargetIdx(piece); int targetHomeIdx = getHomeTargetIdx(piece,steps);
Node targetNode = logic.getGame().getActivePlayer().getHomeNodes()[targetHomeIdx]; Node targetNode = logic.getGame().getActivePlayer().getHomeNodes()[targetHomeIdx];
oldNode.clearOccupant(); oldNode.clearOccupant();
@@ -126,26 +127,28 @@ public void received(RequestMoveMessage msg, int from){
piece.setState(PieceState.HOME); piece.setState(PieceState.HOME);
System.out.println("Server: SelectPieceMessage: received(RequestMoveMessage): setPiece(Home)"+piece.getState()); System.out.println("Server: SelectPieceMessage: received(RequestMoveMessage): setPiece(Home)"+piece.getState());
} }
LOGGER.log(System.Logger.Level.INFO,"Server : SelectPieceState: PieceState:"+piece.getState());
} }
else{ else{
LOGGER.log(System.Logger.Level.INFO,"Server : SelectPieceState: PieceState:"+piece.getState());
int oldNoteIdx = logic.getGame().getBoard().getInfieldIndexOfPiece(piece); int oldNoteIdx = logic.getGame().getBoard().getInfieldIndexOfPiece(piece);
Node oldNode = logic.getGame().getBoard().getInfield()[oldNoteIdx]; Node oldNode = logic.getGame().getBoard().getInfield()[oldNoteIdx];
int targetIndex = (oldNoteIdx+steps)%40; int targetIndex = (oldNoteIdx+steps)%40;
Node targetNode = logic.getGame().getBoard().getInfield()[targetIndex]; Node targetNode = logic.getGame().getBoard().getInfield()[targetIndex];
oldNode.clearOccupant();
targetNode.setOccupant(piece);
Piece occ = targetNode.getOccupant(); Piece occ = targetNode.getOccupant();
if (occ != null) { if (occ != null) {
logic.getGame().getPlayerByColor(occ.getColor()).addWaitingPiece(occ); logic.getGame().getPlayerByColor(occ.getColor()).addWaitingPiece(occ);
} }
if(targetNode instanceof StartNode){ if(targetNode.isStart()){
if(piece.getShield()== ShieldState.ACTIVE) piece.setShield(ShieldState.SUPPRESSED); if(piece.getShield()== ShieldState.ACTIVE) piece.setShield(ShieldState.SUPPRESSED);
} }
oldNode.clearOccupant();
targetNode.setOccupant(piece);
} }
System.out.println("Server: SelectPieceMessage: received(RequestMoveMessage): pieceState: wichtig"+piece.getState()); System.out.println("Server: SelectPieceMessage: received(RequestMoveMessage): pieceState: wichtig"+piece.getState());
@@ -186,6 +189,7 @@ public void received(RequestMoveMessage msg, int from){
} }
*/ */
LOGGER.log(System.Logger.Level.INFO,"Server : SelectPieceState: PieceState: end:"+piece.getState());
logic.getServerSender().broadcast(new MoveMessage(piece, homeMove, targIdx)); logic.getServerSender().broadcast(new MoveMessage(piece, homeMove, targIdx));
System.out.println("Server changes from SelectPieceState to movePieceState"); System.out.println("Server changes from SelectPieceState to movePieceState");
this.choosePieceAutomaton.getTurnAutomaton().setCurrentState(this.choosePieceAutomaton.getTurnAutomaton().getMovePieceState()); this.choosePieceAutomaton.getTurnAutomaton().setCurrentState(this.choosePieceAutomaton.getTurnAutomaton().getMovePieceState());