Skip to content
Snippets Groups Projects
Commit 46b4e37d authored by Simon Peter Marneros's avatar Simon Peter Marneros
Browse files

Server.java

parent 8cc55c1e
No related branches found
No related tags found
No related merge requests found
import java.io.*;
import java.net.*;
import java.util.*;
import java.util.concurrent.*;
public class Server {
private static final int PORT = 12345;
private static final int MAX_PLAYERS = 2;
private static volatile boolean isSinglePlayer = false;
private static List<ClientHandler> clients = new CopyOnWriteArrayList<>();
private static GameState gameState = new GameState();
private static volatile boolean isGameStarted = false;
public static void main(String[] args) {
System.out.println("Server started...");
try (ServerSocket serverSocket = new ServerSocket(PORT)) {
while (true) {
Socket clientSocket = serverSocket.accept();
ClientHandler clientHandler = new ClientHandler(clientSocket, clients.size() + 1);
clients.add(clientHandler);
new Thread(clientHandler).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
private static synchronized void startGame() {
if (!isGameStarted) {
isGameStarted = true;
gameState.startGame(isSinglePlayer);
broadcastGameState();
new Thread(Server::gameLoop).start();
}
}
private static void gameLoop() {
while (isGameStarted) {
gameState.update();
broadcastGameState();
try {
Thread.sleep(33); // ~30 FPS
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static synchronized void broadcastGameState() {
String state = gameState.toString();
for (ClientHandler client : clients) {
client.sendGameState(state);
}
}
public static synchronized void restartGame() {
gameState = new GameState();
isSinglePlayer = false;
isGameStarted = false;
gameState.startGame(isSinglePlayer);
broadcastGameState();
}
static class ClientHandler implements Runnable {
private Socket socket;
private PrintWriter out;
private BufferedReader in;
private int playerNumber;
public ClientHandler(Socket socket, int playerNumber) {
this.socket = socket;
this.playerNumber = playerNumber;
}
@Override
public void run() {
try {
out = new PrintWriter(socket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out.println("ID:PLAYER" + playerNumber);
String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println("Received: " + inputLine);
processInput(inputLine);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
clients.remove(this);
if (clients.isEmpty()) {
restartGame();
}
}
}
private synchronized void processInput(String input) {
String[] parts = input.split(":");
String playerId = parts[0];
String command = parts.length > 1 ? parts[1] : input;
switch (command) {
case "SINGLEPLAYER":
System.out.println("Starting single player game");
isSinglePlayer = true;
startGame();
break;
case "MULTIPLAYER":
System.out.println("Waiting for players... Current count: " + clients.size());
if (clients.size() == MAX_PLAYERS || (isSinglePlayer && clients.size() == 1)) {
System.out.println("Starting multiplayer game");
startGame();
}
break;
case "MOVE":
if (parts.length == 3) {
String direction = parts[2];
System.out.println("Moving player " + playerId + " " + direction);
gameState.movePlayer(playerId, direction);
broadcastGameState();
} else {
System.out.println("Invalid move command: " + input);
}
break;
case "RESTART":
restartGame();
break;
default:
System.out.println("Invalid input: " + input);
break;
}
}
public void sendGameState(String state) {
out.println(state);
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment