Repository navigation
Expand file tree
/
Copy pathrooms.js
More file actions
41 lines (36 loc) · 1.53 KB
/
Copy pathrooms.js
File metadata and controls
41 lines (36 loc) · 1.53 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
// rooms.js — Server-Spiellogik für den Online-Modus. Reine Datenlogik ohne
// Transport (WebSocket-Verkabelung liegt in server.js). Nutzt die geteilte Engine.
import { createBoard, applyMove, canPlace, other, P1, SIZES, DEFAULT_SIZE } from "./public/engine.js";
// Codealphabet ohne leicht verwechselbare Zeichen (0/O, 1/I).
const ALPHABET = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789";
export function genCode(len = 4) {
let s = "";
for (let i = 0; i < len; i++) s += ALPHABET[(Math.random() * ALPHABET.length) | 0];
return s;
}
export function newGame(size = DEFAULT_SIZE) {
const s = SIZES.includes(size) ? size : DEFAULT_SIZE;
return { board: createBoard(s), current: P1, moves: 0, gameOver: false, winner: null };
}
/**
* Versucht einen Zug für `player`. Validiert Reihenfolge, Feldbelegung und Regeln.
* @returns {{frames}} bei Erfolg, sonst {error}
*/
export function tryMove(game, player, r, c) {
if (game.gameOver) return { error: "Spiel ist beendet" };
if (player !== game.current) return { error: "Du bist nicht am Zug" };
const n = game.board.length;
if (!Number.isInteger(r) || !Number.isInteger(c) ||
r < 0 || c < 0 || r >= n || c >= n) return { error: "Ungültiges Feld" };
if (!canPlace(game.board, r, c, player)) return { error: "Ungültiges Feld" };
const res = applyMove(game.board, player, r, c, game.moves >= 1);
game.board = res.board;
game.moves += 1;
if (res.winner) {
game.gameOver = true;
game.winner = res.winner;
} else {
game.current = other(player);
}
return { frames: res.frames };
}