feat: Hex Wars - zufällige Startecken
This commit is contained in:
@@ -45,10 +45,17 @@ const T_MINE = 2;
|
||||
const T_ROCK = 3;
|
||||
|
||||
// ── Terrain generieren ────────────────────────────────────────────────────────
|
||||
function generateTerrain() {
|
||||
function generateTerrain(ownerHead, oppHead) {
|
||||
const t = Array(GRID).fill(null).map(() => Array(GRID).fill(T_NORMAL));
|
||||
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 = [];
|
||||
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 ───────────────────────────────────────────────────────────
|
||||
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));
|
||||
g[0][0] = ownerId;
|
||||
g[GRID-1][GRID-1] = oppId;
|
||||
return g;
|
||||
g[or][oc] = ownerId;
|
||||
g[pr][pc] = oppId;
|
||||
return { grid:g, ownerHead:`${or},${oc}`, oppHead:`${pr},${pc}` };
|
||||
}
|
||||
|
||||
// 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);
|
||||
if (!opp) return res.status(404).json({ error: 'Benutzer nicht gefunden' });
|
||||
|
||||
const grid = createGrid(me, Number(opponent_id));
|
||||
const terrain = generateTerrain();
|
||||
const { grid, ownerHead, oppHead } = createGrid(me, Number(opponent_id));
|
||||
const terrain = generateTerrain(ownerHead, oppHead);
|
||||
|
||||
const result = db.prepare(`
|
||||
INSERT INTO geo_games (owner_id, opponent_id, grid, terrain, current_turn, move_count, owner_head, opp_head)
|
||||
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';
|
||||
sendPush(Number(opponent_id), '⬡ Hex Wars', `${myName} hat dich zu einem Spiel eingeladen! Du bist zuerst dran.`);
|
||||
|
||||
Reference in New Issue
Block a user