package nl.joshuaslik.tudelft.UFMGame.backend; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedHashMap; import nl.joshuaslik.tudelft.UFMGame.backend.exceptions.UnableToBuyException; import nl.joshuaslik.tudelft.UFMGame.backend.formation.Form343; import nl.joshuaslik.tudelft.UFMGame.backend.formation.Form4321; import nl.joshuaslik.tudelft.UFMGame.backend.formation.Form433; import nl.joshuaslik.tudelft.UFMGame.backend.formation.Form442; import nl.joshuaslik.tudelft.UFMGame.backend.formation.Form532; /** * @author <a href="http://www.joshuaslik.nl/" target="_blank">Joshua Slik</a> * @author Naomi de Ridder * @author <a href="http://www.bryangoulds.nl/" target="_blank">Bryan van * Wijk</a> * */ public class Game { private ArrayList<User> users = new ArrayList<User>(); private Competition competition; private LinkedHashMap<String, Player> players; private ArrayList<Player> nonContractedPlayers = new ArrayList<Player>(); private static int difficulty; /** * */ private int currentround = 1; /** * Constructor * * @param users * the users playing in this game */ public Game(ArrayList<User> users) { this.users = users; this.players = Save.loadPlayers(); competition = new Competition(this); } /** * Set a player non contracted * * @param id * player to set non contracted */ public void setNonContracted(String id) { getUser().addMoney(getUser().getTeam().getPlayer(id).getPrice()); nonContractedPlayers.add(getUser().getTeam().getPlayer(id)); getUser().getTeam().removePlayer(id); } /** * Sell a player from user * * @param id * player you want to sell * @param user * from who the player belongs before selling */ public void sellPlayer(String id, User user) { user.addMoney(user.getTeam().getPlayer(id).getPrice()); user.getTeam().removePlayer(id); } /** * Buy a non contracted player if you have enough money * * @param id * the non contracted player you want to buy * @param user * who wants to buy the player */ public void buyNonContractedPlayer(String id, User user) { if (users.get(users.indexOf(user)).getBudget() >= players.get(id).getPrice()) { nonContractedPlayers.remove(nonContractedPlayers.indexOf(players.get(id))); users.get(users.indexOf(user)).subMoney(players.get(id).getPrice()); users.get(users.indexOf(user)).getTeam().addBenchPlayer(players.get(id)); } else { throw new UnableToBuyException("Not enough money"); } } /** * if the amount of money a user has is enough set this player at the * benchplayers of this user * * @param id * player to buy * @param user * who wants to buy this player */ public void buyPlayer(String id, User user) { if (users.get(users.indexOf(user)).getBudget() >= players.get(id).getPrice()) { users.get(users.indexOf(user)).subMoney(players.get(id).getPrice()); users.get(users.indexOf(user)).getTeam().addBenchPlayer(players.get(id)); } else { throw new UnableToBuyException("Not enough money"); } } /** * Add a user if the users arraylist not contains this user already * * @param user * the user to add */ public void addUser(User user) { if ((!users.contains(user))) { users.add(user); } } /** * Get the Human user * * @return the Human player */ public User getUser() { for (int i = 0; i < users.size(); i++) { if (users.get(i) instanceof Human) { return users.get(i); } } return null; } /** * Get a User by username * * @param userName * the name of the User to get * @return the user matching the userName specified */ public User getUser(String userName) { for (int i = 0; i < users.size(); i++) if (users.get(i).getUserName().equals(userName)) return users.get(i); return null; } /** * Get a User by Team * * @param team * Team of the user to get * @return the user who has the Team specified */ public User getUser(Team team) { for (int i = 0; i < users.size(); i++) if (users.get(i).getTeam().equals(team)) { return users.get(i); } return null; } /** * * @return arraylist with all teams in this game */ public ArrayList<Team> getTeams() { ArrayList<Team> result = new ArrayList<Team>(); for (int i = 0; i < users.size(); i++) { result.add(users.get(i).getTeam()); } return result; } /** * Gets the team * * @param teamid * is the id of the team * @return Team object where id is teamid */ public Team getTeam(String teamid) { for (int i = 0; i < users.size(); i++) { if (users.get(i).getTeam().getid().equals(teamid)) { return users.get(i).getTeam(); } } return null; } /** * get the players * * @param id * is the id of the players * @return returns the player with id */ public Player getPlayer(String id) { return players.get(id); } /** * * @param name * of the player * @return player with that name */ public Player getPlayerByName(String name) { for (String key : players.keySet()) { if (players.get(key).getFullName().equals(name)) { return players.get(key); } } return null; } /** * * @return gives the users in this game back */ public ArrayList<User> getUsers() { return users; } /** * @return competition of this game */ public Competition getCompetition() { return competition; } /** * Starts a new competition for this game */ public void newCompetition() { competition = new Competition(this); currentround = 1; for (int i = 0; i < users.size(); i++) { users.get(i).getTeam().setPoints(0); users.get(i).getTeam().setTotalLosses(0); users.get(i).getTeam().setTotalWins(0); users.get(i).getTeam().setTotalDraws(0); users.get(i).getTeam().setTotalGoals(0); users.get(i).getTeam().setGoalsAgainst(0); } } /** * determine the current ranking of the teams in this game * * @return linkedHashmap with ranking and team name */ public LinkedHashMap<Integer, String> computeStandings() { competition.ComputeStandings(); LinkedHashMap<Integer, String> standings = new LinkedHashMap<Integer, String>(); for (int i = 0; i < users.size(); i++) { standings.put(users.get(i).getTeam().getRanking(), users.get(i).getTeam().getTeamName()); } return standings; } /** * returns 1 playround * * @param round * is the round number of that playround * @return the playround of a competition */ public Playround getPlayround(int round) { return competition.getPlayround(round); } /** * returns all the playrounds of the current competition * * @return the playround of a competition */ public ArrayList<Playround> getPlayrounds() { return competition.getPlayrounds(); } /** * determine the result of the currentround and returns the result of the * currentround * * @return the result of a playround */ public LinkedHashMap<String, String> resultplayround() { LinkedHashMap<String, String> result = null; if (currentround <= ((users.size() * (users.size() - 1)) / (users.size() / 2))) { ArrayList<Match> matches = getPlayround(currentround).getMatches(); getPlayround(currentround).determineResultPlayround(difficulty); result = new LinkedHashMap<String, String>(); for (int i = 0; i < matches.size(); i++) { Match match = matches.get(i); result.put(match.getHomeTeam().getTeamName() + " - " + match.getAwayTeam().getTeamName(), match.getHomegoals() + " - " + match.getAwaygoals()); } currentround = currentround + 1; } return result; } /** * determine the result of the specified round and returns the result of the * * @param round * is the round to be played * @return the result of the playround * */ public LinkedHashMap<String, String> resultplayround(int round) { ArrayList<Match> matches = getPlayround(round).getMatches(); this.getPlayround(round).determineResultPlayround(difficulty); LinkedHashMap<String, String> result = new LinkedHashMap<String, String>(); for (int i = 0; i < matches.size(); i++) { Match match = matches.get(i); result.put(match.getHomeTeam().getTeamName() + " - " + match.getAwayTeam().getTeamName(), match.getHomegoals() + " - " + match.getAwaygoals()); } return result; } /** * Getter for currentround * * @return the current round of this game */ public int getCurrentRound() { return currentround; } /** * Sets the currentround * * @param round * that the currentround must be */ public void setCurrentRound(int round) { currentround = round; } /** * Method to Change the formation of all the PC teams randomly */ public void changeFormationRound() { for (int i = 0; i < users.size(); i++) { if (users.get(i) instanceof PC) { Team team = users.get(i).getTeam(); ArrayList<Player> teamplayers = team.getAllPlayers(); Collections.shuffle(teamplayers); ArrayList<Player> goalkeepers = new ArrayList<Player>(); ArrayList<Player> fieldplayers = new ArrayList<Player>(); for (int j = 0; j < teamplayers.size(); j++) { if (teamplayers.get(j) instanceof Fieldplayer) { fieldplayers.add(teamplayers.get(j)); } else if (teamplayers.get(j) instanceof Goalkeeper) { goalkeepers.add(teamplayers.get(j)); } } int formTypeChance = (int) (Math.random() * 5); if (formTypeChance == 0) { Form433 form = new Form433(team); team.changeFormationType(form); team.getFormation().setGoalkeeper((Goalkeeper) goalkeepers.get(0)); team.getFormation().setCB1((Fieldplayer) fieldplayers.get(0)); team.getFormation().setCB2((Fieldplayer) fieldplayers.get(1)); team.getFormation().setRB((Fieldplayer) fieldplayers.get(2)); team.getFormation().setLB((Fieldplayer) fieldplayers.get(3)); team.getFormation().setLM((Fieldplayer) fieldplayers.get(4)); team.getFormation().setCM((Fieldplayer) fieldplayers.get(5)); team.getFormation().setRM((Fieldplayer) fieldplayers.get(6)); team.getFormation().setRW((Fieldplayer) fieldplayers.get(7)); team.getFormation().setLW((Fieldplayer) fieldplayers.get(8)); team.getFormation().setST((Fieldplayer) fieldplayers.get(9)); } else if (formTypeChance == 1) { Form343 form = new Form343(team); team.changeFormationType(form); team.getFormation().setGoalkeeper((Goalkeeper) goalkeepers.get(0)); team.getFormation().setCB((Fieldplayer) fieldplayers.get(0)); team.getFormation().setCM1((Fieldplayer) fieldplayers.get(1)); team.getFormation().setRB((Fieldplayer) fieldplayers.get(2)); team.getFormation().setLB((Fieldplayer) fieldplayers.get(3)); team.getFormation().setLM((Fieldplayer) fieldplayers.get(4)); team.getFormation().setCM2((Fieldplayer) fieldplayers.get(5)); team.getFormation().setRM((Fieldplayer) fieldplayers.get(6)); team.getFormation().setRW((Fieldplayer) fieldplayers.get(7)); team.getFormation().setLW((Fieldplayer) fieldplayers.get(8)); team.getFormation().setST((Fieldplayer) fieldplayers.get(9)); } else if (formTypeChance == 2) { Form4321 form = new Form4321(team); team.changeFormationType(form); team.getFormation().setGoalkeeper((Goalkeeper) goalkeepers.get(0)); team.getFormation().setCB1((Fieldplayer) fieldplayers.get(0)); team.getFormation().setCB2((Fieldplayer) fieldplayers.get(1)); team.getFormation().setRB((Fieldplayer) fieldplayers.get(2)); team.getFormation().setLB((Fieldplayer) fieldplayers.get(3)); team.getFormation().setLM((Fieldplayer) fieldplayers.get(4)); team.getFormation().setCM((Fieldplayer) fieldplayers.get(5)); team.getFormation().setRM((Fieldplayer) fieldplayers.get(6)); team.getFormation().setORM((Fieldplayer) fieldplayers.get(7)); team.getFormation().setOLM((Fieldplayer) fieldplayers.get(8)); team.getFormation().setST((Fieldplayer) fieldplayers.get(9)); } else if (formTypeChance == 3) { Form442 form = new Form442(team); team.changeFormationType(form); team.getFormation().setGoalkeeper((Goalkeeper) goalkeepers.get(0)); team.getFormation().setCB1((Fieldplayer) fieldplayers.get(0)); team.getFormation().setCB2((Fieldplayer) fieldplayers.get(1)); team.getFormation().setRB((Fieldplayer) fieldplayers.get(2)); team.getFormation().setLB((Fieldplayer) fieldplayers.get(3)); team.getFormation().setLM((Fieldplayer) fieldplayers.get(4)); team.getFormation().setCM1((Fieldplayer) fieldplayers.get(5)); team.getFormation().setRM((Fieldplayer) fieldplayers.get(6)); team.getFormation().setRW((Fieldplayer) fieldplayers.get(7)); team.getFormation().setLW((Fieldplayer) fieldplayers.get(8)); team.getFormation().setCM2((Fieldplayer) fieldplayers.get(9)); } else if (formTypeChance == 4) { Form532 form = new Form532(team); team.changeFormationType(form); team.getFormation().setGoalkeeper((Goalkeeper) goalkeepers.get(0)); team.getFormation().setCB1((Fieldplayer) fieldplayers.get(0)); team.getFormation().setCB2((Fieldplayer) fieldplayers.get(1)); team.getFormation().setRB((Fieldplayer) fieldplayers.get(2)); team.getFormation().setLB((Fieldplayer) fieldplayers.get(3)); team.getFormation().setLM((Fieldplayer) fieldplayers.get(4)); team.getFormation().setCM((Fieldplayer) fieldplayers.get(5)); team.getFormation().setRM((Fieldplayer) fieldplayers.get(6)); team.getFormation().setRW((Fieldplayer) fieldplayers.get(7)); team.getFormation().setLW((Fieldplayer) fieldplayers.get(8)); team.getFormation().setCB3((Fieldplayer) fieldplayers.get(9)); } team.setTeamCaptain(team.getActivePlayers().get(0)); } } } /** * Set the difficulty of the game * * @param diff * int of the difficulty */ static public void setDifficulty(int diff) { difficulty = diff; } /** * Method to get all the non contracted players in this game * * @return ArrayList with all the non contracted players */ public ArrayList<Player> getNonContractedPlayers() { return nonContractedPlayers; } /** * Method to set the non Contracted players list * * @param nonContractedPlayers * ArrayList with all the non Contracted Players */ public void setNonContractedPlayers(ArrayList<Player> nonContractedPlayers) { this.nonContractedPlayers = nonContractedPlayers; } /** * Load all the players that are not in a team, but are in the files */ public void loadAllNonContractedPlayers() { ArrayList<Player> allnoncontractedplayers = Save.loadplayersArrayList(); for (int i = 0; i < getUsers().size(); i++) { for (int j = 0; j < getUsers().get(i).getTeam().getAllPlayers().size(); j++) { if (allnoncontractedplayers.contains(getUsers().get(i).getTeam().getAllPlayers().get(j))) { allnoncontractedplayers.remove(getUsers().get(i).getTeam().getAllPlayers().get(j)); } } } nonContractedPlayers.addAll(allnoncontractedplayers); } }