feat: Hex Wars - zufällige Startecken

This commit is contained in:
2026-06-28 18:37:08 +02:00
parent b914046994
commit a6b29c38ad

View File

@@ -45,10 +45,17 @@ const T_MINE = 2;
const T_ROCK = 3; const T_ROCK = 3;
// ── Terrain generieren ──────────────────────────────────────────────────────── // ── Terrain generieren ────────────────────────────────────────────────────────
function generateTerrain() { function generateTerrain(ownerHead, oppHead) {
const t = Array(GRID).fill(null).map(() => Array(GRID).fill(T_NORMAL)); const t = Array(GRID).fill(null).map(() => Array(GRID).fill(T_NORMAL));
const safe = new Set(); const safe = new Set();
for (let r=0;r<3;r++) for (let c=0;c<3;c++) { safe.add(`${r},${c}`); safe.add(`${GRID-1-r},${GRID-1-c}`); } // 3x3 Sicherheitszone um beide Startecken
for (const headStr of [ownerHead, oppHead]) {
const [hr,hc] = headStr.split(',').map(Number);
for (let dr=-2;dr<=2;dr++) for (let dc=-2;dc<=2;dc++) {
const r=hr+dr, c=hc+dc;
if (r>=0&&r<GRID&&c>=0&&c<GRID) safe.add(`${r},${c}`);
}
}
const cells = []; const cells = [];
for (let r=0;r<GRID;r++) for (let c=0;c<GRID;c++) if (!safe.has(`${r},${c}`)) cells.push([r,c]); for (let r=0;r<GRID;r++) for (let c=0;c<GRID;c++) if (!safe.has(`${r},${c}`)) cells.push([r,c]);
@@ -78,10 +85,17 @@ function computeFog(grid, playerId) {
// ── Hilfsfunktionen ─────────────────────────────────────────────────────────── // ── Hilfsfunktionen ───────────────────────────────────────────────────────────
function createGrid(ownerId, oppId) { function createGrid(ownerId, oppId) {
const corners = [[0,0],[0,GRID-1],[GRID-1,0],[GRID-1,GRID-1]];
for (let i=corners.length-1;i>0;i--) {
const j=Math.floor(Math.random()*(i+1));
[corners[i],corners[j]]=[corners[j],corners[i]];
}
const [or,oc] = corners[0];
const [pr,pc] = corners[1];
const g = Array(GRID).fill(null).map(() => Array(GRID).fill(0)); const g = Array(GRID).fill(null).map(() => Array(GRID).fill(0));
g[0][0] = ownerId; g[or][oc] = ownerId;
g[GRID-1][GRID-1] = oppId; g[pr][pc] = oppId;
return g; return { grid:g, ownerHead:`${or},${oc}`, oppHead:`${pr},${pc}` };
} }
// Prüft ob [row,col] an den Kopf [hr,hc] angrenzt (8 Richtungen) // Prüft ob [row,col] an den Kopf [hr,hc] angrenzt (8 Richtungen)
@@ -294,13 +308,13 @@ router.post('/', authenticate, (req, res) => {
const opp = db.prepare('SELECT id, username FROM users WHERE id=?').get(opponent_id); const opp = db.prepare('SELECT id, username FROM users WHERE id=?').get(opponent_id);
if (!opp) return res.status(404).json({ error: 'Benutzer nicht gefunden' }); if (!opp) return res.status(404).json({ error: 'Benutzer nicht gefunden' });
const grid = createGrid(me, Number(opponent_id)); const { grid, ownerHead, oppHead } = createGrid(me, Number(opponent_id));
const terrain = generateTerrain(); const terrain = generateTerrain(ownerHead, oppHead);
const result = db.prepare(` const result = db.prepare(`
INSERT INTO geo_games (owner_id, opponent_id, grid, terrain, current_turn, move_count, owner_head, opp_head) INSERT INTO geo_games (owner_id, opponent_id, grid, terrain, current_turn, move_count, owner_head, opp_head)
VALUES (?, ?, ?, ?, ?, 0, ?, ?) VALUES (?, ?, ?, ?, ?, 0, ?, ?)
`).run(me, Number(opponent_id), JSON.stringify(grid), JSON.stringify(terrain), me, '0,0', `${GRID-1},${GRID-1}`); `).run(me, Number(opponent_id), JSON.stringify(grid), JSON.stringify(terrain), me, ownerHead, oppHead);
const myName = db.prepare('SELECT username FROM users WHERE id=?').get(me)?.username || 'Jemand'; const myName = db.prepare('SELECT username FROM users WHERE id=?').get(me)?.username || 'Jemand';
sendPush(Number(opponent_id), '⬡ Hex Wars', `${myName} hat dich zu einem Spiel eingeladen! Du bist zuerst dran.`); sendPush(Number(opponent_id), '⬡ Hex Wars', `${myName} hat dich zu einem Spiel eingeladen! Du bist zuerst dran.`);