diff --git a/1ano/2semestre/poo/src/aula07/ex3/Ball.java b/1ano/2semestre/poo/src/aula07/ex3/Ball.java new file mode 100644 index 0000000..c6b1c51 --- /dev/null +++ b/1ano/2semestre/poo/src/aula07/ex3/Ball.java @@ -0,0 +1,22 @@ +package aula07.ex3; + +public class Ball extends MovableObject { + private String color; + + public Ball(double initialX, double initialY, String color) { + super(initialX, initialY); + setColor(color); + } + + public Ball(String color) { + this(0, 0, color); + } + + public String getColor() { + return this.color; + } + + public void setColor(String color) { + this.color = color; + } +} diff --git a/1ano/2semestre/poo/src/aula07/ex3/Game.java b/1ano/2semestre/poo/src/aula07/ex3/Game.java new file mode 100644 index 0000000..0858ca8 --- /dev/null +++ b/1ano/2semestre/poo/src/aula07/ex3/Game.java @@ -0,0 +1,80 @@ +package aula07.ex3; + +public class Game { + private final Team team1; + private final Team team2; + private int team1Goals; + private int team2Goals; + private final Ball ball; + private final double gameDuration; + private double timeElapsed; + + public Game(Team team1, Team team2, Ball ball, double gameDuration) { + this.team1 = team1; + this.team2 = team2; + this.ball = ball; + this.gameDuration = gameDuration * 60; + this.timeElapsed = 0; + } + + public double getGameDuration() { + return this.gameDuration; + } + + public double getTimeElapsed() { + return this.timeElapsed; + } + + public Team getTeam1() { + return this.team1; + } + + public Team getTeam2() { + return this.team2; + } + + public void start() { + new Thread(() -> { + while (this.timeElapsed < this.gameDuration) { + this.timeElapsed += 0.1; + if (this.timeElapsed % 60 == 0) + System.out.printf("Tempo: %d minutos", (int) this.timeElapsed / 60); + try { + Thread.sleep(100); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + }).start(); + } + + public void moveBall(double newX, double newY) { + this.ball.move(newX, newY); + } + + public void moveRobot(int robotId, double newX, double newY) { + for (Robot r : this.team1.getRobots()) + if (r.getId() == robotId) + r.move(newX, newY); + for (Robot r : this.team2.getRobots()) + if (r.getId() == robotId) + r.move(newX, newY); + } + + public void addGoal(Team team, int scorerId) { + if (team == this.team1) { + this.team1Goals++; + this.team1.increaseGoalsScored(scorerId); + this.team2.increaseGoalsTaken(); + } else { + this.team2Goals++; + this.team2.increaseGoalsScored(scorerId); + this.team1.increaseGoalsTaken(); + } + } + + @Override + public String toString() { + return this.team1.getName() + " vs " + this.team2.getName() + ": " + this.team1Goals + "-" + this.team2Goals + "\nBola: " + this.ball.getColor(); + } +} diff --git a/1ano/2semestre/poo/src/aula07/ex3/Main.java b/1ano/2semestre/poo/src/aula07/ex3/Main.java new file mode 100644 index 0000000..2e21af9 --- /dev/null +++ b/1ano/2semestre/poo/src/aula07/ex3/Main.java @@ -0,0 +1,187 @@ +package aula07.ex3; + +import java.util.Scanner; + +public class Main { + public static final Scanner sin = new Scanner(System.in); + public static Team[] teams; + public static Game[] games; + + + public static void main(String[] args) { + while (true) { + int option = menu(); + switch (option) { + case 0 -> { + sin.close(); + System.exit(0); + } + case 1 -> createTeam(); + case 2 -> listTeams(); + case 3 -> listRobots(); + case 4 -> createGame(); + case 5 -> listGames(); + default -> System.out.println("Opção inválida!"); + } + } + } + + private static void listGames() { + for (Game g : games) + System.out.println(g); + } + + private static void createGame() { + if (teams == null || teams.length < 2) { + System.out.println("Não existem equipas suficientes para criar um jogo!"); + return; + } + System.out.println("Equipas:"); + for (int i = 0; i < teams.length; i++) + System.out.println((i+1) + " - " + teams[i].getName()); + System.out.print("Escolha a equipa 1: "); + int team1Id = Integer.parseInt(sin.nextLine()); + System.out.print("Escolha a equipa 2: "); + int team2Id = Integer.parseInt(sin.nextLine()); + Team team1 = teams[team1Id-1]; + Team team2 = teams[team2Id-1]; + System.out.println("Bola para o jogo:"); + System.out.print("Cor da bola: "); + String color = sin.nextLine(); + System.out.print("X inicial: "); + String xString = sin.nextLine(); + double ballX = Double.parseDouble(xString.equals("") ? "0" : xString); + System.out.print("Y inicial: "); + String yString = sin.nextLine(); + double ballY = Double.parseDouble(yString.equals("") ? "0" : yString); + Ball ball = new Ball(ballX, ballY, color); + System.out.println("Duração do jogo (minutos): "); + String durationString = sin.nextLine(); + double duration = Double.parseDouble(durationString.equals("") ? "90" : durationString); + Game game = new Game(team1, team2, ball, duration); + if (games == null) + games = new Game[] { game }; + else { + Game[] newGames = new Game[games.length+1]; + System.arraycopy(games, 0, newGames, 0, games.length); + newGames[games.length] = game; + games = newGames; + } + game.start(); + new Thread(() -> { + while (game.getTimeElapsed() < game.getGameDuration()) { + System.out.println("1 - Mover bola"); + System.out.println("2 - Mover robot"); + System.out.println("3 - Adicionar golo"); + System.out.print("Opção: "); + int option = Integer.parseInt(sin.nextLine()); + swit : switch (option) { + case 1 -> { + System.out.print("Novo X: "); + double x = Double.parseDouble(sin.nextLine()); + System.out.print("Novo Y: "); + double y = Double.parseDouble(sin.nextLine()); + ball.move(x, y); + } + case 2 -> { + System.out.println("Robots:"); + for (Robot r : game.getTeam1().getRobots()) + System.out.println(r); + for (Robot r : game.getTeam2().getRobots()) + System.out.println(r); + System.out.print("Escolha o ID do robot: "); + int robotId = Integer.parseInt(sin.nextLine()); + System.out.print("Novo X: "); + double x = Double.parseDouble(sin.nextLine()); + System.out.print("Novo Y: "); + double y = Double.parseDouble(sin.nextLine()); + game.moveRobot(robotId, x, y); + } + case 3 -> { + System.out.println("Robots:"); + System.out.println(game.getTeam1()); + System.out.println(game.getTeam2()); + + System.out.print("Escolha o ID do robot que marcou: "); + int robotId = Integer.parseInt(sin.nextLine()); + for (Robot r : game.getTeam1().getRobots()) + if (r.getId() == robotId) { + game.addGoal(game.getTeam1(), robotId); + break swit; + } + for (Robot r : game.getTeam2().getRobots()) + if (r.getId() == robotId) { + game.addGoal(game.getTeam2(), robotId); + break swit; + } + } + default -> System.out.println("Opção inválida!"); + } + } + }); + } + + private static void listRobots() { + if (teams == null || teams.length == 0) { + System.out.println("Não existem equipas!"); + return; + } + for (Team t : teams) { + System.out.println("Equipa " + t.getName()); + for (Robot r : t.getRobots()) + System.out.println(r); + } + } + + private static void listTeams() { + if (teams == null || teams.length == 0) { + System.out.println("Não existem equipas!"); + return; + } + for (Team t : teams) + System.out.println(t); + } + + private static void createTeam() { + System.out.print("Nome da equipa: "); + String name = sin.nextLine(); + System.out.print("Treinador: "); + String coach = sin.nextLine(); + System.out.print("Número de robots: "); + int nRobots = Integer.parseInt(sin.nextLine()); + Robot[] robots = new Robot[nRobots]; + for (int i = 0; i < nRobots; i++) { + System.out.println("Robot " + (i+1)); + System.out.print("\n1 - GoalKeeper\n2 - Defender\n3 - Midfielder\n4 - Striker\nPosição: "); + PlayerPosition position = PlayerPosition.getPositionById(Integer.parseInt(sin.nextLine())); + System.out.print("X inicial: "); + String xString = sin.nextLine(); + double x = Double.parseDouble(xString.equals("") ? "0" : xString); + System.out.print("Y inicial: "); + String yString = sin.nextLine(); + double y = Double.parseDouble(yString.equals("") ? "0" : yString); + robots[i] = new Robot(x, y, position); + } + Team team = new Team(name, coach, robots); + if (teams == null) + teams = new Team[] {team}; + else { + Team[] newTeams = new Team[teams.length+1]; + System.arraycopy(teams, 0, newTeams, 0, teams.length); + newTeams[teams.length] = team; + teams = newTeams; + } + } + + private static int menu() { + System.out.println("1. Criar equipa"); + System.out.println("2. Listar equipas"); + System.out.println("3. Listar robots"); + System.out.println("4. Criar jogo"); + System.out.println("5. Listar jogos"); + System.out.println("0. Sair"); + System.out.print("> "); + + return Integer.parseInt(sin.nextLine()); + } +} diff --git a/1ano/2semestre/poo/src/aula07/ex3/MovableObject.java b/1ano/2semestre/poo/src/aula07/ex3/MovableObject.java new file mode 100644 index 0000000..5ca1e86 --- /dev/null +++ b/1ano/2semestre/poo/src/aula07/ex3/MovableObject.java @@ -0,0 +1,31 @@ +package aula07.ex3; + +public class MovableObject { + protected double x; + protected double y; + protected double distanceTravelled; + + protected MovableObject(double initialX, double initialY) { + this.x = initialX; + this.y = initialY; + this.distanceTravelled = 0; + } + + protected MovableObject() { + this(0, 0); + } + + protected void move(double newX, double newY) { + increaseDistanceTravelled(calculateDistanceTravelled(newX, newY)); + this.x = newX; + this.y = newY; + } + + protected void increaseDistanceTravelled(double distance) { + this.distanceTravelled += distance; + } + + private double calculateDistanceTravelled(double newX, double newY) { + return Math.sqrt(Math.pow((this.x - newX), 2) + Math.pow(this.y - newY, 2)); + } +} diff --git a/1ano/2semestre/poo/src/aula07/ex3/PlayerPosition.java b/1ano/2semestre/poo/src/aula07/ex3/PlayerPosition.java new file mode 100644 index 0000000..5db3e8f --- /dev/null +++ b/1ano/2semestre/poo/src/aula07/ex3/PlayerPosition.java @@ -0,0 +1,27 @@ +package aula07.ex3; + +public enum PlayerPosition { + GoalKeeper, + Striker, + Defender, + MidFielder; + + public static PlayerPosition getPositionById(int id) { + return switch (id) { + case 1 -> GoalKeeper; + case 2 -> Striker; + case 3 -> Defender; + case 4 -> MidFielder; + default -> null; + }; + } + + public String toString() { + return switch (this) { + case GoalKeeper -> "GoalKeeper"; + case Striker -> "Striker"; + case Defender -> "Defender"; + case MidFielder -> "MidFielder"; + }; + } +} diff --git a/1ano/2semestre/poo/src/aula07/ex3/Robot.java b/1ano/2semestre/poo/src/aula07/ex3/Robot.java new file mode 100644 index 0000000..d866d23 --- /dev/null +++ b/1ano/2semestre/poo/src/aula07/ex3/Robot.java @@ -0,0 +1,42 @@ +package aula07.ex3; + +public class Robot extends MovableObject { + public static int currentID = 0; + private final int id; + private PlayerPosition playerPosition; + private int goalsScored = 0; + + public Robot(double initialX, double initialY, PlayerPosition playerPosition) { + super(initialX, initialY); + this.id = ++Robot.currentID; + setPlayerPosition(playerPosition); + } + + public Robot(PlayerPosition playerPosition) { + this(0, 0, playerPosition); + } + + public int getId() { + return this.id; + } + + public PlayerPosition getPlayerPosition() { + return this.playerPosition; + } + public void setPlayerPosition(PlayerPosition playerPosition) { + this.playerPosition = playerPosition; + } + + public int getGoalsScored() { + return this.goalsScored; + } + public void increaseGoalsScored() { + this.goalsScored++; + } + + @Override + public String toString() { + return String.format("Robot %d (%s) at (%.2f, %.2f) with %.2f travelled distance and %d goals scored", + this.id, this.playerPosition, this.x, this.y, this.distanceTravelled, this.goalsScored); + } +} diff --git a/1ano/2semestre/poo/src/aula07/ex3/TODO.md b/1ano/2semestre/poo/src/aula07/ex3/TODO.md new file mode 100644 index 0000000..797713c --- /dev/null +++ b/1ano/2semestre/poo/src/aula07/ex3/TODO.md @@ -0,0 +1,4 @@ +# TODO's + +- [ ] Fix the timer (not working asynchronically) +- [ ] Properly test the program to find out what actually needs to be done :skull: \ No newline at end of file diff --git a/1ano/2semestre/poo/src/aula07/ex3/Team.java b/1ano/2semestre/poo/src/aula07/ex3/Team.java new file mode 100644 index 0000000..4430689 --- /dev/null +++ b/1ano/2semestre/poo/src/aula07/ex3/Team.java @@ -0,0 +1,85 @@ +package aula07.ex3; + +public class Team { + private final String name; + private String coach; + private int goalsScored = 0; + private int goalsTaken = 0; + private Robot[] robots; + + public Team(String name, String coach, Robot[] robots) { + this.name = name; + this.coach = coach; + this.setRobots(robots); + } + + public String getName() { + return this.name; + } + + public String getCoach() { + return this.coach; + } + + public void setCoach(String coach) { + this.coach = coach; + } + + public int getGoalsScored() { + return this.goalsScored; + } + + public void increaseGoalsScored(int scorerId) { + for (Robot r : this.robots) + if (r.getId() == scorerId) + r.increaseGoalsScored(); + this.goalsScored++; + } + + public int getGoalsTaken() { + return this.goalsTaken; + } + + public void increaseGoalsTaken() { + this.goalsTaken++; + } + + public Robot[] getRobots() { + return this.robots; + } + + public void setRobots(Robot[] robots) { + this.robots = robots; + } + + public void addRobot(Robot robot) { + if (this.robots == null) + this.setRobots(new Robot[] {robot}); + else { + Robot[] newRobots = new Robot[this.robots.length+1]; + System.arraycopy(this.robots, 0, newRobots, 0, this.robots.length); + newRobots[newRobots.length-1] = robot; + this.setRobots(newRobots); + } + } + + public void removeRobot(Robot robot) { + Robot[] newRobots = new Robot[this.robots.length-1]; + int index = 0; + for (Robot r : this.robots) + if (r.getId() != robot.getId()) { + newRobots[index] = r; + index++; + } + this.setRobots(newRobots); + } + + @Override + public String toString() { + StringBuilder robotsString = new StringBuilder(); + for (Robot r : this.robots) + robotsString.append("\n\t\t").append(r.toString()); + return String.format("Team %s\n\tCoach: %s\n\tGoals Scored: %d\n\tGoals Taken: %d\n\tRobots:%s", + this.name, this.coach, this.goalsScored, this.goalsTaken, robotsString); + } +}