From dec8fa1710eb93bb6d0cd16d46aa731a76aba67d Mon Sep 17 00:00:00 2001 From: Simon Oberzier Date: Mon, 9 Feb 2026 22:34:11 +0100 Subject: [PATCH] Swap on reset --- public/index.html | 296 ++++++++++++++++++++++------------------------ server.js | 109 +++++++---------- 2 files changed, 187 insertions(+), 218 deletions(-) diff --git a/public/index.html b/public/index.html index 9b0b704..3b59099 100644 --- a/public/index.html +++ b/public/index.html @@ -4,62 +4,70 @@ - Wolf & Schafe | Rough Edition + Wolf & Schafe | Pro -
-
+
- DEINE ROLLE: +
RAUM: ...
...
-
Laden...
+
Laden...
@@ -205,123 +217,97 @@
- - - + + +
diff --git a/server.js b/server.js index 02329b7..564239d 100644 --- a/server.js +++ b/server.js @@ -9,67 +9,26 @@ app.use(express.static("public")); const server = http.createServer(app); const wss = new WebSocket.Server({ server }); -const board_wolf = { - 0: [1, 2, 3], 1: [0, 2, 4, 5], 2: [0, 1, 3, 5], 3: [0, 2, 5, 6], 4: [1, 5, 7], - 5: [1, 2, 3, 4, 6, 7, 8, 9], 6: [3, 5, 9], 7: [4, 5, 8, 10], 8: [5, 7, 9, 10], - 9: [5, 6, 8, 10], 10: [7, 8, 9] -}; - -const board_sheep = { - 0: [1, 2, 3], 1: [2, 4, 5], 2: [1, 3, 5], 3: [2, 5, 6], 4: [5, 7], - 5: [4, 6, 7, 8, 9], 6: [5, 9], 7: [8, 10], 8: [7, 9, 10], 9: [8, 10], 10: [] -}; +const board_wolf = { 0: [1, 2, 3], 1: [0, 2, 4, 5], 2: [0, 1, 3, 5], 3: [0, 2, 5, 6], 4: [1, 5, 7], 5: [1, 2, 3, 4, 6, 7, 8, 9], 6: [3, 5, 9], 7: [4, 5, 8, 10], 8: [5, 7, 9, 10], 9: [5, 6, 8, 10], 10: [7, 8, 9] }; +const board_sheep = { 0: [1, 2, 3], 1: [2, 4, 5], 2: [1, 3, 5], 3: [2, 5, 6], 4: [5, 7], 5: [4, 6, 7, 8, 9], 6: [5, 9], 7: [8, 10], 8: [7, 9, 10], 9: [8, 10], 10: [] }; const rooms = {}; function broadcast(roomId) { const room = rooms[roomId]; if (!room) return; - const msg = JSON.stringify({ type: "state", game: room.game }); + room.players.forEach(p => { - if (p.ws && p.ws.readyState === WebSocket.OPEN) p.ws.send(msg); + if (p.ws && p.ws.readyState === WebSocket.OPEN) { + p.ws.send(JSON.stringify({ + type: "state", + game: room.game, + yourRole: p.role + })); + } }); } -function checkWinConditions(game) { - if (game.wolf === 0) return "wolf"; - if (game.moveCount >= 40) return "wolf"; - - const canWolfMove = board_wolf[game.wolf].some(to => !game.sheep.includes(to)); - const canSheepMove = game.sheep.some(from => - board_sheep[from].some(to => to !== game.wolf && !game.sheep.includes(to)) - ); - - if (!canWolfMove) return "sheep"; - if (!canSheepMove && game.turn === "sheep") return "wolf"; - return null; -} - -function handleMove(roomId, role, { from, to }) { - const room = rooms[roomId]; - if (!room || room.game.winner) return; - const game = room.game; - if (game.turn !== role) return; - - const allowed = (role === "wolf") ? board_wolf[from] : board_sheep[from]; - if (!allowed?.includes(to)) return; - if (game.sheep.includes(to) || game.wolf === to) return; - - if (role === "wolf") { - if (from !== game.wolf) return; - game.wolf = to; - game.turn = "sheep"; - } else { - const i = game.sheep.indexOf(from); - if (i === -1) return; - game.sheep[i] = to; - game.turn = "wolf"; - } - game.moveCount++; - game.winner = checkWinConditions(game); - broadcast(roomId); -} - wss.on("connection", (ws, req) => { const urlParams = new URLSearchParams(req.url.split('?')[1]); let roomId = urlParams.get("room"); @@ -79,7 +38,8 @@ wss.on("connection", (ws, req) => { if (!roomId) roomId = randomBytes(3).toString("hex"); rooms[roomId] = { game: { wolf: 5, sheep: [0, 1, 3], turn: "sheep", moveCount: 0, winner: null }, - players: [] + players: [], + nextFirstRole: "sheep" // Tracks who should be sheep next game }; } @@ -93,35 +53,58 @@ wss.on("connection", (ws, req) => { } if (player) { - player.ws = ws; // Re-attach new socket to existing session + player.ws = ws; } else { - const role = room.players.length === 0 ? "sheep" : "wolf"; + // Assign role based on who is already there + const role = room.players.length === 0 ? room.nextFirstRole : (room.nextFirstRole === "sheep" ? "wolf" : "sheep"); player = { ws, role, sessionId }; room.players.push(player); } - ws.send(JSON.stringify({ type: "role", role: player.role, roomId })); + ws.send(JSON.stringify({ type: "init", role: player.role, roomId })); broadcast(roomId); ws.on("message", msg => { - let data; - try { data = JSON.parse(msg); } catch { return; } + let data = JSON.parse(msg); if (data.type === "restart") { + // Swap roles for the next round + room.players.forEach(p => p.role = (p.role === "wolf" ? "sheep" : "wolf")); room.game = { wolf: 5, sheep: [0, 1, 3], turn: "sheep", moveCount: 0, winner: null }; broadcast(roomId); } else if (data.type === "leave") { room.players = room.players.filter(p => p.sessionId !== sessionId); if (room.players.length === 0) delete rooms[roomId]; - ws.close(); } else { handleMove(roomId, player.role, data); } }); - - ws.on("close", () => { - // We don't remove the player here so they can reconnect on refresh - }); }); -server.listen(3030, () => console.log("Server läuft auf Port 3030")); \ No newline at end of file +// Reuse the handleMove and checkWinConditions from previous scripts... +function checkWinConditions(game) { + if (game.wolf === 0) return "wolf"; + if (game.moveCount >= 40) return "wolf"; + const canWolfMove = board_wolf[game.wolf].some(to => !game.sheep.includes(to)); + const canSheepMove = game.sheep.some(from => board_sheep[from].some(to => to !== game.wolf && !game.sheep.includes(to))); + if (!canWolfMove) return "sheep"; + if (!canSheepMove && game.turn === "sheep") return "wolf"; + return null; +} + +function handleMove(roomId, role, { from, to }) { + const room = rooms[roomId]; + if (!room || room.game.winner || room.game.turn !== role) return; + const game = room.game; + const allowed = (role === "wolf") ? board_wolf[from] : board_sheep[from]; + if (!allowed?.includes(to) || game.sheep.includes(to) || game.wolf === to) return; + + if (role === "wolf") { game.wolf = to; game.turn = "sheep"; } + else { game.sheep[game.sheep.indexOf(from)] = to; game.turn = "wolf"; } + + game.moveCount++; + game.winner = checkWinConditions(game); + broadcast(roomId); +} + +server.listen(3030); \ No newline at end of file