Compare commits
15 Commits
84865e5468
...
00df38dd7a
Author | SHA1 | Date |
---|---|---|
|
00df38dd7a | |
|
f397803b64 | |
|
adac40156a | |
|
663991e418 | |
|
5cf8befdc1 | |
|
ffa04a50cb | |
|
21563dd469 | |
|
7f5e031574 | |
|
44f2b0f0f1 | |
|
9ab97b5f0c | |
|
c55a62663e | |
|
b958ffd6b9 | |
|
6a57a6e1ff | |
|
9ff0958fbc | |
|
6118d480d9 |
|
@ -1,27 +1,86 @@
|
|||
import java.io.BufferedReader;
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.io.PrintWriter;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.ServerSocket;
|
||||
import java.net.Socket;
|
||||
|
||||
public class AsyncSocket {
|
||||
private Socket socket;
|
||||
private Thread checkerThread;
|
||||
private Thread connectorThread;
|
||||
private AsyncSocketListener handler;
|
||||
private boolean shouldStop = false;
|
||||
|
||||
private String sendBuffer = "";
|
||||
|
||||
private BufferedReader in;
|
||||
private PrintWriter out;
|
||||
private BufferedWriter out;
|
||||
|
||||
public AsyncSocket(int port, AsyncSocketListener handler) {
|
||||
this.setHandler(handler);
|
||||
|
||||
// start server in new thread
|
||||
this.connectorThread = new Thread(() -> {
|
||||
try {
|
||||
ServerSocket serverSocket = new ServerSocket(port);
|
||||
|
||||
System.out.println("Waiting for client connection on port " + port);
|
||||
|
||||
Socket socket = serverSocket.accept();
|
||||
|
||||
System.out.println("Socket connected.");
|
||||
|
||||
serverSocket.close();
|
||||
|
||||
this.initSocket(socket);
|
||||
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
// TODO: proper error handling
|
||||
}
|
||||
});
|
||||
this.connectorThread.start();
|
||||
}
|
||||
|
||||
public AsyncSocket(InetSocketAddress address, AsyncSocketListener handler) {
|
||||
this.setHandler(handler);
|
||||
|
||||
// start client in new thread
|
||||
this.connectorThread = new Thread(() -> {
|
||||
System.out.println("Connecting to " + address.toString());
|
||||
|
||||
Socket socket = new Socket();
|
||||
try {
|
||||
socket.connect(address, 10);
|
||||
System.out.println("Socket connected.");
|
||||
|
||||
this.initSocket(socket);
|
||||
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
throw new RuntimeException("Connection timed out");
|
||||
}
|
||||
|
||||
});
|
||||
this.connectorThread.start();
|
||||
}
|
||||
|
||||
public AsyncSocket(Socket socket, AsyncSocketListener handler) throws IOException {
|
||||
this.setHandler(handler);
|
||||
this.initSocket(socket);
|
||||
}
|
||||
|
||||
private void initSocket(Socket socket) throws IOException {
|
||||
System.out.println("Initialising sockets");
|
||||
this.socket = socket;
|
||||
|
||||
this.in = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
|
||||
this.out = new PrintWriter(new OutputStreamWriter(this.socket.getOutputStream()));
|
||||
|
||||
this.handler = handler;
|
||||
this.out = new BufferedWriter(new OutputStreamWriter(this.socket.getOutputStream()));
|
||||
|
||||
this.shouldStop = false;
|
||||
this.checkerThread = new Thread(() -> {
|
||||
while (!this.shouldStop) {
|
||||
try {
|
||||
|
@ -29,21 +88,38 @@ public class AsyncSocket {
|
|||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
if (!this.connectorThread.isAlive()) {
|
||||
try {
|
||||
this.connectorThread.join();
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
if (!this.in.ready()) continue;
|
||||
if (this.handler == null) continue;
|
||||
if (!this.in.ready()) {
|
||||
continue;
|
||||
}
|
||||
if (this.handler == null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
String message = this.in.readLine();
|
||||
if (message.length() <= 0) continue;
|
||||
|
||||
|
||||
message = message.strip();
|
||||
System.out.println("RECEIVED - " + message);
|
||||
this.handler.receive(message);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
});
|
||||
System.out.println("starting checker thread");
|
||||
this.checkerThread.start();
|
||||
this.flushBuffer();
|
||||
}
|
||||
|
||||
public void setHandler(AsyncSocketListener handler) {
|
||||
|
@ -51,21 +127,36 @@ public class AsyncSocket {
|
|||
}
|
||||
|
||||
|
||||
public void send(SocketPackage socketPackage) {
|
||||
public synchronized void send(SocketPackage socketPackage) {
|
||||
this.sendLine(socketPackage.toString());
|
||||
}
|
||||
public void send(String packageName) {
|
||||
public synchronized void send(String packageName) {
|
||||
this.send(packageName, "");
|
||||
}
|
||||
public void send(String packageName, String packageContent) {
|
||||
public synchronized void send(String packageName, String packageContent) {
|
||||
if (packageContent.length() > 0) {
|
||||
packageContent = " " + packageContent;
|
||||
}
|
||||
this.sendLine(packageName + packageContent);
|
||||
}
|
||||
|
||||
public void sendLine(String message) {
|
||||
this.out.print(message + "\r\n");
|
||||
public synchronized void sendLine(String message) {
|
||||
sendBuffer = sendBuffer + message + "\r\n";
|
||||
this.flushBuffer();
|
||||
}
|
||||
|
||||
private synchronized void flushBuffer() {
|
||||
if (!this.sendBuffer.isEmpty() && this.out != null) {
|
||||
try {
|
||||
this.out.write(sendBuffer);
|
||||
System.out.println("SENT - " + sendBuffer);
|
||||
sendBuffer = "";
|
||||
this.out.flush();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
// TODO: handle writing error
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void close() {
|
||||
|
@ -73,8 +164,11 @@ public class AsyncSocket {
|
|||
|
||||
try {
|
||||
this.socket.close();
|
||||
this.checkerThread.join();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,4 +1,5 @@
|
|||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class Board {
|
||||
|
@ -10,6 +11,8 @@ public class Board {
|
|||
|
||||
public Board(int size) {
|
||||
this.size = size;
|
||||
this.ships = new ArrayList<>();
|
||||
this.hits = new ArrayList<>();
|
||||
this.createShip(size - 13);
|
||||
}
|
||||
|
||||
|
|
|
@ -22,6 +22,7 @@ public class BoardDisplay extends JPanel {
|
|||
public BoardDisplay(int gridSize, Player player) {
|
||||
super(new GridLayout(gridSize + 1, gridSize + 1)); // +1 wegen extra Zeile/Splate
|
||||
this.fields = new JButton[gridSize][gridSize];
|
||||
this.ships = new ArrayList<>();
|
||||
// Erstellung von Spielfeld
|
||||
for (int i = 0; i <= gridSize; i++) {
|
||||
for (int j = 0; j <= gridSize; j++) {
|
||||
|
@ -66,6 +67,7 @@ public class BoardDisplay extends JPanel {
|
|||
@Override
|
||||
public void mouseClicked(MouseEvent e) {
|
||||
Point o= new Point(finalI, finalJ);
|
||||
System.out.println(o);
|
||||
handleFieldClick(field, o,player);
|
||||
}
|
||||
});
|
||||
|
@ -100,6 +102,16 @@ public class BoardDisplay extends JPanel {
|
|||
}
|
||||
}
|
||||
|
||||
/*private boolean placeable(Ship ship,Point o, boolean horizontal) {
|
||||
if (horizontal && (o.getX() + ship.getSize() > gridSize)) { // Fehler
|
||||
return false;
|
||||
}
|
||||
if (!horizontal && (o.getY() + ship.getSize() > gridSize)) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}*/
|
||||
|
||||
/**
|
||||
* TODO Funktion beschreiben etc.
|
||||
* @param ship
|
||||
|
@ -107,16 +119,29 @@ public class BoardDisplay extends JPanel {
|
|||
* @param horizontal
|
||||
* @return
|
||||
*/
|
||||
private boolean placeable(Ship ship,Point o, boolean horizontal) {
|
||||
private boolean placeable(Ship ship, Point o, boolean horizontal) {
|
||||
if (horizontal && (o.getX() + ship.getSize() > gridSize)) {
|
||||
return false;
|
||||
}
|
||||
if (!horizontal && (o.getY() + ship.getSize() > gridSize)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Prüfen auf Kollision mit bestehenden Schiffen
|
||||
for (Ship other : ships) {
|
||||
for (Point p : other.getOccupiedPoints()) {
|
||||
for (Point newP : ship.getOccupiedPoints()) {
|
||||
if (p.equals(newP)) {
|
||||
return false; // Überschneidung gefunden
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
private void selectShip(MouseEvent e) {
|
||||
Ship current = (Ship) e.getSource();
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
//import javafx.scene.control.ToggleGroup;
|
||||
// import javafx.scene.control.ToggleGroup;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
import java.io.IOException;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.ServerSocket;
|
||||
import java.net.Socket;
|
||||
import java.net.SocketTimeoutException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
@ -25,6 +22,9 @@ public class GameController {
|
|||
public static int semesterToBoardSize(int semester) {
|
||||
return semester + 13;
|
||||
}
|
||||
public static int boardSizeToSemester(int size) {
|
||||
return size - 13;
|
||||
}
|
||||
|
||||
public static HashMap<String, Class<? extends OnlinePlayer>> supportedVersions = new HashMap<>(Map.of(
|
||||
"1.1.0", OnlinePlayer_1_1_0.class
|
||||
|
@ -33,34 +33,15 @@ public class GameController {
|
|||
public static void startOnlineGame(Class<? extends LocalPlayer> localPlayerClass, String localPlayerName, InetSocketAddress address, int size) throws IOException {
|
||||
AsyncSocket clientSocket;
|
||||
|
||||
boolean localPlayerIsServer = address.getHostName() == null;
|
||||
boolean localPlayerIsServer = address.getHostName() == null || address.getHostName().isEmpty() || address.getHostName().equals("0.0.0.0");
|
||||
|
||||
if (localPlayerIsServer) {
|
||||
// SERVER MODE
|
||||
clientSocket = new AsyncSocket(address.getPort(), null);
|
||||
|
||||
ServerSocket serverSocket = new ServerSocket(address.getPort());
|
||||
|
||||
System.out.println("Waiting for client connection...");
|
||||
|
||||
clientSocket = new AsyncSocket(serverSocket.accept(), null);
|
||||
|
||||
serverSocket.close();
|
||||
} else {
|
||||
// CLIENT MODE
|
||||
|
||||
Socket socket = new Socket();
|
||||
|
||||
try {
|
||||
socket.connect(address, CONNECTION_TIMEOUT);
|
||||
|
||||
clientSocket = new AsyncSocket(socket, null);
|
||||
} catch (SocketTimeoutException e) {
|
||||
e.printStackTrace();
|
||||
throw new RuntimeException("Connection timed out");
|
||||
} finally {
|
||||
socket.close();
|
||||
}
|
||||
|
||||
clientSocket = new AsyncSocket(address, null);
|
||||
}
|
||||
|
||||
clientSocket.send("VERSION", "Gruppe03 " + String.join(" ", supportedVersions.keySet()));
|
||||
|
@ -84,7 +65,7 @@ public class GameController {
|
|||
OnlinePlayer onlinePlayer;
|
||||
try {
|
||||
localPlayer = localPlayerClass.getDeclaredConstructor().newInstance();
|
||||
onlinePlayer = onlinePlayerClass.getDeclaredConstructor().newInstance((Integer)size, clientSocket);
|
||||
onlinePlayer = onlinePlayerClass.getDeclaredConstructor(Integer.class, AsyncSocket.class).newInstance((Integer)size, clientSocket);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
throw new RuntimeException("Unable to instantiate players");
|
||||
|
@ -93,7 +74,7 @@ public class GameController {
|
|||
localPlayer.isServer = localPlayerIsServer;
|
||||
onlinePlayer.isServer = !localPlayerIsServer;
|
||||
|
||||
startGameWithInstancedPlayers(localPlayer, onlinePlayer);
|
||||
startGameWithInstancedPlayers(localPlayer, onlinePlayer, size);
|
||||
|
||||
} else {
|
||||
throw new RuntimeException("Unexpected Package received before game initialisation");
|
||||
|
@ -178,13 +159,15 @@ public class GameController {
|
|||
localPlayer.createBoard(size);
|
||||
aiPlayer.createBoard(size);
|
||||
|
||||
startGameWithInstancedPlayers(localPlayer, aiPlayer);
|
||||
startGameWithInstancedPlayers(localPlayer, aiPlayer, size);
|
||||
}
|
||||
|
||||
private static void startGameWithInstancedPlayers(LocalPlayer p1, Player p2) {
|
||||
private static void startGameWithInstancedPlayers(LocalPlayer p1, Player p2, int boardSize) {
|
||||
p1.setEnemy(p2);
|
||||
p2.setEnemy(p1);
|
||||
|
||||
mainFrame.showPanelSLG("GameBoard", boardSizeToSemester(boardSize), p1, p2);
|
||||
|
||||
// TODO: frontend configuration
|
||||
}
|
||||
|
||||
|
|
|
@ -25,6 +25,9 @@ public class MainFrame extends JFrame {
|
|||
* Ermöglicht es Panel anzuzeigen.
|
||||
*/
|
||||
public MainFrame() {
|
||||
|
||||
GameController.setMainFrame(this);
|
||||
|
||||
setTitle("Studium Versenken");
|
||||
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||
setSize(1500, 1000);
|
||||
|
|
|
@ -4,7 +4,7 @@ public abstract class OnlinePlayer extends Player implements AsyncSocketListener
|
|||
|
||||
protected boolean hasReceivedCoinPackage;
|
||||
|
||||
public OnlinePlayer(int size, AsyncSocket socket) {
|
||||
public OnlinePlayer(Integer size, AsyncSocket socket) {
|
||||
this.socket = socket;
|
||||
this.wantedBoardSize = size;
|
||||
socket.setHandler(this);
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import java.util.List;
|
||||
|
||||
public class OnlinePlayer_1_1_0 extends OnlinePlayer {
|
||||
public OnlinePlayer_1_1_0(int size, AsyncSocket socket) {
|
||||
public OnlinePlayer_1_1_0(Integer size, AsyncSocket socket) {
|
||||
super(size, socket);
|
||||
}
|
||||
|
||||
|
|
|
@ -28,7 +28,7 @@ public class SoundHandler {
|
|||
}
|
||||
}
|
||||
}).start();
|
||||
|
||||
// TODO: kill zombies
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue