Merge remote-tracking branch 'origin/main'

# Conflicts:
#	.idea/misc.xml
#	src/ch/zhaw/catan/Road.java
#	src/ch/zhaw/catan/SiedlerBoard.java
This commit is contained in:
Speedy Gonzalez 2021-12-10 11:19:19 +01:00
commit 3fb5d72699
8 changed files with 89 additions and 95 deletions

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="openjdk-17" project-jdk-type="JavaSDK">
<component name="ProjectRootManager" version="2" languageLevel="JDK_16" project-jdk-name="openjdk-17" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

View File

@ -7,8 +7,8 @@ to be able to dominate your friends.
#Rules
1. The min. Player amount is 2 and the max. Player amount is 4.
2. Each Player can build a road and a settlement free of cost at the beginning of
the game.
2. Each Player can build two roads and two settlements free of cost at the beginning of
the game. After the placement, each player gets resources from the field around the second settlement.
3. Every Player is being sorted into a faction. There cannot be two players in the
same faction.
4. A player cannot build two settlements or cities right next one another.
@ -25,7 +25,7 @@ For a more detailed version of the rules please look here: https://www.catan.de/
#Usermanual
First the program will ask how many players will be playing the game. The minimum
amount of players is 2 and the maximum amount of players is 4. Each player will
be appointed to a faction. Now every player can build a settlement and a road
be appointed to a faction. In the next step, the program ask for the number of win points. The first player who reaches this number of win points, will win the game. Now every player can build a settlement and a road
after every player has built a settlement and road, they can build a second
settlement and road in reversed order. When the players build their second
settlement they then receive the resources surrounding that specific settlement.

View File

