added more logic for the move
This commit is contained in:
@@ -4,6 +4,7 @@
|
||||
import pp.mdga.client.ClientState;
|
||||
import pp.mdga.client.gamestate.turnstate.ChoosePieceState;
|
||||
import pp.mdga.game.Piece;
|
||||
import pp.mdga.game.PieceState;
|
||||
import pp.mdga.message.client.RequestMoveMessage;
|
||||
import pp.mdga.message.client.SelectedPiecesMessage;
|
||||
import pp.mdga.message.server.MoveMessage;
|
||||
@@ -49,10 +50,30 @@ public void selectPiece(Piece piece) {
|
||||
public void received(MoveMessage msg) {
|
||||
Piece piece = logic.getGame().getPieceThroughUUID(msg.getPiece().getUuid());
|
||||
//logic.getGame().getBoard().getInfield()[logic.getGame().getBoard().getInfieldIndexOfPiece(piece)].clearOccupant();
|
||||
System.out.println("Client: selectPieceState: receivedMoveMessage: msg.isHomeMoved():"+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.getGame().getBoard().getInfield()[logic.getGame().getBoard().getInfieldIndexOfPiece(piece)].clearOccupant();
|
||||
logic.getGame().getPlayerByColor(piece.getColor()).setPieceInHome(msg.getTargetIndex(), piece);
|
||||
|
||||
*/
|
||||
} else {
|
||||
int oldIndex = logic.getGame().getBoard().getInfieldIndexOfPiece(piece);
|
||||
|
||||
|
||||
@@ -87,7 +87,7 @@ public Game() {
|
||||
gameStatistics = new Statistic();
|
||||
initializeDrawPile();
|
||||
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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -120,93 +120,97 @@ protected int calculateTargetIndex(Piece piece) {
|
||||
* @param piece the piece that will be checked
|
||||
* @return true, if the piece can move
|
||||
*/
|
||||
protected boolean canMove(Piece piece){
|
||||
System.out.println("Server: ChoosePieceStateMachine: canMove: piece.getState()"+piece.getState());
|
||||
protected boolean canMove(Piece piece) {
|
||||
System.out.println("Server: ChoosePieceStateMachine: canMove: piece.getState()" + piece.getState());
|
||||
int steps = logic.getGame().getDiceModifier() * logic.getGame().getDiceEyes();
|
||||
System.out.println("Server: ChoosePieceStateAutomaton: canMove:"+canPieceMoveInHome(piece,steps));
|
||||
if(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)) {
|
||||
System.out.println("Server: ChoosePieceStateMachine:canMove: entered canMove/canPieceMoveInHome");
|
||||
return true;
|
||||
}
|
||||
int pieceIdx = logic.getGame().getBoard().getInfieldIndexOfPiece(piece);
|
||||
System.out.println("ChoosePieceAutomaton: pieceIndex:"+ pieceIdx);
|
||||
System.out.println("ChoosePieceAutomaton: pieceIndex:" + pieceIdx);
|
||||
int startIdx = logic.getGame().getActivePlayer().getStartNodeIndex();
|
||||
int normPieceIdx = (-startIdx+pieceIdx+40)%40;
|
||||
int targetIdx = normPieceIdx+steps;
|
||||
if(40> targetIdx){
|
||||
int normPieceIdx = (-startIdx + pieceIdx + 40) % 40;
|
||||
int targetIdx = normPieceIdx + steps;
|
||||
//checks if the piece will not go over its home-field
|
||||
if (40 > targetIdx) {
|
||||
Color activeColor = logic.getGame().getActiveColor();
|
||||
System.out.println("ChoosePieceAutomaton: targetindex:"+ (pieceIdx+steps)%40);
|
||||
Node tartgetNode =logic.getGame().getBoard().getInfield()[(pieceIdx+steps)%40];
|
||||
if(!tartgetNode.isOccupied(activeColor)){
|
||||
if(!tartgetNode.isOccupied()||tartgetNode.getOccupant().getShield() != ShieldState.ACTIVE){
|
||||
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;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
//returns false it the piece can't move
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* tests if the piece can move in the home or inside the home
|
||||
*
|
||||
* @param piece
|
||||
* @param steps
|
||||
* @return false, if the piece can't move in the home
|
||||
*/
|
||||
protected boolean canPieceMoveInHome(Piece piece, int steps){
|
||||
protected boolean canPieceMoveInHome(Piece piece, int steps) {
|
||||
//tests if the piece can move inside the home
|
||||
System.out.println("Server: ChoosePieceStateMachine: canPieceMoveInHome: pieceState:" +piece.getState());
|
||||
if(piece.getState()==PieceState.HOME){
|
||||
System.out.println("Server: ChoosePieceStateMachine: canPieceMoveInHome: pieceState:" + piece.getState());
|
||||
steps = logic.getGame().getDiceModifier() * logic.getGame().getDiceEyes();
|
||||
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);
|
||||
if((4-homeIdx)>steps){
|
||||
System.out.println("Server: canPieceMoveInHome: !jumpOver"+ !jumpOver(steps,homeIdx,false));
|
||||
return !jumpOver(steps,homeIdx,false);
|
||||
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);
|
||||
}
|
||||
}
|
||||
//tests if the piece can move in the home
|
||||
if(piece.getState()==PieceState.ACTIVE){
|
||||
if (piece.getState() == PieceState.ACTIVE) {
|
||||
int pieceIdx = logic.getGame().getBoard().getInfieldIndexOfPiece(piece);
|
||||
int startIdx = logic.getGame().getActivePlayer().getStartNodeIndex();
|
||||
int normPieceIdx = (-startIdx+pieceIdx+40)%40;
|
||||
int targetIdx = normPieceIdx+steps;
|
||||
System.out.println("Server: ChoosePieceStateMachine: canPieceMoveInHome: pieceIndex:" +pieceIdx);
|
||||
System.out.println("Server: ChoosePieceStateMachine: canPieceMoveInHome: targetIdx:" +targetIdx);
|
||||
if(targetIdx >= 40){
|
||||
int stepsToHome = 39- normPieceIdx;
|
||||
int restMovement = steps-stepsToHome;
|
||||
System.out.println("Server: ChoosePieceStateMachine: canPieceMoveInHome: stepsToHome:" +stepsToHome);
|
||||
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);
|
||||
}
|
||||
int normPieceIdx = (-startIdx + pieceIdx + 40) % 40;
|
||||
int targetIdx = normPieceIdx + steps;
|
||||
System.out.println("Server: ChoosePieceStateMachine: canPieceMoveInHome: pieceIndex:" + pieceIdx + "targetIdx:" + targetIdx);
|
||||
if (targetIdx >= 40) {
|
||||
int stepsToHome = 39 - normPieceIdx;
|
||||
int restMovement = steps - stepsToHome - 1;
|
||||
System.out.println("Server: ChoosePieceStateMachine: canPieceMoveInHome: stepsToHome:" + stepsToHome + "restMovement:" + restMovement + "jumpOver:" + jumpOver(restMovement, 0, true) + "canPieceMoveInHome: return:" + true);
|
||||
return !jumpOver(restMovement, 0, true);
|
||||
}
|
||||
}
|
||||
System.out.println("Server: ChoosePieceStateMachine: canPieceMoveInHome: return:" +false);
|
||||
System.out.println("Server: ChoosePieceStateMachine: canPieceMoveInHome: return:" + false);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* tests if the piece, when moved in or inside a home, must jump over another piece
|
||||
*
|
||||
* @param stepsInHome the steps walked inside the home
|
||||
* @param homeIdx the index of the piece inside, or 0 if come from outside
|
||||
* @param outside a boolean, if the piece moves inside a house or in a house
|
||||
* @param homeIdx the index of the piece inside, or 0 if come from outside
|
||||
* @param outside a boolean, if the piece moves inside a house or in a house
|
||||
* @return false, if there is no piece to jump over
|
||||
*/
|
||||
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
|
||||
if(outside){
|
||||
for(int i =0;i < stepsInHome;i++){
|
||||
if(logic.getGame().getActivePlayer().getHomeNodes()[i].isOccupied()) return true;
|
||||
if (outside) {
|
||||
System.out.println("Server: ChoosePieceState: jumpOver: from outside");
|
||||
for (int i = 0; i < stepsInHome; i++) {
|
||||
if (logic.getGame().getActivePlayer().getHomeNodes()[i].isOccupied()) return true;
|
||||
}
|
||||
}
|
||||
//tests if the piece jumps over a piece inside the home
|
||||
else{
|
||||
for(int i = 1+homeIdx; i<homeIdx+stepsInHome; i++){
|
||||
if(logic.getGame().getActivePlayer().getHomeNodes()[i].isOccupied()) return true;
|
||||
//tests if the piece jumps over a piece from inside the home
|
||||
else {
|
||||
for (int i = 1 + homeIdx; i < homeIdx + stepsInHome; i++) {
|
||||
if (logic.getGame().getActivePlayer().getHomeNodes()[i].isOccupied()) return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
@@ -218,21 +222,22 @@ private boolean jumpOver(int stepsInHome,int homeIdx,boolean outside){
|
||||
* @param piece the give piece
|
||||
* @return the index in the home, where the piece will go
|
||||
*/
|
||||
protected int getHomeTargetIdx (Piece piece){
|
||||
int steps = logic.getGame().getDiceModifier() * logic.getGame().getDiceEyes();
|
||||
if(piece.getState()==PieceState.ACTIVE) {
|
||||
protected int getHomeTargetIdx(Piece piece, int steps) {
|
||||
//tests if the piece is active and move in the house
|
||||
if (piece.getState() == PieceState.ACTIVE) {
|
||||
//gets the id's
|
||||
int pieceIdx = logic.getGame().getBoard().getInfieldIndexOfPiece(piece);
|
||||
int startIdx = logic.getGame().getActivePlayer().getStartNodeIndex();
|
||||
//normalize the idx
|
||||
int normPieceIdx = (-startIdx+pieceIdx+40)%40;
|
||||
int normPieceIdx = (-startIdx + pieceIdx + 40) % 40;
|
||||
//calculate the steps to the home
|
||||
int stepsToHome = 39- normPieceIdx;
|
||||
int stepsToHome = 39 - normPieceIdx;
|
||||
//calculates the rest-movement inside a home
|
||||
int restMovement = steps-stepsToHome;
|
||||
int restMovement = steps - stepsToHome - 1;
|
||||
return restMovement;
|
||||
}
|
||||
else{
|
||||
//the else handles the logic if the piece is in the home and moves inside the house
|
||||
else {
|
||||
int pieceHomeIdx = logic.getGame().getActivePlayer().getHomeIndexOfPiece(piece);
|
||||
return pieceHomeIdx + steps;
|
||||
}
|
||||
@@ -244,22 +249,27 @@ protected int getHomeTargetIdx (Piece piece){
|
||||
* @param piece the piece given
|
||||
* @return the index in the infield
|
||||
*/
|
||||
protected int getInfieldTarget(Piece piece){
|
||||
int steps = logic.getGame().getDiceModifier() * logic.getGame().getDiceEyes();
|
||||
protected int getInfieldTarget(Piece piece, int steps) {
|
||||
int index = logic.getGame().getBoard().getInfieldIndexOfPiece(piece);
|
||||
return (steps+index)%40;
|
||||
return (steps + index) % 40;
|
||||
}
|
||||
|
||||
|
||||
protected int calculateTargetIndex(Piece piece){
|
||||
/**
|
||||
* this method is used for calculating the targetIndex
|
||||
*
|
||||
* @param piece
|
||||
* @return
|
||||
*/
|
||||
protected int calculateTargetIndex(Piece piece) {
|
||||
int steps = logic.getGame().getDiceModifier() * logic.getGame().getDiceEyes();
|
||||
if(canPieceMoveInHome(piece, steps)){
|
||||
System.out.println("Server: ChoosePieceStateAutomaton: calculate index in home:"+getHomeTargetIdx(piece));
|
||||
return getHomeTargetIdx(piece);
|
||||
if (canPieceMoveInHome(piece, steps)) {
|
||||
System.out.println("Server: ChoosePieceStateAutomaton: calculate index in home:" + getHomeTargetIdx(piece, steps));
|
||||
return getHomeTargetIdx(piece, steps);
|
||||
}
|
||||
return getInfieldTarget(piece);
|
||||
System.out.println("Server: ChoosePieceStateAutomaton: calculate index in Infield:" + getInfieldTarget(piece, steps));
|
||||
return getInfieldTarget(piece, steps);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -59,7 +59,6 @@ private void checkSelectPiece(Player activePlayer){
|
||||
ArrayList<Piece> moveablePieces = new ArrayList<>();
|
||||
for (Piece piece : activePlayer.getPieces()){
|
||||
if (piece.getState().equals(PieceState.ACTIVE) || piece.getState().equals(PieceState.HOME)){
|
||||
System.out.println("Server: NoPieceState: movablePieces.size()"+piece.getState());
|
||||
moveablePieces.add(piece);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -64,13 +64,13 @@ public void enter(){
|
||||
for (Piece piece : moveablePieces) {
|
||||
|
||||
if(canPieceMoveInHome(piece,steps)){
|
||||
int target= getHomeTargetIdx(piece);
|
||||
int target= getHomeTargetIdx(piece,steps);
|
||||
System.out.println("Server: SelectPieceState: enter in canPieceMoveInHome: targetIndex:"+target);
|
||||
targetIndex.add(target);
|
||||
isHomeMove.add(true);
|
||||
}
|
||||
else{
|
||||
int target = getInfieldTarget(piece);
|
||||
int target = getInfieldTarget(piece,steps);
|
||||
System.out.println("Server: SelectPieceState: enter in else: targetIndex:"+target);
|
||||
targetIndex.add(target);
|
||||
isHomeMove.add(false);
|
||||
@@ -85,6 +85,7 @@ public void received(RequestMoveMessage msg, int from){
|
||||
if(!moveablePieces.contains(msg.getPiece())){
|
||||
throw new RuntimeException("invalid Piece");
|
||||
}
|
||||
|
||||
int indexOfPiece = moveablePieces.indexOf(msg.getPiece());
|
||||
int steps = logic.getGame().getDiceModifier() * logic.getGame().getDiceEyes();
|
||||
Piece piece = moveablePieces.get(indexOfPiece);
|
||||
@@ -96,7 +97,7 @@ public void received(RequestMoveMessage msg, int from){
|
||||
int homeIndex = logic.getGame().getActivePlayer().getHomeIndexOfPiece(piece);
|
||||
Node oldNode = logic.getGame().getActivePlayer().getHomeNodes()[homeIndex];
|
||||
//gets the targetNode
|
||||
int targetHomeIdx = getHomeTargetIdx(piece);
|
||||
int targetHomeIdx = getHomeTargetIdx(piece,steps);
|
||||
Node targetNode = logic.getGame().getActivePlayer().getHomeNodes()[targetHomeIdx];
|
||||
|
||||
oldNode.clearOccupant();
|
||||
@@ -114,7 +115,7 @@ public void received(RequestMoveMessage msg, int from){
|
||||
Node oldNode = logic.getGame().getBoard().getInfield()[oldNoteIdx];
|
||||
|
||||
//gets the targetNode
|
||||
int targetHomeIdx = getHomeTargetIdx(piece);
|
||||
int targetHomeIdx = getHomeTargetIdx(piece,steps);
|
||||
Node targetNode = logic.getGame().getActivePlayer().getHomeNodes()[targetHomeIdx];
|
||||
|
||||
oldNode.clearOccupant();
|
||||
@@ -126,26 +127,28 @@ public void received(RequestMoveMessage msg, int from){
|
||||
piece.setState(PieceState.HOME);
|
||||
System.out.println("Server: SelectPieceMessage: received(RequestMoveMessage): setPiece(Home)"+piece.getState());
|
||||
}
|
||||
LOGGER.log(System.Logger.Level.INFO,"Server : SelectPieceState: PieceState:"+piece.getState());
|
||||
}
|
||||
else{
|
||||
LOGGER.log(System.Logger.Level.INFO,"Server : SelectPieceState: PieceState:"+piece.getState());
|
||||
int oldNoteIdx = logic.getGame().getBoard().getInfieldIndexOfPiece(piece);
|
||||
Node oldNode = logic.getGame().getBoard().getInfield()[oldNoteIdx];
|
||||
|
||||
int targetIndex = (oldNoteIdx+steps)%40;
|
||||
Node targetNode = logic.getGame().getBoard().getInfield()[targetIndex];
|
||||
|
||||
oldNode.clearOccupant();
|
||||
targetNode.setOccupant(piece);
|
||||
|
||||
Piece occ = targetNode.getOccupant();
|
||||
if (occ != null) {
|
||||
logic.getGame().getPlayerByColor(occ.getColor()).addWaitingPiece(occ);
|
||||
}
|
||||
|
||||
if(targetNode instanceof StartNode){
|
||||
if(targetNode.isStart()){
|
||||
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());
|
||||
@@ -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));
|
||||
System.out.println("Server changes from SelectPieceState to movePieceState");
|
||||
this.choosePieceAutomaton.getTurnAutomaton().setCurrentState(this.choosePieceAutomaton.getTurnAutomaton().getMovePieceState());
|
||||
|
||||
Reference in New Issue
Block a user