From a381c8d6602dd65fc24891dd51448f1afb10b642 Mon Sep 17 00:00:00 2001 From: Ole Wachtel Date: Sat, 30 Nov 2024 13:25:42 +0100 Subject: [PATCH 1/6] add OnlinePlayer Konstructer --- src/OnlinePlayer.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/OnlinePlayer.java b/src/OnlinePlayer.java index 66316d6..023bebb 100644 --- a/src/OnlinePlayer.java +++ b/src/OnlinePlayer.java @@ -1,11 +1,20 @@ +import java.io.BufferedInputStream; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintWriter; import java.net.Socket; public abstract class OnlinePlayer extends Player{ private Socket socket; + private BufferedReader netIn; + private PrintWriter netOut; - public OnlinePlayer(int size, Socket socket) { + public OnlinePlayer(int size, Socket socket, BufferedReader netIn) throws IOException { super(size); this.socket = socket; + this.netIn = netIn; + this.netOut = new PrintWriter(socket.getOutputStream(), true); //TODO Auto-generated constructor stub } } From 48a5958414ac703dba32c8b8d02ba7e1a2201c04 Mon Sep 17 00:00:00 2001 From: ole Date: Sat, 30 Nov 2024 13:48:50 +0100 Subject: [PATCH 2/6] add Thread safety for Player --- src/Board.java | 6 +++--- src/Player.java | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Board.java b/src/Board.java index 5cec0cd..99b1723 100644 --- a/src/Board.java +++ b/src/Board.java @@ -13,7 +13,7 @@ public class Board { this.createShip(size - 13); } - public HitResponse hit (Point point){ + public synchronized HitResponse hit (Point point){ HitResponse response = new HitResponse(HitResponseType.MISS,point); for (int i = 0; i < this.ships.size(); i++) { HitResponseType type = this.ships.get(i).shootOnShip(point); @@ -50,7 +50,7 @@ public class Board { return ships; } - public boolean addHits(HitResponse hitResponse) { + public synchronized boolean addHits(HitResponse hitResponse) { if (this.getHitResponsOnPoint(hitResponse.getPoint()) == null){ this.hits.add(hitResponse); return true; @@ -58,7 +58,7 @@ public class Board { return false; } - public HitResponse getHitResponsOnPoint(Point point) { + public synchronized HitResponse getHitResponsOnPoint(Point point) { for (int i = 0; i < this.hits.size(); i++){ if (this.hits.get(i).getPoint().equals(point)){ return this.hits.get(i); diff --git a/src/Player.java b/src/Player.java index 192b3f4..5eff33b 100644 --- a/src/Player.java +++ b/src/Player.java @@ -13,7 +13,7 @@ public abstract class Player { this.board = new Board(size); } - public void receiveShoot(Point point) { + public synchronized void receiveShoot(Point point) { HitResponse hitResponse = board.getHitResponsOnPoint(point); if (!(hitResponse == null)){ enemy.receiveHit(hitResponse); @@ -22,7 +22,7 @@ public abstract class Player { } } - public void receiveHit(HitResponse hitResponse) { + public synchronized void receiveHit(HitResponse hitResponse) { enemy.board.addHits(hitResponse); } From c2ca83c71872328d3d207f3d961f91659ea57f14 Mon Sep 17 00:00:00 2001 From: ole Date: Sat, 30 Nov 2024 17:04:29 +0100 Subject: [PATCH 3/6] chore: remove all unjust imports --- src/AiPlayer.java | 1 - src/Board.java | 2 +- src/HitResponse.java | 2 +- src/OnlinePlayer_1_1_0.java | 2 ++ src/Player.java | 2 -- src/Ship.java | 2 -- src/SoundHandler.java | 1 - src/SpecificAiPlayerMedium.java | 1 - src/startMultiplayerGame.java | 1 - 9 files changed, 4 insertions(+), 10 deletions(-) diff --git a/src/AiPlayer.java b/src/AiPlayer.java index ca8c82d..f3f3870 100644 --- a/src/AiPlayer.java +++ b/src/AiPlayer.java @@ -1,5 +1,4 @@ import java.util.Random; -import java.awt.Point; public abstract class AiPlayer extends Player { diff --git a/src/Board.java b/src/Board.java index 16a1277..eaf8d41 100644 --- a/src/Board.java +++ b/src/Board.java @@ -1,4 +1,4 @@ -import java.awt.*; + import java.util.List; public class Board { diff --git a/src/HitResponse.java b/src/HitResponse.java index bc9fca0..8f1d8ad 100644 --- a/src/HitResponse.java +++ b/src/HitResponse.java @@ -1,4 +1,4 @@ -import java.awt.*; + public class HitResponse { private HitResponseType type; diff --git a/src/OnlinePlayer_1_1_0.java b/src/OnlinePlayer_1_1_0.java index 916b294..b199952 100644 --- a/src/OnlinePlayer_1_1_0.java +++ b/src/OnlinePlayer_1_1_0.java @@ -1,3 +1,5 @@ +import java.util.List; + public class OnlinePlayer_1_1_0 extends OnlinePlayer { public OnlinePlayer_1_1_0(int size, AsyncSocket socket) { super(size, socket); diff --git a/src/Player.java b/src/Player.java index 5eff33b..9e6985e 100644 --- a/src/Player.java +++ b/src/Player.java @@ -1,5 +1,3 @@ -import java.awt.*; -import java.util.List; public abstract class Player { protected boolean myTurn; diff --git a/src/Ship.java b/src/Ship.java index de6cbff..dd2006d 100644 --- a/src/Ship.java +++ b/src/Ship.java @@ -1,6 +1,4 @@ - -import java.awt.Point; import java.util.ArrayList; import java.util.Arrays; import java.util.List; diff --git a/src/SoundHandler.java b/src/SoundHandler.java index d7b385b..f9d04a3 100644 --- a/src/SoundHandler.java +++ b/src/SoundHandler.java @@ -3,7 +3,6 @@ import javazoom.jl.player.Player; import java.io.FileInputStream; import java.io.FileNotFoundException; -import java.util.ArrayList; import java.util.HashMap; import java.util.Map; diff --git a/src/SpecificAiPlayerMedium.java b/src/SpecificAiPlayerMedium.java index c122f43..78cdae0 100644 --- a/src/SpecificAiPlayerMedium.java +++ b/src/SpecificAiPlayerMedium.java @@ -1,6 +1,5 @@ import java.util.ArrayList; import java.util.List; -import java.awt.Point; public class SpecificAiPlayerMedium extends AiPlayer{ diff --git a/src/startMultiplayerGame.java b/src/startMultiplayerGame.java index 4598994..472b62b 100644 --- a/src/startMultiplayerGame.java +++ b/src/startMultiplayerGame.java @@ -1,5 +1,4 @@ import javax.swing.*; -import java.awt.*; import java.awt.event.ActionEvent; public class startMultiplayerGame extends JPanel { From 058d069ff26de03a76dcedbea8bf2fbd1c54e6ca Mon Sep 17 00:00:00 2001 From: ole Date: Sat, 30 Nov 2024 17:06:25 +0100 Subject: [PATCH 4/6] change: all Points from java.awt.point too new Point.java --- src/Point.java | 45 +++++++++++++++++++++++++++++++++ src/Ship.java | 22 ++++++++-------- src/SpecificAiPlayerMedium.java | 8 +++--- src/startLocalGame.java | 1 - 4 files changed, 60 insertions(+), 16 deletions(-) create mode 100644 src/Point.java diff --git a/src/Point.java b/src/Point.java new file mode 100644 index 0000000..bf2b127 --- /dev/null +++ b/src/Point.java @@ -0,0 +1,45 @@ +public class Point { + private int x; + private int y; + + public Point (int x, int y) { + this.setX(x); + this.setY(y); + } + public Point (String str) { + if (Point.isValidSyntax(str)) { + this.setX(str.charAt(0)); + this.setY(Integer.parseInt(str.substring(1))); + } else { + throw new IllegalArgumentException("String ist keine gültige Koordinate"); + } + } + + @Override + public String toString() { + return (char) ('A' + this.x) + String.valueOf(this.y); + } + + public int getX() { + return x; + } + + public int getY() { + return y; + } + + public void setX(int x) { + this.x = x; + } + + public void setY(int y) { + this.y = y; + } + public void setX(char c) { + this.x = c - 'A'; + } + + public static boolean isValidSyntax(String str) { + return str.matches("^[A-Z]\\d+$"); + } +} diff --git a/src/Ship.java b/src/Ship.java index dd2006d..0c3c7f6 100644 --- a/src/Ship.java +++ b/src/Ship.java @@ -63,21 +63,21 @@ public class Ship { public boolean setPosition(Point pos, List shipsList, int boardSize) { // ueberpruefe boundaries - if (pos.x < 0 || pos.y < 0 || pos.x >= boardSize || pos.y >= boardSize) { + if (pos.getX() < 0 || pos.getY() < 0 || pos.getX() >= boardSize || pos.getY() >= boardSize) { return false; } // bestimme die Endposition anhand der Ausrichtung - int endX = pos.x; - int endY = pos.y; + int endX = pos.getX(); + int endY = pos.getY(); if (this.horizontal) { // rechts links - endX = pos.x + this.size - 1; + endX = pos.getX() + this.size - 1; if (endX >= boardSize) { return false; } } else { // oben unten - endY = pos.y + this.size - 1; + endY = pos.getY() + this.size - 1; if (endY >= boardSize) { return false; } @@ -86,8 +86,8 @@ public class Ship { // Liste an Punkten die das Schiff einnehmen wuerde List shipPoints = new ArrayList<>(); for (int i = 0; i < this.size; i++) { - int x = this.horizontal ? pos.x + i : pos.x; //falls horizontal dann pos.x + i ansonsten pos.x - int y = this.horizontal ? pos.y : pos.y + i; + int x = this.horizontal ? pos.getX() + i : pos.getX(); //falls horizontal dann pos.x + i ansonsten pos.x + int y = this.horizontal ? pos.getY() : pos.getY() + i; shipPoints.add(new Point(x, y)); } @@ -123,8 +123,8 @@ public class Ship { return points; } for (int i = 0; i < this.size; i++) { - int x = this.horizontal ? this.position.x + i : this.position.x; - int y = this.horizontal ? this.position.y : this.position.y + i; + int x = this.horizontal ? this.position.getX() + i : this.position.getX(); + int y = this.horizontal ? this.position.getY() : this.position.getY() + i; points.add(new Point(x, y)); } return points; @@ -135,8 +135,8 @@ public class Ship { } public boolean isShipOnPos(Point pos){ - if ((this.horizontal && pos.y == this.position.y && pos.x >= this.position.x && pos.x < this.position.x + size) || - (!(this.horizontal) && pos.x == this.position.x && pos.y >= this.position.y && pos.y < this.position.y + size)) { + if ((this.horizontal && pos.getY() == this.position.getY() && pos.getX() >= this.position.getX() && pos.getX() < this.position.getX() + size) || + (!(this.horizontal) && pos.getX() == this.position.getX() && pos.getY() >= this.position.getY() && pos.getY() < this.position.getY() + size)) { return true; } return false; diff --git a/src/SpecificAiPlayerMedium.java b/src/SpecificAiPlayerMedium.java index 78cdae0..1676eb4 100644 --- a/src/SpecificAiPlayerMedium.java +++ b/src/SpecificAiPlayerMedium.java @@ -42,8 +42,8 @@ public class SpecificAiPlayerMedium extends AiPlayer{ } private void addAdjacentPoints(Point point) { - int x = point.x; - int y = point.y; + int x = point.getX(); + int y = point.getY(); // Possible adjacent positions (up, down, left, right) Point[] adjacentPoints = { @@ -66,7 +66,7 @@ public class SpecificAiPlayerMedium extends AiPlayer{ } private boolean isValidPoint(Point point) { - return point.x >= 0 && point.x < board.getSize() && - point.y >= 0 && point.y < board.getSize(); + return point.getX() >= 0 && point.getX() < board.getSize() && + point.getY() >= 0 && point.getY() < board.getSize(); } } \ No newline at end of file diff --git a/src/startLocalGame.java b/src/startLocalGame.java index 8dcc513..ff3ca3c 100644 --- a/src/startLocalGame.java +++ b/src/startLocalGame.java @@ -1,5 +1,4 @@ import javax.swing.*; -import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; From 22950cd1558f41e641f3d8368094ae245a5c755c Mon Sep 17 00:00:00 2001 From: ole Date: Sat, 30 Nov 2024 17:07:11 +0100 Subject: [PATCH 5/6] add: Thread protection Player.java --- src/Player.java | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/src/Player.java b/src/Player.java index 9e6985e..525bbfc 100644 --- a/src/Player.java +++ b/src/Player.java @@ -11,18 +11,9 @@ public abstract class Player { this.board = new Board(size); } - public synchronized void receiveShoot(Point point) { - HitResponse hitResponse = board.getHitResponsOnPoint(point); - if (!(hitResponse == null)){ - enemy.receiveHit(hitResponse); - } else { - enemy.receiveHit(this.board.hit(point)); - } - } + public abstract void receiveShoot(Point point); - public synchronized void receiveHit(HitResponse hitResponse) { - enemy.board.addHits(hitResponse); - } + public abstract void receiveHit(HitResponse hitResponse); public void click(Point point) { From 6a4e157605299fa42b25b3fd5cffd1c6a5d4132b Mon Sep 17 00:00:00 2001 From: ole Date: Sat, 30 Nov 2024 17:09:44 +0100 Subject: [PATCH 6/6] add: Network implementation --- src/HitResponse.java | 14 ++++++++++++++ src/LocalPlayer.java | 16 +++++++++++++++- src/OnlinePlayer.java | 9 ++++++++- src/OnlinePlayer_1_1_0.java | 38 +++++++++++++++++++++++++++++++++++++ 4 files changed, 75 insertions(+), 2 deletions(-) diff --git a/src/HitResponse.java b/src/HitResponse.java index 8f1d8ad..89f713a 100644 --- a/src/HitResponse.java +++ b/src/HitResponse.java @@ -8,6 +8,15 @@ public class HitResponse { this.type = type; this.point = point; } + + public HitResponse (int typeIndex, Point point) { + if (typeIndex >= 0 && typeIndex < HitResponseType.values().length) { + this.type = HitResponseType.values()[typeIndex]; + this.point = point; + } else { + throw new IllegalArgumentException(); + } + } public HitResponseType getHitResponse() { return this.type; @@ -20,4 +29,9 @@ public class HitResponse { public void setType(HitResponseType type) { this.type = type; } + + @Override + public String toString() { + return this.getPoint().toString() + " " + this.type.ordinal(); + } } diff --git a/src/LocalPlayer.java b/src/LocalPlayer.java index cfa7cab..8e13a7a 100644 --- a/src/LocalPlayer.java +++ b/src/LocalPlayer.java @@ -3,6 +3,20 @@ public class LocalPlayer extends Player { LocalPlayer(int size) { super(size); } - + + @Override + public synchronized void receiveShoot(Point point) { + HitResponse hitResponse = board.getHitResponsOnPoint(point); + if (!(hitResponse == null)){ + enemy.receiveHit(hitResponse); + } else { + enemy.receiveHit(this.board.hit(point)); + } + } + + @Override + public synchronized void receiveHit(HitResponse hitResponse) { + enemy.board.addHits(hitResponse); + } } \ No newline at end of file diff --git a/src/OnlinePlayer.java b/src/OnlinePlayer.java index f3aaaf8..df62263 100644 --- a/src/OnlinePlayer.java +++ b/src/OnlinePlayer.java @@ -1,12 +1,19 @@ public abstract class OnlinePlayer extends Player implements AsyncSocketListener{ - private AsyncSocket socket; + protected AsyncSocket socket; public OnlinePlayer(int size, AsyncSocket socket) { super(size); this.socket = socket; + socket.setHandler(this); //TODO Auto-generated constructor stub } public abstract void receive(String message); + @Override + public abstract void receiveShoot(Point point); + + @Override + public abstract void receiveHit(HitResponse hitResponse); + } diff --git a/src/OnlinePlayer_1_1_0.java b/src/OnlinePlayer_1_1_0.java index b199952..d14e197 100644 --- a/src/OnlinePlayer_1_1_0.java +++ b/src/OnlinePlayer_1_1_0.java @@ -5,11 +5,49 @@ public class OnlinePlayer_1_1_0 extends OnlinePlayer { super(size, socket); } + + @Override public void receive(String message) { SocketPackage p = new SocketPackage(message); // TODO: parse package + switch (p.getName()) { + case "SHOOT": + if (Point.isValidSyntax(p.getData())){ + Point point = new Point(p.getData()); + this.enemy.receiveShoot(point); + } + break; + + case "HIT": + List data = p.splitData(); + if (data.size()==2){ + Point point = new Point(data.get(0)); + int typeIndex = Integer.parseInt(data.get(1)); + if (Point.isValidSyntax(data.get(0)) && typeIndex >= 0 && typeIndex < HitResponseType.values().length){ + this.enemy.receiveHit(new HitResponse(typeIndex, point)); + } + } + break; + + case "CHAT": + //TODO CHAT + break; + + default: + //nichts passier da Paket ungültig + break; + } } + @Override + public synchronized void receiveShoot(Point point){ + super.socket.send(new SocketPackage("SHOOT",point.toString())); + } + + @Override + public synchronized void receiveHit(HitResponse hitResponse) { + super.socket.send(new SocketPackage("HIT", hitResponse.toString())); + } } \ No newline at end of file