@ -4,10 +4,10 @@ import java.util.HashMap;
import java.util.List;
/**
* This class is here in order to maintain the resources of the players, the amount of structures that they can build,
* control to see if a player has enough to build a new structure and to add them into a faction.
* This class is here in order to maintain the resources of the players, the amount of structures that they can build.
* And check if a player holds enough resources to build.
*
* @author Leonardo Brandenberger, Roman Schrom, Andrin Fassbind, Stefan Amador
* @author Leonardo Brandenberger, Roman Schenk, Andrin Fassbind, Stefan Amador
*/
public class Player {
@ -18,7 +18,7 @@ public class Player {
/**
* The constructor initializes the faction and the Hashmaps resources and structureToUse.
*
* @param faction this is the faction of the player.
* @param faction faction of the player.
*/
public Player(Config.Faction faction) {
//Data fields
@ -36,7 +36,7 @@ public class Player {
}
/**
* This method returns all the resources the player has at the moment
* This method returns all the resources the player has at the moment.
*
* @return HashMap with the count of every resource
*/
@ -45,7 +45,7 @@ public class Player {
}
/**
* This method returns player faction
* This method returns the player's faction.
*
* @return the faction of the player.
*/
@ -56,15 +56,15 @@ public class Player {
/**
* This method returns the amount of a specific resource that a player owns.
*
* @param resource the resource that is needed.
* @return the amount of the specific resource.
* @param resource the resource that is needed
* @return the amount of the specific resource
*/
public int getSpecificResource(Config.Resource resource) {
return resources.get(resource);
}
/**
* This method adds a specific resource to resources
* This method adds a specific resource to resources of the player.
*
* @param resource to add
* @param numberToAdd how much to add
@ -91,7 +91,7 @@ public class Player {
/**
* This method has to be used when a player wants to build a structure. It checks if a player has enough of the specific structure
* and resources to build one more. If the player is able to build, this method subtracts the building cost from the resources
* and resources to build . If the player is able to build, this method subtracts the building cost from the resources
* in possession by the player.
* It reduces the amount of the specific structure a player can build by 1.
*

View File

@ -1,12 +1,13 @@
package ch.zhaw.catan;
import java.awt.*;
import java.awt.Point;
/// TODO: 09/12/2021 Java Doc
/**
* sub Class of Structure
* Sub Class of Structure
* Can be saved in Siedler Board on Edges.
*
* @author Andrin Fassbind, Michael Ziegler
*/
public class Road extends Structure {
@ -14,10 +15,11 @@ public class Road extends Structure {
private final Point start, end;
/**
* Constructor of Road
* @param faction The faction of the owner
* @param start the coordinates of the start Point
* @param end the coordinates of the End Point
* Constructs a road with a start and endpoint.
*
* @param faction The faction of the road owner
* @param start the coordinates of the start as a Point
* @param end the coordinates of the end as a Point
*/
public Road(Config.Faction faction, Point start, Point end) {
super(faction);
@ -26,16 +28,18 @@ public class Road extends Structure {
}
/**
* Returns the Coordinate as a Point of the start of the road.
*
* @return the coordinates of the start Point
* @return Point of the start of the road
*/
public Point getStart() {
return start;
}
/**
* Returns the Coordinate as a Point of the end of the road.
*
* @return the coordinates of the end Point
* @return Point of the end of the road
*/
public Point getEnd() {
return end;

View File

@ -5,6 +5,8 @@ import java.awt.*;
/**
* Sub Class of Structure and Super Class of City
* Can be saved in Siedler Board on a corner
*
* @author Andrin Fassbind, Roman Schenk
*/
public class Settlement extends Structure {
@ -17,6 +19,8 @@ public class Settlement extends Structure {
}
/**
* This Methode Returns the Position of the Settlement
*
* @return the datafield position
*/
public Point getPosition() {

View File

@ -5,6 +5,8 @@ import java.util.Random;
/**
* This Class manages the game process and contains the Main Method which creates and starts a new Parser and a new Game.
*
* @author Leonardo Brandeberger, Roman Schenk
*/
public class Siedler {
/**
@ -29,7 +31,7 @@ public class Siedler {
boolean diceThrown = false;
while (running) {
Config.Faction currentPlayerFaction = game.getCurrentPlayerFaction();
parser.displayGameboard(game.getBoard().getTextView()); //TODO Every turn or separate command?
parser.displayGameboard(game.getBoard().getTextView());
parser.playerTurn(currentPlayerFaction);
if (!diceThrown) {
throwDice(parser, game);

View File

@ -4,14 +4,13 @@ import ch.zhaw.hexboard.HexBoard;
import ch.zhaw.hexboard.Label;
import java.awt.Point;
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Iterator;
import java.util.Collections;
//TODO Enhance JavaDoc
import java.util.List;
import java.util.Map;
/**
* Subclass of HexBoard
@ -22,12 +21,11 @@ public class SiedlerBoard extends HexBoard<Config.Land, Settlement, Road, String
/**
* HashMap to save all Fields which are set yet.
* Key: Point with coordinates of the field
* //TODO Enhance JavaDoc
* Value: Field Object
*/
private final HashMap<Point, Field> fields = new HashMap<>();
Config.Faction longestRoadFaction = null;
int longestRoadLength = 0;
private Config.Faction longestRoadFaction = null;
private int longestRoadLenth = 0;
/**
* Method to create the predefined game field from Config.
@ -138,6 +136,7 @@ public class SiedlerBoard extends HexBoard<Config.Land, Settlement, Road, String
/**
* This method checks for the player with the longest road according to the siedler game rules.
*
* @param factionList a List with all factions which can place structures on the board
* @return the faction who owns the longest road with minimum length of 5, null there is no road longer then 4
*/
@ -161,33 +160,18 @@ public class SiedlerBoard extends HexBoard<Config.Land, Settlement, Road, String
}
}
if (longestRoadFaction == null) {
Config.Faction currentFaction = null;
int currentRoad = 4;
for (Config.Faction factionA : players.keySet()) {
if (players.get(factionA) > currentRoad) {
currentFaction = factionA;
currentRoad = players.get(factionA);
}
}
if (currentFaction != null) {
longestRoadFaction = currentFaction;
longestRoadLength = currentRoad;
}
} else {
for (Config.Faction faction : players.keySet()) {
if (players.get(faction) >= 5 && players.get(faction) > longestRoadLength) {
longestRoadFaction = faction;
longestRoadLength = players.get(faction);
}
if (players.get(factionA) > longestRoadLenth && players.get(factionA) > 4) {
longestRoadFaction = factionA;
longestRoadLenth = players.get(factionA);
}
}
return longestRoadFaction;
}
//todo javadoc
public int getLongestRoadLength() {
return longestRoadLength;
public int getLongestRoadLenth() {
return longestRoadLenth;
}
/**
@ -202,75 +186,55 @@ public class SiedlerBoard extends HexBoard<Config.Land, Settlement, Road, String
*/
private HashSet<Road> countRoad(Config.Faction faction, Point position, HashSet<Road> roads, boolean add) {
List<Road> roadsList = getAdjacentEdges(position);
//Checks if roads is interrupted by other players settlement
if (getCorner(position) != null && getCorner(position).getFaction() != faction) {
return roads;
}
//removes roads from roadsList which doesn't belong to the same player or which are allready added to roads.
for (Road roadsRoad : roads) {
Iterator<Road> it3 = roadsList.iterator();
while (it3.hasNext()) {
Road roadsListRoad = it3.next();
Iterator<Road> it = roadsList.iterator();
while (it.hasNext()) {
Road roadsListRoad = it.next();
if (roadsListRoad == roadsRoad || roadsListRoad.getFaction() != faction) {
it3.remove();
it.remove();
}
}
}
if (roadsList.size() == 1) {
roads.add(roadsList.get(0));
position = getNextPoint(roadsList.get(0), position);
roads = countRoad(faction, position, roads, false);
} else if (roadsList.size() == 2) {
HashSet<Road> listOne = (HashSet<Road>) roads.clone();
HashSet<Road> listTwo = (HashSet<Road>) roads.clone();
listOne.add(roadsList.get(0));
Point positionOne = getNextPoint(roadsList.get(0), position);
listTwo.add(roadsList.get(1));
Point positionTwo = getNextPoint(roadsList.get(1), position);
listOne = countRoad(faction, positionOne, listOne, false);
listTwo = countRoad(faction, positionTwo, listTwo, false);
ArrayList<HashSet<Road>> possibleRoads = checkRoadsSwitch(faction,2,roadsList,position);
if (add) {
listTwo.addAll(listOne);
roads = listTwo;
possibleRoads.get(1).addAll(possibleRoads.get(0));
roads.addAll(possibleRoads.get(1));
} else {
HashSet<Road> tallest;
if (listOne.size() >= listTwo.size()) {
tallest = listOne;
if (possibleRoads.get(0).size() >= possibleRoads.get(1).size()) {
tallest = possibleRoads.get(0);
} else {
tallest = listTwo;
tallest = possibleRoads.get(1);
}
roads.addAll(tallest);
}
} else if (roadsList.size() == 3) {
HashSet<Road> listOne = (HashSet<Road>) roads.clone();
HashSet<Road> listTwo = (HashSet<Road>) roads.clone();
HashSet<Road> listThree = (HashSet<Road>) roads.clone();
listOne.add(roadsList.get(0));
Point positionOne = getNextPoint(roadsList.get(0), position);
listTwo.add(roadsList.get(1));
Point positionTwo = getNextPoint(roadsList.get(1), position);
listThree.add(roadsList.get(2));
Point positionThree = getNextPoint(roadsList.get(2), position);
listOne = countRoad(faction, positionOne, listOne, false);
listTwo = countRoad(faction, positionTwo, listTwo, false);
listThree = countRoad(faction, positionThree, listThree, false);
ArrayList<HashSet<Road>> possibleRoads = checkRoadsSwitch(faction,3,roadsList,position);
HashSet<Road> tallest;
HashSet<Road> secondTallest;
if (listOne.size() >= listTwo.size()) {
tallest = listOne;
secondTallest = listTwo;
if (possibleRoads.get(0).size() >= possibleRoads.get(1).size()) {
tallest = possibleRoads.get(0);
secondTallest = possibleRoads.get(1);
} else {
tallest = listTwo;
secondTallest = listOne;
tallest = possibleRoads.get(1);
secondTallest = possibleRoads.get(0);
}
if (listThree.size() >= secondTallest.size()) {
secondTallest = listThree;
if (possibleRoads.get(2).size() >= secondTallest.size()) {
secondTallest = possibleRoads.get(2);
}
tallest.addAll(secondTallest);
roads = tallest;
roads.addAll(tallest);
}
return roads;
}
@ -292,4 +256,24 @@ public class SiedlerBoard extends HexBoard<Config.Land, Settlement, Road, String
}
return position;
}
/**
* This method checks at a roads switch, which road starting at the switch will be the longest possibility.
* @param faction the faction of the player to check on
* @param numberOfSwitches how many adjacent roads there are at the corner
* @param roadsList the list of adjacent roads
* @param position the current corner from where to count further.
* @return ArrayList of HashSet with all possible forks.
*/
private ArrayList<HashSet<Road>> checkRoadsSwitch(Config.Faction faction,int numberOfSwitches,List<Road> roadsList,Point position) {
ArrayList<HashSet<Road>> possibleRoads = new ArrayList<>();
for (int i = 0;i<numberOfSwitches;i++) {
HashSet<Road> list = new HashSet<>();
list.add(roadsList.get(i));
Point nextPosition = getNextPoint(roadsList.get(i),position);
list = countRoad(faction, nextPosition, list, false);
possibleRoads.add(list);
}
return possibleRoads;
}
}

View File

@ -30,8 +30,8 @@ public class SiedlerGame {
*
* @param winPoints the number of points required to win the game
* @param numberOfPlayers the number of players
* @throws IllegalArgumentException if winPoints is lower than
* three or players is not between two and four
* @throws IllegalArgumentException if winPoints is lower than 3
* or players is not between two and four
*/
public SiedlerGame(int winPoints, int numberOfPlayers) {
if (winPoints < 3 || numberOfPlayers < Config.MIN_NUMBER_OF_PLAYERS || numberOfPlayers > 4) {