state: Added more scoring and turn actions
This commit is contained in:
parent
28630ea520
commit
8ed19d75bd
@ -1,5 +1,8 @@
|
|||||||
package comp1110.ass2;
|
package comp1110.ass2;
|
||||||
|
|
||||||
|
import java.util.Random;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Player class
|
* Player class
|
||||||
* This class is used to store the information of a player
|
* This class is used to store the information of a player
|
||||||
@ -231,6 +234,47 @@ public class Player {
|
|||||||
return numPieces;
|
return numPieces;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if player is able to do any moves
|
||||||
|
* @return true if player can do any moves, false otherwise
|
||||||
|
*/
|
||||||
|
public boolean canPlay(State state) {
|
||||||
|
Set<String> validMoves = BlueLagoon.generateAllValidMoves(state.toString());
|
||||||
|
return validMoves.size() > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Do a Random Move
|
||||||
|
* @param state State to do the move on
|
||||||
|
*/
|
||||||
|
public void doRandomMove(State state) {
|
||||||
|
if (state.getCurrentPlayerID() != playerID) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Set<String> validMoves = BlueLagoon.generateAllValidMoves(state.toString());
|
||||||
|
if (validMoves.size() == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Random rand = new Random();
|
||||||
|
int randomMove = rand.nextInt(0, validMoves.size());
|
||||||
|
int i = 0;
|
||||||
|
for (String move : validMoves) {
|
||||||
|
if (i == randomMove) {
|
||||||
|
char pieceType = move.charAt(0);
|
||||||
|
String coordStr = move.substring(2);
|
||||||
|
int x = Integer.parseInt(coordStr.split(",")[0]);
|
||||||
|
int y = Integer.parseInt(coordStr.split(",")[1]);
|
||||||
|
Coord coord = new Coord(x, y);
|
||||||
|
state.placePiece(coord, pieceType);
|
||||||
|
state.nextPlayer();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
String str = "p " + playerID + " " + score + " " + numCoconuts + " " + numBamboo + " " + numWater + " " + numPreciousStones + " " + numStatuette + " S";
|
String str = "p " + playerID + " " + score + " " + numCoconuts + " " + numBamboo + " " + numWater + " " + numPreciousStones + " " + numStatuette + " S";
|
||||||
|
@ -228,19 +228,29 @@ public class State {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the current player
|
* Get the current player ID
|
||||||
* @return int current player
|
* @return int current player
|
||||||
*/
|
*/
|
||||||
public int getCurrentPlayer() {
|
public int getCurrentPlayerID() {
|
||||||
return currentPlayer;
|
return currentPlayer;
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* Get the current player
|
||||||
|
* @return Player current player
|
||||||
|
*/
|
||||||
|
public Player getCurrentPlayer() {
|
||||||
|
return players[currentPlayer];
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the current phase
|
* Get the current phase
|
||||||
|
* Returns 'E' for exploration, 'S' for settlement, 'O' for game over
|
||||||
* @return char current phase
|
* @return char current phase
|
||||||
*/
|
*/
|
||||||
public char getCurrentPhase() {
|
public char getCurrentPhase() {
|
||||||
if (currentPhase == 0) return 'E';
|
if (currentPhase == 0) return 'E';
|
||||||
else return 'S';
|
else if (currentPhase == 1) return 'S';
|
||||||
|
else return 'O'; // Return 'O' for game over
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -340,16 +350,6 @@ public class State {
|
|||||||
if (currentPlayer >= numPlayers) currentPlayer = 0;
|
if (currentPlayer >= numPlayers) currentPlayer = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Start next phase.
|
|
||||||
* This handles changing the current player and scoring
|
|
||||||
*/
|
|
||||||
public void nextPhase() {
|
|
||||||
currentPhase++;
|
|
||||||
if (currentPhase > 1) currentPhase = 0;
|
|
||||||
nextPlayer();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Place a piece on the board. Uses current turn's player
|
* Place a piece on the board. Uses current turn's player
|
||||||
* @param coord Coord coordinate to place piece
|
* @param coord Coord coordinate to place piece
|
||||||
@ -374,9 +374,54 @@ public class State {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* is the phase over?
|
||||||
|
*/
|
||||||
|
public boolean isPhaseOver() {
|
||||||
|
|
||||||
|
boolean resourcesLeft = false;
|
||||||
|
for (Resource r : resources) {
|
||||||
|
if (!r.isClaimed() && r.getType() != 'S') resourcesLeft = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean moveLeft = false;
|
||||||
|
for (Player player : players) {
|
||||||
|
if (player.canPlay(this)) moveLeft = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return !resourcesLeft || !moveLeft;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// endregion
|
// endregion
|
||||||
|
|
||||||
// region Scoring
|
// region Scoring
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Score for that phase
|
||||||
|
*/
|
||||||
|
public void scorePhase() {
|
||||||
|
for (Player p: players) {
|
||||||
|
p.addScore(createScore(p.getPlayerID()));
|
||||||
|
}
|
||||||
|
if (getCurrentPhase() == 'E') {
|
||||||
|
currentPhase++;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Game over
|
||||||
|
finalScore();
|
||||||
|
currentPhase++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Final score
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void finalScore() {
|
||||||
|
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Get score of player ID based on current phase and game state
|
* Get score of player ID based on current phase and game state
|
||||||
* @param playerID int player ID base 0
|
* @param playerID int player ID base 0
|
||||||
@ -465,12 +510,64 @@ public class State {
|
|||||||
return score;
|
return score;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Score Links
|
||||||
|
* A (potentially) branching path of neighbouring settlers and villages
|
||||||
|
* belonging to a player forms a chain. Players earn points from the chain
|
||||||
|
* of their pieces which links the most islands. Players earn 5 points
|
||||||
|
* per linked island in this chain.
|
||||||
|
* @param playerID int player to score
|
||||||
|
* @return int score
|
||||||
|
*/
|
||||||
|
public int scoreLinks(int playerID) {
|
||||||
|
int score = 0;
|
||||||
|
return score; //! TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Score resources
|
||||||
|
* @param playerID int player to score
|
||||||
|
* @return int score
|
||||||
|
*/
|
||||||
|
public int scoreResources(int playerID) {
|
||||||
|
int score = 0;
|
||||||
|
char[] resourceTypes = {'C', 'B', 'W', 'P'};
|
||||||
|
for (char type : resourceTypes) {
|
||||||
|
int numResources = players[playerID].getNumResource(type);
|
||||||
|
if (numResources >= 4) {
|
||||||
|
score += 20;
|
||||||
|
} else if (numResources == 3) {
|
||||||
|
score += 10;
|
||||||
|
} else if (numResources == 2) {
|
||||||
|
score += 5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int numCoconuts = players[playerID].getNumResource('C');
|
||||||
|
int numBananas = players[playerID].getNumResource('B');
|
||||||
|
int numWater = players[playerID].getNumResource('W');
|
||||||
|
int numPreciousStones = players[playerID].getNumResource('P');
|
||||||
|
if (numCoconuts >= 1 && numBananas >= 1 && numWater >= 1 && numPreciousStones >= 1) {
|
||||||
|
score += 10;
|
||||||
|
}
|
||||||
|
return score;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Score statuettes
|
||||||
|
* @param playerID int player to score
|
||||||
|
* @return int score
|
||||||
|
*/
|
||||||
|
public int scoreStatuettes(int playerID) {
|
||||||
|
int score = 0;
|
||||||
|
return score; //! TODO
|
||||||
|
}
|
||||||
|
|
||||||
// endregion
|
// endregion
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
String str = "a " + boardHeight + " " + getNumPlayers() + "; c " + getCurrentPlayer() + " " + getCurrentPhase() + "; ";
|
String str = "a " + boardHeight + " " + getNumPlayers() + "; c " + getCurrentPlayerID() + " " + getCurrentPhase() + "; ";
|
||||||
for (Island island : islands) {
|
for (Island island : islands) {
|
||||||
str += island.toString() + " ";
|
str += island.toString() + " ";
|
||||||
}
|
}
|
||||||
|
@ -15,7 +15,7 @@ public class StateTest {
|
|||||||
State state = new State(GameDataLoader.DEFAULT_GAME);
|
State state = new State(GameDataLoader.DEFAULT_GAME);
|
||||||
Assertions.assertEquals(13, state.getBoardHeight(), "The test failed because the board length is not 13");
|
Assertions.assertEquals(13, state.getBoardHeight(), "The test failed because the board length is not 13");
|
||||||
Assertions.assertEquals(2, state.getNumPlayers(), "The test failed because the number of players is not 2");
|
Assertions.assertEquals(2, state.getNumPlayers(), "The test failed because the number of players is not 2");
|
||||||
Assertions.assertEquals(0, state.getCurrentPlayer(), "The test failed because the current player is not 0");
|
Assertions.assertEquals(0, state.getCurrentPlayerID(), "The test failed because the current player is not 0");
|
||||||
Assertions.assertEquals('E', state.getCurrentPhase(), "The test failed because the current phase is not E");
|
Assertions.assertEquals('E', state.getCurrentPhase(), "The test failed because the current phase is not E");
|
||||||
|
|
||||||
Assertions.assertEquals(GameDataLoader.DEFAULT_GAME,state.toString(), "The test failed because the state created from the string is not the same as the state created from the string");
|
Assertions.assertEquals(GameDataLoader.DEFAULT_GAME,state.toString(), "The test failed because the state created from the string is not the same as the state created from the string");
|
||||||
@ -56,7 +56,6 @@ public class StateTest {
|
|||||||
// Distribute resources
|
// Distribute resources
|
||||||
state.distributeResources();
|
state.distributeResources();
|
||||||
Resource toClaim = state.getUnclaimedResource(new Coord(0,0));
|
Resource toClaim = state.getUnclaimedResource(new Coord(0,0));
|
||||||
System.out.println(toClaim);
|
|
||||||
|
|
||||||
// Place a settler at (0,0)
|
// Place a settler at (0,0)
|
||||||
state.placePiece(new Coord(0,0), 'S');
|
state.placePiece(new Coord(0,0), 'S');
|
||||||
@ -71,6 +70,19 @@ public class StateTest {
|
|||||||
public void testStateWHEELSGAME(){
|
public void testStateWHEELSGAME(){
|
||||||
State state = new State(GameDataLoader.WHEELS_GAME);
|
State state = new State(GameDataLoader.WHEELS_GAME);
|
||||||
Assertions.assertEquals(GameDataLoader.WHEELS_GAME,state.toString(), "The test failed because the state created from the string is not the same as the state created from the string");
|
Assertions.assertEquals(GameDataLoader.WHEELS_GAME,state.toString(), "The test failed because the state created from the string is not the same as the state created from the string");
|
||||||
|
|
||||||
|
state.distributeResources();
|
||||||
|
Assertions.assertFalse(state.isPhaseOver(), "The test failed because the phase is over even though it should not be because the phase is not over");
|
||||||
|
|
||||||
|
// Test endPhase
|
||||||
|
while (!state.isPhaseOver()) {
|
||||||
|
if (!state.getCurrentPlayer().canPlay(state)) state.nextPlayer();
|
||||||
|
state.getCurrentPlayer().doRandomMove(state);
|
||||||
|
}
|
||||||
|
state.scorePhase();
|
||||||
|
System.out.println(state);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user