From 1f1276f2f4ca6795028a796a8d789f95c46aa500 Mon Sep 17 00:00:00 2001 From: aminlotfi Date: Thu, 17 Dec 2020 00:59:19 +0330 Subject: [PATCH 01/18] add test package and resources package. --- src/main/{java/resource => resources}/Nothing.txt | 0 src/test/java/PlayerTest.java | 2 ++ 2 files changed, 2 insertions(+) rename src/main/{java/resource => resources}/Nothing.txt (100%) create mode 100644 src/test/java/PlayerTest.java diff --git a/src/main/java/resource/Nothing.txt b/src/main/resources/Nothing.txt similarity index 100% rename from src/main/java/resource/Nothing.txt rename to src/main/resources/Nothing.txt diff --git a/src/test/java/PlayerTest.java b/src/test/java/PlayerTest.java new file mode 100644 index 0000000..f078900 --- /dev/null +++ b/src/test/java/PlayerTest.java @@ -0,0 +1,2 @@ +public class PlayerTest { +} From b6ecbbf53d08cd611962579d5877506bfe46b901 Mon Sep 17 00:00:00 2001 From: mahdi hadi Date: Thu, 17 Dec 2020 15:30:33 +0330 Subject: [PATCH 02/18] all games commons --- src/main/java/view/game/Game.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/main/java/view/game/Game.java diff --git a/src/main/java/view/game/Game.java b/src/main/java/view/game/Game.java new file mode 100644 index 0000000..593e624 --- /dev/null +++ b/src/main/java/view/game/Game.java @@ -0,0 +1,15 @@ +package view.game; + +public interface Game { + default void join() { + + } + + default void turn() { + + } + + default void update() { + + } +} From ad8785039725350edee8c5d099b355ac464c480c Mon Sep 17 00:00:00 2001 From: mahdi hadi Date: Thu, 17 Dec 2020 15:37:57 +0330 Subject: [PATCH 03/18] changes for battle sea and game menu --- src/main/java/view/game/BattleSeaMenu.java | 11 +++++++++-- src/main/java/view/game/Game.java | 4 ---- src/main/java/view/game/GameMenu.java | 9 ++++++++- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/main/java/view/game/BattleSeaMenu.java b/src/main/java/view/game/BattleSeaMenu.java index 98d5d54..def4085 100644 --- a/src/main/java/view/game/BattleSeaMenu.java +++ b/src/main/java/view/game/BattleSeaMenu.java @@ -2,7 +2,7 @@ import view.Menu; -public class BattleSeaMenu extends Menu { +public class BattleSeaMenu extends Menu implements Game { private static final BattleSeaMenu battleSeaMenu = new BattleSeaMenu(); private BattleSeaMenu() { @@ -14,7 +14,14 @@ public static BattleSeaMenu getBattleSeaMenu() { @Override public void run() { - + while (true) { + switch (scanner.nextLine().trim()) { + case "turn": + turn(); + break; + case "" + } + } } @Override diff --git a/src/main/java/view/game/Game.java b/src/main/java/view/game/Game.java index 593e624..c77ab08 100644 --- a/src/main/java/view/game/Game.java +++ b/src/main/java/view/game/Game.java @@ -1,10 +1,6 @@ package view.game; public interface Game { - default void join() { - - } - default void turn() { } diff --git a/src/main/java/view/game/GameMenu.java b/src/main/java/view/game/GameMenu.java index 4402726..eaf6305 100644 --- a/src/main/java/view/game/GameMenu.java +++ b/src/main/java/view/game/GameMenu.java @@ -36,13 +36,20 @@ private void open() { } } + private void join() { + + } + @Override public void run() { while (true) { - switch (scanner.nextLine()) { + switch (scanner.nextLine().trim()) { case "open": open(); return; + case "join": + join(); + return; case "back": back(); return; From 94a2242df7643fb04a5560bde0919a52ce5a045e Mon Sep 17 00:00:00 2001 From: Sadra Date: Thu, 17 Dec 2020 17:55:38 +0330 Subject: [PATCH 04/18] small fix to DotsAndBoxes --- .../java/model/DotsAndBoxes/DotsAndBoxes.java | 1 + src/main/java/view/game/DotsAndBoxesMenu.java | 105 +++++++++++------- 2 files changed, 63 insertions(+), 43 deletions(-) diff --git a/src/main/java/model/DotsAndBoxes/DotsAndBoxes.java b/src/main/java/model/DotsAndBoxes/DotsAndBoxes.java index 39e1fa1..5ae8114 100644 --- a/src/main/java/model/DotsAndBoxes/DotsAndBoxes.java +++ b/src/main/java/model/DotsAndBoxes/DotsAndBoxes.java @@ -128,6 +128,7 @@ public String makeTable() { StringBuilder stringBuilder = new StringBuilder(); for (Edge edge : edges) { stringBuilder.append("Line ").append(i).append(": ").append(edge.toString()); + i++; } return stringBuilder.toString(); } diff --git a/src/main/java/view/game/DotsAndBoxesMenu.java b/src/main/java/view/game/DotsAndBoxesMenu.java index a5e10d7..10edc05 100644 --- a/src/main/java/view/game/DotsAndBoxesMenu.java +++ b/src/main/java/view/game/DotsAndBoxesMenu.java @@ -1,14 +1,13 @@ package view.game; -import model.DotsAndBoxes.DotsAndBoxes; -import model.Player; +import view.Back; import view.Client; import view.Menu; import java.util.regex.Matcher; import java.util.regex.Pattern; -public class DotsAndBoxesMenu extends Menu { +public class DotsAndBoxesMenu extends Menu implements Back { private static final DotsAndBoxesMenu dotsAndBoxesMenu = new DotsAndBoxesMenu(); private DotsAndBoxesMenu() { @@ -20,10 +19,7 @@ public static DotsAndBoxesMenu getDotsAndBoxesMenu() { @Override public void run() { - - Client.getClient().send("game DotsAndBoxes open " + username); - String gameId = Client.getClient().getResponse(); - + joinGuest(); String command; commandLoop: while (true) { @@ -35,57 +31,80 @@ public void run() { case "show table": case "who is next?": case "show result": - Client.getClient().send("game DotsAndBoxes "+ command + " " + gameId); + Client.getClient().send("game DotsAndBoxes "+ command.replaceAll(" ", "") + " " + gameID); System.out.println(Client.getClient().getResponse()); break; case "back": - System.out.println("Are you sure you want to leave ?" + - "If game is not over it means your forfeit the game. yes/no : " + - "(you can check if game is over with command)"); - while (true) { - String temp; - temp = scanner.nextLine(); - if (temp.equalsIgnoreCase("yes")) { - break commandLoop; - } else if (temp.equalsIgnoreCase("no")) { - break; - } else { - System.out.println("Its a Yes/No question :/ "); - } - } + if (backConfirm()) + break commandLoop; default: if (command.startsWith("draw line between ")) { - - Pattern pattern = Pattern.compile("(draw line between )(\\d+)(,)(\\d+)( and )(\\d+)(,)(\\d+)"); - Matcher matcher = pattern.matcher(command); - - if (matcher.matches()) { - if (Integer.parseInt(matcher.group(2)) < 9 && Integer.parseInt(matcher.group(2)) > 0 && - Integer.parseInt(matcher.group(4)) < 9 && Integer.parseInt(matcher.group(4)) > 0 && - Integer.parseInt(matcher.group(6)) < 9 && Integer.parseInt(matcher.group(6)) > 0 && - Integer.parseInt(matcher.group(8)) < 9 && Integer.parseInt(matcher.group(8)) > 0) { - Client.getClient().send("game DotsAndBoxes occupy " + gameId + " " + matcher.group(2) + " " + matcher.group(4) + " " + matcher.group(6) + " " + matcher.group(8)); - System.out.println(Client.getClient().getResponse()); - } else - System.out.println("coordinates must be inside the table"); - } else { - System.out.println("The command should be in this form:" + - "draw line between x,y and x,y"); - } + drawLine(command); } else { System.out.println("Not a valid command!"); } break; } } - Client.getClient().send("game DotsAndBoxes end"); + Client.getClient().send("game DotsAndBoxes end " + gameID); System.out.println(Client.getClient().getResponse()); - next(GameMenu.getGameMenu()); + back(); + } + + private void joinGuest() { + while (true) { + System.out.println("Enter second player username : "); + String username = scanner.nextLine(); + if (username.equals("back")) { + back(); + return; + } + Client.getClient().send("game DotsAndBoxes join " +gameID + " " + username); + if (Client.getClient().getResponse().equals("joined")) { + System.out.println("Player successfully joined"); + break; + } + else System.out.println("No player found with this username."); + } + } + + private void drawLine(String command) { + Pattern pattern = Pattern.compile("(draw line between )(-?\\d+)(,)(-?\\d+)( and )(-?\\d+)(,)(-?\\d+)"); + Matcher matcher = pattern.matcher(command); + + if (matcher.matches()) { + if (Integer.parseInt(matcher.group(2)) < 9 && Integer.parseInt(matcher.group(2)) > 0 && + Integer.parseInt(matcher.group(4)) < 9 && Integer.parseInt(matcher.group(4)) > 0 && + Integer.parseInt(matcher.group(6)) < 9 && Integer.parseInt(matcher.group(6)) > 0 && + Integer.parseInt(matcher.group(8)) < 9 && Integer.parseInt(matcher.group(8)) > 0) { + Client.getClient().send("game DotsAndBoxes occupy " + gameID + " " + matcher.group(2) + " " + matcher.group(4) + " " + matcher.group(6) + " " + matcher.group(8)); + System.out.println(Client.getClient().getResponse()); + } else + System.out.println("coordinates must be inside the table"); + } else { + System.out.println("The command should be in this form:" + + "draw line between x,y and x,y"); + } + } + + private boolean backConfirm() { + System.out.println("Are you sure you want to leave ?" + + "If game is not over it means your forfeit the game. yes/no : " + + "(you can check if game is over with command)"); + while (true) { + String temp; + temp = scanner.nextLine(); + if (temp.equalsIgnoreCase("yes")) { + return true; + } else if (temp.equalsIgnoreCase("no")) { + return false; + } else { + System.out.println("Its a Yes/No question :/ "); + } + } } @Override public void next(Menu menu) { - menus.pop(); - menu.run(); } } From 08f936b86ccf7b36cc720e6587fc1ec3e592bcf0 Mon Sep 17 00:00:00 2001 From: Sadra Date: Thu, 17 Dec 2020 17:59:58 +0330 Subject: [PATCH 05/18] fix dots and boxes model --- src/main/java/model/DotsAndBoxes/DotsAndBoxes.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/model/DotsAndBoxes/DotsAndBoxes.java b/src/main/java/model/DotsAndBoxes/DotsAndBoxes.java index 5ae8114..dc56470 100644 --- a/src/main/java/model/DotsAndBoxes/DotsAndBoxes.java +++ b/src/main/java/model/DotsAndBoxes/DotsAndBoxes.java @@ -127,7 +127,7 @@ public String makeTable() { int i = 1; StringBuilder stringBuilder = new StringBuilder(); for (Edge edge : edges) { - stringBuilder.append("Line ").append(i).append(": ").append(edge.toString()); + stringBuilder.append("Line ").append(i).append(": ").append(edge.toString()).append('\n'); i++; } return stringBuilder.toString(); From 727aa6516232427bb7da5c131721cdf734e4f37a Mon Sep 17 00:00:00 2001 From: Sadra Date: Thu, 17 Dec 2020 18:52:46 +0330 Subject: [PATCH 06/18] fix battleSea --- src/main/java/model/BattleSea/BattleSea.java | 45 +++++++--- .../java/model/BattleSea/BattleSeaPlayer.java | 9 +- src/main/java/model/BattleSea/Grid.java | 4 +- src/main/java/view/account/LoginMenu.java | 82 +++++++++++-------- 4 files changed, 88 insertions(+), 52 deletions(-) diff --git a/src/main/java/model/BattleSea/BattleSea.java b/src/main/java/model/BattleSea/BattleSea.java index 41fd10c..ee249ca 100644 --- a/src/main/java/model/BattleSea/BattleSea.java +++ b/src/main/java/model/BattleSea/BattleSea.java @@ -1,17 +1,27 @@ package model.BattleSea; +import model.DotsAndBoxes.DotsAndBoxes; +import model.Game; +import model.Player; + +import java.util.ArrayList; +import java.util.HashMap; import java.util.Scanner; -public class BattleSea { +public class BattleSea extends Game { + private static HashMap battleSeas; - public static Scanner scanner = new Scanner(System.in); - static BattleSeaPlayer host = new BattleSeaPlayer(); - static BattleSeaPlayer guest = new BattleSeaPlayer(); - public static void runBattleSea(){ - setupRandomBoard(host); - host.playerGrid.printShips(); - //TODO ????? + public static Scanner scanner = new Scanner(System.in); + BattleSeaPlayer host ; + BattleSeaPlayer guest ; + BattleSeaPlayer turn; + + public BattleSea(Player host) { + super(); + battleSeas.put(getGameID(), this); + this.host = new BattleSeaPlayer(host); + turn = this.host; } private static void setupRandomBoard(BattleSeaPlayer battleSeaPlayer) { @@ -52,20 +62,16 @@ private static void askForGuess(BattleSeaPlayer player, BattleSeaPlayer opponent while (!flag) { if (!opponent.playerGrid.alreadyGuessed(y, x)){ if (opponent.playerGrid.hasShip(y, x)) { - player.oppGrid.markHit(y, x); opponent.playerGrid.markHit(y, x); System.out.println("Bombed successfully!!!"); Ship oppShip = opponent.ships[convertLetterToInt(opponent.playerGrid.get(y, x).getShipName())]; - Ship playerShip = player.ships[convertLetterToInt(player.oppGrid.get(y, x).getShipName())]; if (isShipDestroyCompletely(opponent, oppShip)) { - changeDestroyedShipSign(player, playerShip); changeDestroyedShipSign(opponent, oppShip); } } else { - player.oppGrid.markMiss(y, x); opponent.playerGrid.markMiss(y, x); System.out.println("Bombed unsuccessfully!"); flag = true; @@ -260,4 +266,19 @@ private static int convertLetterToInt(String letter) { } return toReturn; } + + @Override + public void turn() { + + } + + @Override + public boolean join(Player guest) { + return false; + } + + @Override + public Player judge() { + return null; + } } diff --git a/src/main/java/model/BattleSea/BattleSeaPlayer.java b/src/main/java/model/BattleSea/BattleSeaPlayer.java index cb1f226..6f0d263 100644 --- a/src/main/java/model/BattleSea/BattleSeaPlayer.java +++ b/src/main/java/model/BattleSea/BattleSeaPlayer.java @@ -1,5 +1,7 @@ package model.BattleSea; +import model.Player; + public class BattleSeaPlayer { private static final int[] shipsLength = {2, 2, 3, 4, 4, 5}; private static final int[] shipsWidth = {1, 1, 1, 1, 1, 2}; @@ -8,9 +10,10 @@ public class BattleSeaPlayer { public Ship[] ships; public Grid playerGrid; - public Grid oppGrid; + private Player player; + - public BattleSeaPlayer() { + public BattleSeaPlayer(Player player) { if (numOfShips != 6) throw new IllegalArgumentException("ERROR! Num of ships must be 6."); ships = new Ship[numOfShips]; @@ -19,7 +22,7 @@ public BattleSeaPlayer() { ships[i] = tempShip; } playerGrid = new Grid(); - oppGrid = new Grid(); + this.player = player; } public int numOfShipsLeft() { diff --git a/src/main/java/model/BattleSea/Grid.java b/src/main/java/model/BattleSea/Grid.java index 8a0610a..b6af494 100644 --- a/src/main/java/model/BattleSea/Grid.java +++ b/src/main/java/model/BattleSea/Grid.java @@ -14,6 +14,8 @@ public Grid() { grid = new Location[NUM_ROWS][NUM_COLS]; + points = 25; + for (int row = 0; row < grid.length; row++) { for (int col = 0; col < grid[row].length; col++) { Location tempLoc = new Location(); @@ -24,7 +26,7 @@ public Grid() { public void markHit(int row, int col) { grid[row][col].markHit(); - points++; + points--; } public void markMiss(int row, int col) { diff --git a/src/main/java/view/account/LoginMenu.java b/src/main/java/view/account/LoginMenu.java index 2377a35..843f9dc 100644 --- a/src/main/java/view/account/LoginMenu.java +++ b/src/main/java/view/account/LoginMenu.java @@ -19,45 +19,43 @@ public static LoginMenu getLoginMenu() { @Override public void run() { String[] commands; + label: while (true) { String command = scanner.nextLine(); commands = command.split("\\s"); - if (commands[0].equalsIgnoreCase("register")) { - if (commands.length == 3) { - next(RegisterMenu.getRegisterMenu()); - break; - } else { - System.out.println("you should enter your username and password after the keyword < register >"); - } - } else if (commands[0].equalsIgnoreCase("login")) { - if (commands.length == 2) { - login(commands[1]); - if (Client.getClient().getResponse().equals("Admin logged in")) { - next(AdminMenu.getAdminMenu()); - break; - } else if (Client.getClient().getResponse().equals("Player logged in")) { - next(PlayerMenu.getPlayerMenu()); - break; - } - } else { - System.out.println("you should enter your username after the keyword < login >"); - } - } else if (commands[0].equalsIgnoreCase("delete")) { - if (commands.length == 2) { - delete(commands[1]); - if (Client.getClient().getResponse().equals("Deleted")) { + switch (commands[0]) { + case "register": + if (commands.length == 3) { next(RegisterMenu.getRegisterMenu()); - break; + break label; + } else { + System.out.println("you should enter your username and password after the keyword < register >"); + } + break; + case "login": + if (login(commands)) + break label; + break; + case "delete": + if (commands.length == 2) { + delete(commands[1]); + if (Client.getClient().getResponse().equals("Deleted")) { + next(RegisterMenu.getRegisterMenu()); + break label; + } + } else { + System.out.println("you should enter your username after the keyword < delete >"); } - } else { - System.out.println("you should enter your username after the keyword < delete >"); - } - } else if (command.equalsIgnoreCase("back")) { - back(); - } else { - System.out.println("Wrong command"); + break; + case "back": + back(); + break; + default: + System.out.println("Wrong command"); + break; } } + } private void delete(String username) { @@ -66,10 +64,22 @@ private void delete(String username) { Client.getClient().send("user delete " + username + " " + password); } - private void login(String username) { - System.out.println("Enter your password : "); - String password = scanner.nextLine(); - Client.getClient().send("user login " + username + " " + password); + private boolean login(String[] commands) { + if (commands.length == 2) { + System.out.println("Enter your password : "); + String password = scanner.nextLine(); + Client.getClient().send("user login " + commands[1] + " " + password); + if (Client.getClient().getResponse().equals("Admin logged in")) { + next(AdminMenu.getAdminMenu()); + return true; + } else if (Client.getClient().getResponse().equals("Player logged in")) { + next(PlayerMenu.getPlayerMenu()); + return true; + } else return false; + } else { + System.out.println("you should enter your username after the keyword < login >"); + return false; + } } @Override From 65f01c077df943001be1c47ef5ebb11eb3f11917 Mon Sep 17 00:00:00 2001 From: Sadra Date: Thu, 17 Dec 2020 18:56:36 +0330 Subject: [PATCH 07/18] fix battleSea --- src/main/java/model/BattleSea/BattleSea.java | 22 ++++++++------------ 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/src/main/java/model/BattleSea/BattleSea.java b/src/main/java/model/BattleSea/BattleSea.java index ee249ca..9bc4182 100644 --- a/src/main/java/model/BattleSea/BattleSea.java +++ b/src/main/java/model/BattleSea/BattleSea.java @@ -12,7 +12,6 @@ public class BattleSea extends Game { private static HashMap battleSeas; - public static Scanner scanner = new Scanner(System.in); BattleSeaPlayer host ; BattleSeaPlayer guest ; BattleSeaPlayer turn; @@ -24,7 +23,7 @@ public BattleSea(Player host) { turn = this.host; } - private static void setupRandomBoard(BattleSeaPlayer battleSeaPlayer) { + private void setupRandomBoard(BattleSeaPlayer battleSeaPlayer) { System.out.println(); int counterOfShips = 0; @@ -51,7 +50,7 @@ private static void setupRandomBoard(BattleSeaPlayer battleSeaPlayer) { } } - private static void askForGuess(BattleSeaPlayer player, BattleSeaPlayer opponent, int x, int y) { + private void askForGuess(BattleSeaPlayer player, BattleSeaPlayer opponent, int x, int y) { boolean flag = false; // row == y , col == x @@ -83,7 +82,7 @@ private static void askForGuess(BattleSeaPlayer player, BattleSeaPlayer opponent } - private static boolean isShipDestroyCompletely (BattleSeaPlayer battleSeaPlayer, Ship ship) { + private boolean isShipDestroyCompletely (BattleSeaPlayer battleSeaPlayer, Ship ship) { int row = ship.getRow(); int col = ship.getColumn(); int length = ship.getLength(); @@ -114,7 +113,7 @@ private static boolean isShipDestroyCompletely (BattleSeaPlayer battleSeaPlayer, return flag; } - private static void changeDestroyedShipSign(BattleSeaPlayer battleSeaPlayer, Ship ship) { + private void changeDestroyedShipSign(BattleSeaPlayer battleSeaPlayer, Ship ship) { int row = ship.getRow(); int col = ship.getColumn(); int length = ship.getLength(); @@ -139,7 +138,7 @@ private static void changeDestroyedShipSign(BattleSeaPlayer battleSeaPlayer, Shi } } - private static boolean hasLocationError(int row, int col, int dir, BattleSeaPlayer battleSeaPlayer, int counterOfShips) { + private boolean hasLocationError(int row, int col, int dir, BattleSeaPlayer battleSeaPlayer, int counterOfShips) { int length = battleSeaPlayer.ships[counterOfShips].getLength(); int width = battleSeaPlayer.ships[counterOfShips].getWidth(); @@ -191,17 +190,14 @@ private static boolean hasLocationError(int row, int col, int dir, BattleSeaPlay return false; } - private static void changeShipsLocation(BattleSeaPlayer battleSeaPlayer, String shipName) { + private void changeShipsLocation(BattleSeaPlayer battleSeaPlayer, String shipName , int newCol, int newRow) { battleSeaPlayer.playerGrid.printShips(); System.out.println(); String input; input = shipName.toUpperCase(); int selectedShip = convertLetterToInt(input); - System.out.println("Enter new row: "); - int newRow = scanner.nextInt(); - System.out.println("Enter new column: "); - int newCol = scanner.nextInt(); + if (newCol >= 0 && newCol <= 9 && newRow >= 0 && newRow <= 9) { if (!hasLocationError(newRow, newCol, battleSeaPlayer.ships[selectedShip].getDirection(), battleSeaPlayer, selectedShip)) { @@ -215,7 +211,7 @@ private static void changeShipsLocation(BattleSeaPlayer battleSeaPlayer, String } } - private static void changeShipsDirection(BattleSeaPlayer battleSeaPlayer, String shipName) { + private void changeShipsDirection(BattleSeaPlayer battleSeaPlayer, String shipName) { battleSeaPlayer.playerGrid.printShips(); System.out.println(); String input; @@ -242,7 +238,7 @@ private static void changeShipsDirection(BattleSeaPlayer battleSeaPlayer, String } - private static int convertLetterToInt(String letter) { + private int convertLetterToInt(String letter) { int toReturn = -1; switch (letter) { case "A": From ad97d447c9022c4556901b40ce9389cf72b5b80f Mon Sep 17 00:00:00 2001 From: Sadra Date: Thu, 17 Dec 2020 19:11:44 +0330 Subject: [PATCH 08/18] add isReady to BattleSeaPlayer --- src/main/java/model/BattleSea/BattleSeaPlayer.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/model/BattleSea/BattleSeaPlayer.java b/src/main/java/model/BattleSea/BattleSeaPlayer.java index 6f0d263..a1945be 100644 --- a/src/main/java/model/BattleSea/BattleSeaPlayer.java +++ b/src/main/java/model/BattleSea/BattleSeaPlayer.java @@ -11,6 +11,7 @@ public class BattleSeaPlayer { public Ship[] ships; public Grid playerGrid; private Player player; + boolean isReady; public BattleSeaPlayer(Player player) { @@ -23,6 +24,7 @@ public BattleSeaPlayer(Player player) { } playerGrid = new Grid(); this.player = player; + isReady =false; } public int numOfShipsLeft() { From f528b5977cf73db0f9944a2825013521e04edc0a Mon Sep 17 00:00:00 2001 From: Sadra Date: Thu, 17 Dec 2020 19:25:14 +0330 Subject: [PATCH 09/18] fix BattleSea --- src/main/java/model/BattleSea/BattleSea.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/model/BattleSea/BattleSea.java b/src/main/java/model/BattleSea/BattleSea.java index 9bc4182..ab102e5 100644 --- a/src/main/java/model/BattleSea/BattleSea.java +++ b/src/main/java/model/BattleSea/BattleSea.java @@ -9,7 +9,7 @@ import java.util.Scanner; public class BattleSea extends Game { - private static HashMap battleSeas; + private static HashMap battleSeas = new HashMap<>(); BattleSeaPlayer host ; @@ -23,6 +23,10 @@ public BattleSea(Player host) { turn = this.host; } + public static HashMap getBattleSeas() { + return battleSeas; + } + private void setupRandomBoard(BattleSeaPlayer battleSeaPlayer) { System.out.println(); int counterOfShips = 0; @@ -265,7 +269,11 @@ private int convertLetterToInt(String letter) { @Override public void turn() { - + if (turn.equals(host)) { + turn = guest; + } else { + turn = host; + } } @Override From 0206459f639a6eb1df38331f67609a5ef4cbf294 Mon Sep 17 00:00:00 2001 From: Sadra Date: Thu, 17 Dec 2020 19:29:02 +0330 Subject: [PATCH 10/18] fix GameCommands --- src/main/java/controller/Command/GameCommands.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/controller/Command/GameCommands.java b/src/main/java/controller/Command/GameCommands.java index 1f60a11..d26f184 100644 --- a/src/main/java/controller/Command/GameCommands.java +++ b/src/main/java/controller/Command/GameCommands.java @@ -69,22 +69,22 @@ public void execute(String[] tokens) throws Exception { case "open": done(GameController.getGameController().open(tokens[3], tokens[1])); break; - case "end of my turn": + case "endofmyturn": done(DotsAndBoxesController.getDotsAndBoxesController().endOfMyTurn(Long.parseLong(tokens[3]))); break; - case "show score": + case "showscore": done(DotsAndBoxesController.getDotsAndBoxesController().showScore(Long.parseLong(tokens[3]))); break; - case "show available lines": + case "showavailablelines": done(DotsAndBoxesController.getDotsAndBoxesController().showAvailableLines(Long.parseLong(tokens[3]))); break; - case "show table": + case "showtable": done(DotsAndBoxesController.getDotsAndBoxesController().showTable(Long.parseLong(tokens[3]))); break; - case "who is next?": + case "whoisnext?": done(DotsAndBoxesController.getDotsAndBoxesController().whoIsNext(Long.parseLong(tokens[3]))); break; - case "show result": + case "showresult": done(DotsAndBoxesController.getDotsAndBoxesController().showResult(Long.parseLong(tokens[3]))); break; case "end": From 6e5ca77e58c09c4f822b5c932ab9bf7fee29030d Mon Sep 17 00:00:00 2001 From: aminlotfi Date: Thu, 17 Dec 2020 20:22:41 +0330 Subject: [PATCH 11/18] handle BattleSea connection. --- .../java/controller/Command/GameCommands.java | 46 +++++++++++++++++++ src/main/java/model/BattleSea/BattleSea.java | 7 ++- 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/src/main/java/controller/Command/GameCommands.java b/src/main/java/controller/Command/GameCommands.java index d26f184..cdc8087 100644 --- a/src/main/java/controller/Command/GameCommands.java +++ b/src/main/java/controller/Command/GameCommands.java @@ -22,6 +22,9 @@ public void resolveCommand(String[] tokens) throws Exception { break; case "DotsAndBoxes": DotsAndBoxesCommand.getDotsAndBoxesCommand().execute(tokens); + break; + case "BattleSea": + BattleSeaCommand.getBattleSeaCommand().execute(tokens); } } @@ -92,4 +95,47 @@ public void execute(String[] tokens) throws Exception { } } } + + private static class BattleSeaCommand implements ExecuteCommand { + private static final BattleSeaCommand battleSeaCommand = new BattleSeaCommand(); + + private BattleSeaCommand() { + } + + static BattleSeaCommand getBattleSeaCommand() { + return battleSeaCommand; + } + + @Override + public void execute(String[] tokens) throws Exception { + switch (tokens[2]) { + case "occupy": // when we want to occupy a line (edge). we must pass x1,y1,x2,y2 through menu (there is no username coming from menu) + done(DotsAndBoxesController.getDotsAndBoxesController().occupy(Long.parseLong(tokens[3]), Integer.parseInt(tokens[4]), Integer.parseInt(tokens[5]), Integer.parseInt(tokens[6]), Integer.parseInt(tokens[7]), null)); + break; + case "open": + done(GameController.getGameController().open(tokens[3], tokens[1])); + break; + case "endofmyturn": + done(DotsAndBoxesController.getDotsAndBoxesController().endOfMyTurn(Long.parseLong(tokens[3]))); + break; + case "showscore": + done(DotsAndBoxesController.getDotsAndBoxesController().showScore(Long.parseLong(tokens[3]))); + break; + case "showavailablelines": + done(DotsAndBoxesController.getDotsAndBoxesController().showAvailableLines(Long.parseLong(tokens[3]))); + break; + case "showtable": + done(DotsAndBoxesController.getDotsAndBoxesController().showTable(Long.parseLong(tokens[3]))); + break; + case "whoisnext?": + done(DotsAndBoxesController.getDotsAndBoxesController().whoIsNext(Long.parseLong(tokens[3]))); + break; + case "showresult": + done(DotsAndBoxesController.getDotsAndBoxesController().showResult(Long.parseLong(tokens[3]))); + break; + case "end": + done(DotsAndBoxesController.getDotsAndBoxesController().end(Long.parseLong(tokens[3]))); + } + } + } } diff --git a/src/main/java/model/BattleSea/BattleSea.java b/src/main/java/model/BattleSea/BattleSea.java index ab102e5..d0c2360 100644 --- a/src/main/java/model/BattleSea/BattleSea.java +++ b/src/main/java/model/BattleSea/BattleSea.java @@ -278,7 +278,12 @@ public void turn() { @Override public boolean join(Player guest) { - return false; + if (this.guest == null) { + this.guest = new BattleSeaPlayer(guest); + return true; + } else { + return false; + } } @Override From 40cebbabf3fa5820bcf85ad09cf6c430d25496b5 Mon Sep 17 00:00:00 2001 From: aminlotfi Date: Thu, 17 Dec 2020 20:43:38 +0330 Subject: [PATCH 12/18] add ready method. --- .../java/controller/Command/GameCommands.java | 27 +-- src/main/java/model/BattleSea/BattleSea.java | 188 +++++++++--------- 2 files changed, 98 insertions(+), 117 deletions(-) diff --git a/src/main/java/controller/Command/GameCommands.java b/src/main/java/controller/Command/GameCommands.java index cdc8087..5ee022e 100644 --- a/src/main/java/controller/Command/GameCommands.java +++ b/src/main/java/controller/Command/GameCommands.java @@ -109,32 +109,7 @@ static BattleSeaCommand getBattleSeaCommand() { @Override public void execute(String[] tokens) throws Exception { switch (tokens[2]) { - case "occupy": // when we want to occupy a line (edge). we must pass x1,y1,x2,y2 through menu (there is no username coming from menu) - done(DotsAndBoxesController.getDotsAndBoxesController().occupy(Long.parseLong(tokens[3]), Integer.parseInt(tokens[4]), Integer.parseInt(tokens[5]), Integer.parseInt(tokens[6]), Integer.parseInt(tokens[7]), null)); - break; - case "open": - done(GameController.getGameController().open(tokens[3], tokens[1])); - break; - case "endofmyturn": - done(DotsAndBoxesController.getDotsAndBoxesController().endOfMyTurn(Long.parseLong(tokens[3]))); - break; - case "showscore": - done(DotsAndBoxesController.getDotsAndBoxesController().showScore(Long.parseLong(tokens[3]))); - break; - case "showavailablelines": - done(DotsAndBoxesController.getDotsAndBoxesController().showAvailableLines(Long.parseLong(tokens[3]))); - break; - case "showtable": - done(DotsAndBoxesController.getDotsAndBoxesController().showTable(Long.parseLong(tokens[3]))); - break; - case "whoisnext?": - done(DotsAndBoxesController.getDotsAndBoxesController().whoIsNext(Long.parseLong(tokens[3]))); - break; - case "showresult": - done(DotsAndBoxesController.getDotsAndBoxesController().showResult(Long.parseLong(tokens[3]))); - break; - case "end": - done(DotsAndBoxesController.getDotsAndBoxesController().end(Long.parseLong(tokens[3]))); + //TODO add commands. } } } diff --git a/src/main/java/model/BattleSea/BattleSea.java b/src/main/java/model/BattleSea/BattleSea.java index d0c2360..50b3bf2 100644 --- a/src/main/java/model/BattleSea/BattleSea.java +++ b/src/main/java/model/BattleSea/BattleSea.java @@ -1,20 +1,15 @@ package model.BattleSea; -import model.DotsAndBoxes.DotsAndBoxes; import model.Game; import model.Player; - -import java.util.ArrayList; import java.util.HashMap; -import java.util.Scanner; public class BattleSea extends Game { private static HashMap battleSeas = new HashMap<>(); - - BattleSeaPlayer host ; - BattleSeaPlayer guest ; - BattleSeaPlayer turn; + BattleSeaPlayer host ; + BattleSeaPlayer guest ; + BattleSeaPlayer turn; public BattleSea(Player host) { super(); @@ -27,6 +22,30 @@ public static HashMap getBattleSeas() { return battleSeas; } + @Override + public void turn() { + if (turn.equals(host)) { + turn = guest; + } else { + turn = host; + } + } + + @Override + public boolean join(Player guest) { + if (this.guest == null) { + this.guest = new BattleSeaPlayer(guest); + return true; + } else { + return false; + } + } + + @Override + public Player judge() { + return null; + } + private void setupRandomBoard(BattleSeaPlayer battleSeaPlayer) { System.out.println(); int counterOfShips = 0; @@ -54,36 +73,40 @@ private void setupRandomBoard(BattleSeaPlayer battleSeaPlayer) { } } + private void ready() { + turn.isReady = true; + } + private void askForGuess(BattleSeaPlayer player, BattleSeaPlayer opponent, int x, int y) { - boolean flag = false; - // row == y , col == x + if (turn.isReady){ + boolean flag = false; + // row == y , col == x - if (x < 0 || x > 9 || y < 0 || y > 9) { - System.out.println("Coordinates must be inside the grid."); - } + if (x < 0 || x > 9 || y < 0 || y > 9) { + System.out.println("Coordinates must be inside the grid."); + } - while (!flag) { - if (!opponent.playerGrid.alreadyGuessed(y, x)){ - if (opponent.playerGrid.hasShip(y, x)) { - opponent.playerGrid.markHit(y, x); - System.out.println("Bombed successfully!!!"); - Ship oppShip = opponent.ships[convertLetterToInt(opponent.playerGrid.get(y, x).getShipName())]; - if (isShipDestroyCompletely(opponent, oppShip)) { - changeDestroyedShipSign(opponent, oppShip); + while (!flag) { + if (!opponent.playerGrid.alreadyGuessed(y, x)){ + if (opponent.playerGrid.hasShip(y, x)) { + opponent.playerGrid.markHit(y, x); + System.out.println("Bombed successfully!!!"); + Ship oppShip = opponent.ships[convertLetterToInt(opponent.playerGrid.get(y, x).getShipName())]; + if (isShipDestroyCompletely(opponent, oppShip)) { + changeDestroyedShipSign(opponent, oppShip); + } + } else { + opponent.playerGrid.markMiss(y, x); + System.out.println("Bombed unsuccessfully!"); + flag = true; } - - - } else { - opponent.playerGrid.markMiss(y, x); - System.out.println("Bombed unsuccessfully!"); - flag = true; + System.out.println("Selected X,Y has been already boomed"); } - } else { - System.out.println("Selected X,Y has been already boomed"); } + } else { + System.out.println("You're not ready!"); } - } private boolean isShipDestroyCompletely (BattleSeaPlayer battleSeaPlayer, Ship ship) { @@ -195,51 +218,58 @@ private boolean hasLocationError(int row, int col, int dir, BattleSeaPlayer batt } private void changeShipsLocation(BattleSeaPlayer battleSeaPlayer, String shipName , int newCol, int newRow) { - battleSeaPlayer.playerGrid.printShips(); - System.out.println(); - String input; - - input = shipName.toUpperCase(); - int selectedShip = convertLetterToInt(input); - - if (newCol >= 0 && newCol <= 9 && newRow >= 0 && newRow <= 9) { - if (!hasLocationError(newRow, newCol, battleSeaPlayer.ships[selectedShip].getDirection(), - battleSeaPlayer, selectedShip)) { - battleSeaPlayer.ships[selectedShip].setLocation(newRow, newCol); - battleSeaPlayer.playerGrid.addShip(battleSeaPlayer.ships[selectedShip]); - battleSeaPlayer.playerGrid.printShips(); - System.out.println("Ship " + input + " relocated " + "in (" + newRow + ", " + newCol + ") successfully!" ); - } else { - System.out.println("Ship " + input + " can not relocate in (" + newRow + ", " + newCol + ")."); + if (!turn.isReady) { + battleSeaPlayer.playerGrid.printShips(); + System.out.println(); + String input; + + input = shipName.toUpperCase(); + int selectedShip = convertLetterToInt(input); + + if (newCol >= 0 && newCol <= 9 && newRow >= 0 && newRow <= 9) { + if (!hasLocationError(newRow, newCol, battleSeaPlayer.ships[selectedShip].getDirection(), + battleSeaPlayer, selectedShip)) { + battleSeaPlayer.ships[selectedShip].setLocation(newRow, newCol); + battleSeaPlayer.playerGrid.addShip(battleSeaPlayer.ships[selectedShip]); + battleSeaPlayer.playerGrid.printShips(); + System.out.println("Ship " + input + " relocated " + "in (" + newRow + ", " + newCol + ") successfully!" ); + } else { + System.out.println("Ship " + input + " can not relocate in (" + newRow + ", " + newCol + ")."); + } } + } else { + System.out.println("This command is for before starting the game."); } } private void changeShipsDirection(BattleSeaPlayer battleSeaPlayer, String shipName) { - battleSeaPlayer.playerGrid.printShips(); - System.out.println(); - String input; - - input = shipName.toUpperCase(); - int selectedShip = convertLetterToInt(input); - int row = battleSeaPlayer.ships[selectedShip].getRow(); - int col = battleSeaPlayer.ships[selectedShip].getColumn(); - int dir = battleSeaPlayer.ships[selectedShip].getDirection(); - if (dir == 0) { - dir = 1; - } else { - dir = 0; - } - if (!hasLocationError(row, col, dir, battleSeaPlayer, selectedShip)) { - battleSeaPlayer.ships[selectedShip].setLocation(row, col); - battleSeaPlayer.ships[selectedShip].setDirection(dir); - battleSeaPlayer.playerGrid.addShip(battleSeaPlayer.ships[selectedShip]); + if (!turn.isReady) { battleSeaPlayer.playerGrid.printShips(); - System.out.println("Ship " + input + " rotated successfully!" ); + System.out.println(); + String input; + + input = shipName.toUpperCase(); + int selectedShip = convertLetterToInt(input); + int row = battleSeaPlayer.ships[selectedShip].getRow(); + int col = battleSeaPlayer.ships[selectedShip].getColumn(); + int dir = battleSeaPlayer.ships[selectedShip].getDirection(); + if (dir == 0) { + dir = 1; + } else { + dir = 0; + } + if (!hasLocationError(row, col, dir, battleSeaPlayer, selectedShip)) { + battleSeaPlayer.ships[selectedShip].setLocation(row, col); + battleSeaPlayer.ships[selectedShip].setDirection(dir); + battleSeaPlayer.playerGrid.addShip(battleSeaPlayer.ships[selectedShip]); + battleSeaPlayer.playerGrid.printShips(); + System.out.println("Ship " + input + " rotated successfully!" ); + } else { + System.out.println("Ship " + input + " can not rotated."); + } } else { - System.out.println("Ship " + input + " can not rotated."); + System.out.println("This command is for before starting the game."); } - } private int convertLetterToInt(String letter) { @@ -266,28 +296,4 @@ private int convertLetterToInt(String letter) { } return toReturn; } - - @Override - public void turn() { - if (turn.equals(host)) { - turn = guest; - } else { - turn = host; - } - } - - @Override - public boolean join(Player guest) { - if (this.guest == null) { - this.guest = new BattleSeaPlayer(guest); - return true; - } else { - return false; - } - } - - @Override - public Player judge() { - return null; - } } From a57ecdcfd40552ce5d73db866e703826e741969c Mon Sep 17 00:00:00 2001 From: aminlotfi Date: Thu, 17 Dec 2020 21:04:15 +0330 Subject: [PATCH 13/18] change methods return type. --- src/main/java/model/BattleSea/BattleSea.java | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/main/java/model/BattleSea/BattleSea.java b/src/main/java/model/BattleSea/BattleSea.java index 50b3bf2..3eb5952 100644 --- a/src/main/java/model/BattleSea/BattleSea.java +++ b/src/main/java/model/BattleSea/BattleSea.java @@ -46,7 +46,7 @@ public Player judge() { return null; } - private void setupRandomBoard(BattleSeaPlayer battleSeaPlayer) { + private void setupRandomBoard(BattleSeaPlayer battleSeaPlayer) { System.out.println(); int counterOfShips = 0; @@ -217,7 +217,7 @@ private boolean hasLocationError(int row, int col, int dir, BattleSeaPlayer batt return false; } - private void changeShipsLocation(BattleSeaPlayer battleSeaPlayer, String shipName , int newCol, int newRow) { + private String changeShipsLocation(BattleSeaPlayer battleSeaPlayer, String shipName , int newCol, int newRow) { if (!turn.isReady) { battleSeaPlayer.playerGrid.printShips(); System.out.println(); @@ -232,17 +232,19 @@ private void changeShipsLocation(BattleSeaPlayer battleSeaPlayer, String shipNam battleSeaPlayer.ships[selectedShip].setLocation(newRow, newCol); battleSeaPlayer.playerGrid.addShip(battleSeaPlayer.ships[selectedShip]); battleSeaPlayer.playerGrid.printShips(); - System.out.println("Ship " + input + " relocated " + "in (" + newRow + ", " + newCol + ") successfully!" ); + return "Ship " + input + " relocated " + "in (" + newRow + ", " + newCol + ") successfully!"; } else { - System.out.println("Ship " + input + " can not relocate in (" + newRow + ", " + newCol + ")."); + return "Ship " + input + " can not relocate in (" + newRow + ", " + newCol + ")."; } + } else { + return "Invalid coordinate."; } } else { - System.out.println("This command is for before starting the game."); + return "This command is for before starting the game."; } } - private void changeShipsDirection(BattleSeaPlayer battleSeaPlayer, String shipName) { + private String changeShipsDirection(BattleSeaPlayer battleSeaPlayer, String shipName) { if (!turn.isReady) { battleSeaPlayer.playerGrid.printShips(); System.out.println(); @@ -263,12 +265,12 @@ private void changeShipsDirection(BattleSeaPlayer battleSeaPlayer, String shipNa battleSeaPlayer.ships[selectedShip].setDirection(dir); battleSeaPlayer.playerGrid.addShip(battleSeaPlayer.ships[selectedShip]); battleSeaPlayer.playerGrid.printShips(); - System.out.println("Ship " + input + " rotated successfully!" ); + return "Ship " + input + " rotated successfully!"; } else { - System.out.println("Ship " + input + " can not rotated."); + return "Ship " + input + " can not rotated."; } } else { - System.out.println("This command is for before starting the game."); + return"This command is for before starting the game."; } } From 9a3b60ae7c862fc947259adbbec4a864d59f794b Mon Sep 17 00:00:00 2001 From: Mehran Khaksar Date: Thu, 17 Dec 2020 21:06:45 +0330 Subject: [PATCH 14/18] Add PlayerTest --- src/test/java/PlayerTest.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/test/java/PlayerTest.java b/src/test/java/PlayerTest.java index f078900..d0c220d 100644 --- a/src/test/java/PlayerTest.java +++ b/src/test/java/PlayerTest.java @@ -1,2 +1,21 @@ +import model.Player; +import model.User; +import org.junit.Assert; +import org.junit.Test; + +import java.util.ArrayList; + public class PlayerTest { + + @Test + public void addNewPlayer() { + Player player = new Player("firstName", "lastName", + "userName", "password", + "example@exp.exp", "09000000000"); + ArrayList players = new ArrayList<>(); + Player.addPlayers(players); + + Assert.assertEquals(Player.getPlayers().get("userName").getUsername(), "userName"); + Assert.assertEquals(Player.getPlayers().size(), 1); + } } From 10f14e901876ce6b8885a187214c68622ad30206 Mon Sep 17 00:00:00 2001 From: Mehran Khaksar Date: Thu, 17 Dec 2020 21:18:29 +0330 Subject: [PATCH 15/18] Add AdminTest --- src/test/java/AdminTest.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/test/java/AdminTest.java diff --git a/src/test/java/AdminTest.java b/src/test/java/AdminTest.java new file mode 100644 index 0000000..3ec564a --- /dev/null +++ b/src/test/java/AdminTest.java @@ -0,0 +1,18 @@ +import model.Admin; +import model.User; +import org.junit.Assert; + +import java.util.ArrayList; + +public class AdminTest { + public void addNewAdmin() { + Admin admin = new Admin("firstName", "lastName", + "userName", "password", + "example@exp.exp", "09000000000"); + ArrayList admins = new ArrayList<>(); + Admin.addAdmins(admins); + + Assert.assertEquals(Admin.getAdmins().get("userName").getUsername(), "userName"); + Assert.assertEquals(Admin.getAdmins().size(), 1); + } +} From 3f1c24ef1a9225aa10a016165c23d32bb9193134 Mon Sep 17 00:00:00 2001 From: mahdi hadi Date: Thu, 17 Dec 2020 22:59:21 +0330 Subject: [PATCH 16/18] Merge remote-tracking branch 'remotes/origin/main' into phase1 # Conflicts: # src/main/java/controller/Command/GameCommands.java # src/main/java/view/game/DotsAndBoxesMenu.java --- .../Command/game/BattleSeaController.java | 12 ++++ .../Command/game/GameController.java | 7 +-- .../java/exception/game/NotPlayedYet.java | 5 +- .../java/model/DotsAndBoxes/DotsAndBoxes.java | 27 +-------- src/main/java/model/Game.java | 55 +++++++++++++++---- src/main/java/view/game/BattleSeaMenu.java | 25 ++++++++- src/main/java/view/game/DotsAndBoxesMenu.java | 2 - src/main/java/view/game/Game.java | 6 +- src/main/java/view/primary/AdminMenu.java | 2 +- 9 files changed, 93 insertions(+), 48 deletions(-) diff --git a/src/main/java/controller/Command/game/BattleSeaController.java b/src/main/java/controller/Command/game/BattleSeaController.java index 55baedd..7591df7 100644 --- a/src/main/java/controller/Command/game/BattleSeaController.java +++ b/src/main/java/controller/Command/game/BattleSeaController.java @@ -1,4 +1,16 @@ package controller.Command.game; public class BattleSeaController { + private static final BattleSeaController battleSeaController = new BattleSeaController(); + + private BattleSeaController() { + } + + public static BattleSeaController getBattleSeaController() { + return battleSeaController; + } + + public void changeCoordination(char ship, int x, int y) { + + } } diff --git a/src/main/java/controller/Command/game/GameController.java b/src/main/java/controller/Command/game/GameController.java index 3aa1e00..a08e678 100644 --- a/src/main/java/controller/Command/game/GameController.java +++ b/src/main/java/controller/Command/game/GameController.java @@ -2,6 +2,7 @@ import exception.game.GameNotFound; import exception.UsernameNotFound; +import exception.game.NotPlayedYet; import model.DotsAndBoxes.DotsAndBoxes; import model.Game; import model.GameLog; @@ -23,7 +24,7 @@ public static GameController getGameController() { public String names() { StringBuilder tmp = new StringBuilder(); - for (String s : Game.getGames()) { + for (String s : Game.getNames()) { tmp.append(s).append(" • "); } return tmp.toString().substring(0, tmp.toString().length() - 1).trim(); @@ -42,10 +43,6 @@ public String open(String username, String game) throws GameNotFound { } } - public String turn(long game) { // changes turn - - } - public void showScoreboard(String gameName) throws GameNotFound { HashMap allPlayersScore = new HashMap(); if (gameName.equalsIgnoreCase("Dots And Boxes")) { diff --git a/src/main/java/exception/game/NotPlayedYet.java b/src/main/java/exception/game/NotPlayedYet.java index 7495211..fbaffbe 100644 --- a/src/main/java/exception/game/NotPlayedYet.java +++ b/src/main/java/exception/game/NotPlayedYet.java @@ -1,4 +1,7 @@ package exception.game; -public class NotPlayedYet { +public class NotPlayedYet extends Exception { + public NotPlayedYet() { + super("You should play first!"); + } } diff --git a/src/main/java/model/DotsAndBoxes/DotsAndBoxes.java b/src/main/java/model/DotsAndBoxes/DotsAndBoxes.java index dc56470..3a4daaa 100644 --- a/src/main/java/model/DotsAndBoxes/DotsAndBoxes.java +++ b/src/main/java/model/DotsAndBoxes/DotsAndBoxes.java @@ -11,9 +11,6 @@ public class DotsAndBoxes extends Game { private static HashMap dotsAndBoxes; private ArrayList edges; - private Player host; - private Player guest; - private Player turn; private boolean playerMovedInThisTurn = false; private int hostScore; private int guestScore; @@ -36,11 +33,9 @@ public boolean hasPlayerMovedInThisTurn() { } public DotsAndBoxes(Player host) { - super(); + super(host); dotsAndBoxes.put(getGameID(), this); edges = new ArrayList<>(); - this.host = host; - turn = host; } public boolean isBoardFull() { @@ -141,26 +136,6 @@ public Player winByForfeit() { return winner; } - @Override - public void turn() { // flips turn - if (turn.equals(host)) { - turn = guest; - } else { - turn = host; - } - playerMovedInThisTurn = false; - } - - @Override - public boolean join(Player guest) { // another player joins and game can be start - if (this.guest == null) { - this.guest = guest; - return true; - } else { - return false; - } - } - @Override public Player judge() { // judges whole game when finished (in this one, board is full) if (hostScore > guestScore) diff --git a/src/main/java/model/Game.java b/src/main/java/model/Game.java index 59e3f0a..f8fef25 100644 --- a/src/main/java/model/Game.java +++ b/src/main/java/model/Game.java @@ -6,16 +6,26 @@ import java.util.Random; public abstract class Game { - private final static ArrayList games; + private final static ArrayList names; + private static HashMap games; private long gameID; + protected Player host; + protected Player guest; + protected Player turn; + protected boolean moved; static { - games = new ArrayList<>(Arrays.asList("Battle Sea", "Dots And Boxes")); + names = new ArrayList<>(Arrays.asList("Battle Sea", "Dots And Boxes")); + games = new HashMap<>(); } - public Game() { + public Game(Player host) { gameID = IDGenerator(); + games.put(gameID, this); + this.host = host; + turn = host; + moved = false; } private long IDGenerator() { @@ -23,21 +33,44 @@ private long IDGenerator() { return random.nextLong(); } - public void setScore(){ - //TODO - } - public long getGameID() { return gameID; } - public static ArrayList getGames() { - return games; + public Player getHost() { + return host; + } + + public void join(Player guest) { + this.guest = guest; + } + + public Player getGuest() { + return guest; } - public abstract void turn(); + public void turn() { + if (turn.equals(host)) { + turn = guest; + } else { + turn = host; + } + moved = false; + } - public abstract boolean join(Player guest); + public boolean isMoved() { + return moved; + } + + public abstract void setScore(); //TODO + + public static ArrayList getNames() { + return names; + } + + public static HashMap getGames() { + return games; + } public abstract Player judge(); } diff --git a/src/main/java/view/game/BattleSeaMenu.java b/src/main/java/view/game/BattleSeaMenu.java index def4085..7071844 100644 --- a/src/main/java/view/game/BattleSeaMenu.java +++ b/src/main/java/view/game/BattleSeaMenu.java @@ -1,5 +1,6 @@ package view.game; +import view.Client; import view.Menu; public class BattleSeaMenu extends Menu implements Game { @@ -12,6 +13,26 @@ public static BattleSeaMenu getBattleSeaMenu() { return battleSeaMenu; } + private void changeCoordinate() { + System.out.print("Ship Name: >"); + char ship = (char) scanner.nextByte(); + scanner.nextLine(); + if (ship == 'A' || ship == 'B' || ship == 'C' || ship == 'D' || ship == 'E' || ship == 'F') { + System.out.print("Coordinates (x y): >"); + int x = scanner.nextInt(); + int y = scanner.nextInt(); + scanner.nextLine(); + if (x > 0 && x < 11 && y > 0 && y < 11) { + Client.getClient().send("game BattleSea changeCoordination " + ship + " " + x + " " + y); + System.out.println(Client.getClient().getResponse()); + } else { + System.out.println("Wrong coordination!"); + } + } else { + System.out.println("Wrong ship name!"); + } + } + @Override public void run() { while (true) { @@ -19,7 +40,9 @@ public void run() { case "turn": turn(); break; - case "" + case "change coordinate": + changeCoordinate(); + break; } } } diff --git a/src/main/java/view/game/DotsAndBoxesMenu.java b/src/main/java/view/game/DotsAndBoxesMenu.java index a154041..3215f93 100644 --- a/src/main/java/view/game/DotsAndBoxesMenu.java +++ b/src/main/java/view/game/DotsAndBoxesMenu.java @@ -1,7 +1,5 @@ package view.game; -import model.DotsAndBoxes.DotsAndBoxes; -import model.Player; import view.Client; import view.Menu; diff --git a/src/main/java/view/game/Game.java b/src/main/java/view/game/Game.java index c77ab08..eca653f 100644 --- a/src/main/java/view/game/Game.java +++ b/src/main/java/view/game/Game.java @@ -1,8 +1,12 @@ package view.game; +import view.Client; +import view.Menu; + public interface Game { default void turn() { - + Client.getClient().send("game turn " + Menu.gameID); + System.out.println(Client.getClient().getResponse()); } default void update() { diff --git a/src/main/java/view/primary/AdminMenu.java b/src/main/java/view/primary/AdminMenu.java index 1dcfad0..7228e5c 100644 --- a/src/main/java/view/primary/AdminMenu.java +++ b/src/main/java/view/primary/AdminMenu.java @@ -50,7 +50,7 @@ private void addEvent() { if (localDate.isAfter(LocalDate.of(syear, smonth, sday)) || localDate.isAfter(LocalDate.of(fyear, fmonth, fday))) { System.out.println("Invalid Start or End Date!"); } else if (score < 1) { - System.out.println("Score can not be zero on negative!"); + System.out.println("Score can not be zero or negative!"); } else { Client.getClient().send("user addEvent " + game + " " + syear + " " + smonth + " " + sday + " " + fyear + " " + fmonth + " " + fday + " " + score); } From b6665fe48c0736513fa3d65c023098c785ab43a7 Mon Sep 17 00:00:00 2001 From: Sadra Date: Fri, 5 Feb 2021 21:14:06 +0330 Subject: [PATCH 17/18] score and level added to gamelog --- src/main/java/model/GameLog.java | 9 +++++++++ src/main/java/model/Player.java | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/java/model/GameLog.java b/src/main/java/model/GameLog.java index 9052e4b..0b7531e 100644 --- a/src/main/java/model/GameLog.java +++ b/src/main/java/model/GameLog.java @@ -32,11 +32,15 @@ public GameLog(String game, Player host, Player guest, LocalDate date, Result re switch (result) { case WIN: + host.setScore(host.getScore() + 10); + host.setLevel(host.getLevel() + 1); if (host.getWins().containsKey(game)) { host.getWins().put(game, host.getWins().get(game) + 1); } else { host.getWins().put(game, 1); } + + guest.setScore(host.getScore() - 5); if (guest.getDefeats().containsKey(game)) { guest.getDefeats().put(game, guest.getDefeats().get(game) + 1); } else { @@ -44,11 +48,16 @@ public GameLog(String game, Player host, Player guest, LocalDate date, Result re } break; case DEFEAT: + + guest.setScore(host.getScore() + 10); + guest.setLevel(host.getLevel() + 1); if (guest.getWins().containsKey(game)) { guest.getWins().put(game, guest.getWins().get(game) + 1); } else { guest.getWins().put(game, 1); } + + host.setScore(host.getScore() - 5); if (host.getDefeats().containsKey(game)) { host.getDefeats().put(game, host.getDefeats().get(game) + 1); } else { diff --git a/src/main/java/model/Player.java b/src/main/java/model/Player.java index 508aa5c..eb2a5dc 100644 --- a/src/main/java/model/Player.java +++ b/src/main/java/model/Player.java @@ -98,7 +98,7 @@ public double getMoney() { return money; } - public long getScore() { + public int getScore() { return score; } From b8f4e961e910372e5130a60db806aed6962a53ea Mon Sep 17 00:00:00 2001 From: Sadra Date: Sun, 7 Feb 2021 21:50:16 +0330 Subject: [PATCH 18/18] dots and boxes gamelogs --- .../Command/game/DotsAndBoxesController.java | 14 ++++++++++++++ .../controller/Command/game/GameController.java | 2 +- src/main/java/model/DotsAndBoxes/DotsAndBoxes.java | 5 +++++ src/test/java/AdminTest.java | 2 ++ 4 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/main/java/controller/Command/game/DotsAndBoxesController.java b/src/main/java/controller/Command/game/DotsAndBoxesController.java index 16cc34b..ab77850 100644 --- a/src/main/java/controller/Command/game/DotsAndBoxesController.java +++ b/src/main/java/controller/Command/game/DotsAndBoxesController.java @@ -4,8 +4,13 @@ import exception.game.NotYourTurn; import model.DotsAndBoxes.DotsAndBoxes; +import model.Game; +import model.GameLog; import model.Player; +import java.time.LocalDate; +import java.util.Date; + public class DotsAndBoxesController { private static final DotsAndBoxesController dotsAndBoxesController = new DotsAndBoxesController(); @@ -148,8 +153,17 @@ public String end(long gameID) throws GameNotFound { DotsAndBoxes dotsAndBoxes = DotsAndBoxes.getDotsAndBoxes().get(gameID); if (dotsAndBoxes != null) { if (dotsAndBoxes.isBoardFull()) { + GameLog.Result result; + if (dotsAndBoxes.judge() == null) + result = GameLog.Result.DRAW; + else if (dotsAndBoxes.judge().equals(dotsAndBoxes.getHost())) + result = GameLog.Result.WIN; + else + result = GameLog.Result.DEFEAT; + new GameLog("dotsandboxes", dotsAndBoxes.getHost(), dotsAndBoxes.getGuest(), LocalDate.now(), result); return "Back to the game menu"; } else { + new GameLog("dotsandboxes", dotsAndBoxes.getHost(), dotsAndBoxes.getGuest(), LocalDate.now(), dotsAndBoxes.winByForfeit().equals(dotsAndBoxes.getHost())? GameLog.Result.WIN: GameLog.Result.DEFEAT); return dotsAndBoxes.winByForfeit().getUsername() + "won by forfeit" + '\n' + "Back to the game menu"; } diff --git a/src/main/java/controller/Command/game/GameController.java b/src/main/java/controller/Command/game/GameController.java index a08e678..65ef56a 100644 --- a/src/main/java/controller/Command/game/GameController.java +++ b/src/main/java/controller/Command/game/GameController.java @@ -37,10 +37,10 @@ public String open(String username, String game) throws GameNotFound { break; case "DotsAndBoxes": return Long.toString((new DotsAndBoxes(Player.getPlayers().get(username))).getGameID()); // returns game id for further uses (user game commands) - break; default: throw new GameNotFound(); } + return null; } public void showScoreboard(String gameName) throws GameNotFound { diff --git a/src/main/java/model/DotsAndBoxes/DotsAndBoxes.java b/src/main/java/model/DotsAndBoxes/DotsAndBoxes.java index 3a4daaa..eb97a44 100644 --- a/src/main/java/model/DotsAndBoxes/DotsAndBoxes.java +++ b/src/main/java/model/DotsAndBoxes/DotsAndBoxes.java @@ -157,6 +157,11 @@ public Player getGuest() { return guest; } + @Override + public void setScore() { + + } + public static HashMap getDotsAndBoxes() { return dotsAndBoxes; } diff --git a/src/test/java/AdminTest.java b/src/test/java/AdminTest.java index 3ec564a..eca867c 100644 --- a/src/test/java/AdminTest.java +++ b/src/test/java/AdminTest.java @@ -1,3 +1,4 @@ +/* import model.Admin; import model.User; import org.junit.Assert; @@ -16,3 +17,4 @@ public void addNewAdmin() { Assert.assertEquals(Admin.getAdmins().size(), 1); } } +*/