added the method tryMove and the methods used by it into serverstate
This commit is contained in:
@@ -57,4 +57,13 @@ public Node[] getInfield() {
|
|||||||
public void setPieceOnBoard(int index, Piece piece) {
|
public void setPieceOnBoard(int index, Piece piece) {
|
||||||
infield[index].setOccupant(piece);
|
infield[index].setOccupant(piece);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getInfieldIndexOfPiece(Piece piece) {
|
||||||
|
for (int i = 0; i < infield.length; i++) {
|
||||||
|
if (infield[i].getOccupant() == piece) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
public class Piece {
|
public class Piece {
|
||||||
private ShieldState shield;
|
private ShieldState shield;
|
||||||
private PieceState state;
|
private PieceState state;
|
||||||
private Color color;
|
private final Color color;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This constructor is used to create a new Piece
|
* This constructor is used to create a new Piece
|
||||||
@@ -73,4 +73,13 @@ public boolean isShielded() {
|
|||||||
public boolean isSuppressed() {
|
public boolean isSuppressed() {
|
||||||
return shield == ShieldState.SUPPRESSED;
|
return shield == ShieldState.SUPPRESSED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method is used to get the color of the piece
|
||||||
|
*
|
||||||
|
* @return the color of the piece
|
||||||
|
*/
|
||||||
|
public Color getColor() {
|
||||||
|
return color;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -108,4 +108,32 @@ public Piece removePieceFromWaitingArea() {
|
|||||||
public void setPieceInHome(int index, Piece piece) {
|
public void setPieceInHome(int index, Piece piece) {
|
||||||
homeNodes[index].setOccupant(piece);
|
homeNodes[index].setOccupant(piece);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method returns the homeNodes
|
||||||
|
*
|
||||||
|
* @return the homeNodes
|
||||||
|
*/
|
||||||
|
public boolean homeIncludes(Piece piece) {
|
||||||
|
for (int i = 0; i < 4; i++) {
|
||||||
|
if (homeNodes[i].getOccupant() == piece) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method returns the homeNodes
|
||||||
|
*
|
||||||
|
* @return the homeNodes
|
||||||
|
*/
|
||||||
|
public int getIndexInHome(Piece piece) {
|
||||||
|
for (int i = 0; i < 4; i++) {
|
||||||
|
if (homeNodes[i].getOccupant() == piece) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,17 @@
|
|||||||
package pp.mdga.server;
|
package pp.mdga.server;
|
||||||
|
|
||||||
|
import pp.mdga.game.Color;
|
||||||
|
import pp.mdga.game.Node;
|
||||||
import pp.mdga.game.Piece;
|
import pp.mdga.game.Piece;
|
||||||
|
import pp.mdga.game.PieceState;
|
||||||
|
import pp.mdga.game.PlayerData;
|
||||||
import pp.mdga.message.client.*;
|
import pp.mdga.message.client.*;
|
||||||
import pp.mdga.message.server.EndOfTurn;
|
import pp.mdga.message.server.EndOfTurn;
|
||||||
import pp.mdga.message.server.PossibleCard;
|
import pp.mdga.message.server.PossibleCard;
|
||||||
import java.lang.System.Logger;
|
import java.lang.System.Logger;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public abstract class ServerState implements Observer{
|
public abstract class ServerState implements Observer{
|
||||||
protected static final Logger LOGGER = System.getLogger(ServerState.class.getName());
|
protected static final Logger LOGGER = System.getLogger(ServerState.class.getName());
|
||||||
@@ -61,6 +68,126 @@ public ServerState getParent() {
|
|||||||
|
|
||||||
public void update() { /* do nothing */ }
|
public void update() { /* do nothing */ }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method is used to calculate the steps a piece can move
|
||||||
|
*
|
||||||
|
* @return the steps a piece can move
|
||||||
|
*/
|
||||||
|
private int calculateSteps(){
|
||||||
|
return logic.getGame().getDiceEyes() * logic.getGame().getDiceModifier();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method is used to test if u can move a piece
|
||||||
|
*
|
||||||
|
* @param piece the piece to be moved
|
||||||
|
* @return true if the piece can be moved, false otherwise
|
||||||
|
*/
|
||||||
|
protected boolean tryMove(Piece piece) {
|
||||||
|
if (piece.getState() == PieceState.HOME){
|
||||||
|
return tryHomeMove(piece, calculateSteps());
|
||||||
|
} else {
|
||||||
|
int homeMoves = getHomeMoves(piece, calculateSteps());
|
||||||
|
if (homeMoves > 0){
|
||||||
|
return tryHomeMove(piece, homeMoves);
|
||||||
|
} else {
|
||||||
|
return tryInfieldMove(piece, calculateSteps());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method is used to determine if a piece would move into the home area.
|
||||||
|
*
|
||||||
|
* @param piece the piece to be moved
|
||||||
|
* @param steps the steps the piece would move
|
||||||
|
* @return the number of steps the piece would move into the home area
|
||||||
|
*/
|
||||||
|
protected int getHomeMoves(Piece piece, int steps) {
|
||||||
|
int figureIndex = logic.getGame().getBoard().getInfieldIndexOfPiece(piece);
|
||||||
|
Color col = piece.getColor();
|
||||||
|
int startIndex = logic.getGame().getBoard().getPlayerData().get(col).getStartNodeIndex();
|
||||||
|
int moveIndex = startIndex + steps;
|
||||||
|
if (moveIndex > logic.getGame().getBoard().getInfield().length){
|
||||||
|
moveIndex %= logic.getGame().getBoard().getInfield().length;
|
||||||
|
if(moveIndex >= startIndex){
|
||||||
|
return moveIndex - startIndex + 1;
|
||||||
|
}
|
||||||
|
} else if (figureIndex < startIndex && moveIndex >= startIndex){
|
||||||
|
return moveIndex - startIndex + 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method is used to determine if a piece can move in the infield
|
||||||
|
*
|
||||||
|
* @param piece the piece to be moved
|
||||||
|
* @param steps the steps the piece would move
|
||||||
|
* @return true if the piece can move in the infield, false otherwise
|
||||||
|
*/
|
||||||
|
protected boolean tryInfieldMove(Piece piece, int steps){
|
||||||
|
int figureIndex = logic.getGame().getBoard().getInfieldIndexOfPiece(piece);
|
||||||
|
int moveIndex = (figureIndex + steps) % logic.getGame().getBoard().getInfield().length;
|
||||||
|
Piece occupant = logic.getGame().getBoard().getInfield()[moveIndex].getOccupant();
|
||||||
|
if(occupant != null){
|
||||||
|
return occupant.getColor() != piece.getColor();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method is used to determine if a piece can move inside the home area
|
||||||
|
*
|
||||||
|
* @param piece the piece to be moved
|
||||||
|
* @param steps the steps the piece would move
|
||||||
|
* @return true if the piece can move into the home area, false otherwise
|
||||||
|
*/
|
||||||
|
protected boolean tryHomeMove(Piece piece, int steps){
|
||||||
|
Color col = piece.getColor();
|
||||||
|
PlayerData playerData = logic.getGame().getBoard().getPlayerData().get(col);
|
||||||
|
Node[] homeNodes = playerData.getHomeNodes();
|
||||||
|
int index;
|
||||||
|
|
||||||
|
if (playerData.homeIncludes(piece)){
|
||||||
|
index = playerData.getIndexInHome(piece);
|
||||||
|
} else {
|
||||||
|
index = 0;
|
||||||
|
}
|
||||||
|
if(index + steps >= homeNodes.length){
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
for(int i = index; i <= index + steps; i++){
|
||||||
|
if(homeNodes[i].getOccupant() != null){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method is used to get the pieces that can be moved
|
||||||
|
*
|
||||||
|
* @param color the color of the pieces
|
||||||
|
* @return the pieces that can be moved
|
||||||
|
*/
|
||||||
|
protected List<Piece> getMoveablePieces(Color color) {
|
||||||
|
ArrayList<Piece> moveablePieces = new ArrayList<>();
|
||||||
|
ArrayList<Piece> pieces = new ArrayList<>();
|
||||||
|
for (Piece piece : logic.getGame().getBoard().getPlayerData().get(color).getPieces()) {
|
||||||
|
if(piece.getState() == PieceState.ACTIVE || piece.getState() == PieceState.HOME){
|
||||||
|
pieces.add(piece);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (Piece piece : pieces) {
|
||||||
|
if (tryMove(piece)) {
|
||||||
|
moveablePieces.add(piece);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return moveablePieces;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return getClass().getSimpleName();
|
return getClass().getSimpleName();
|
||||||
|
|||||||
Reference in New Issue
Block a user