feat: Hex Wars - Kettenexplosionen, Felder werden zu Felsen
This commit is contained in:
@@ -126,20 +126,49 @@ function calcScore(grid, terrain, playerId) {
|
|||||||
|
|
||||||
// ── Minenexplosion: alle 8 Nachbarn der Mine werden zerstört ─────────────────
|
// ── Minenexplosion: alle 8 Nachbarn der Mine werden zerstört ─────────────────
|
||||||
// Gibt zurück: { grid, destroyedByOwner, destroyedByOpp, blastCells }
|
// Gibt zurück: { grid, destroyedByOwner, destroyedByOpp, blastCells }
|
||||||
function explodeMine(grid, terrain, row, col, ownerId, oppId) {
|
// Kettenexplosion: Mine explodiert, alle 8 Nachbarn werden zu Felsen.
|
||||||
|
// Wenn ein Nachbar auch eine Mine ist, explodiert diese ebenfalls (rekursiv).
|
||||||
|
// exploded = Set von bereits gezündeten Minen-Positionen (verhindert Endlosschleife)
|
||||||
|
function explodeMine(grid, terrain, row, col, ownerId, oppId, exploded = new Set()) {
|
||||||
|
const key = `${row},${col}`;
|
||||||
|
if (exploded.has(key)) return { destroyedByOwner:0, destroyedByOpp:0, blastCells:[] };
|
||||||
|
exploded.add(key);
|
||||||
|
|
||||||
let destroyedByOwner = 0;
|
let destroyedByOwner = 0;
|
||||||
let destroyedByOpp = 0;
|
let destroyedByOpp = 0;
|
||||||
const blastCells = [];
|
const blastCells = [];
|
||||||
|
const chainMines = []; // Nachbar-Minen die ebenfalls zünden
|
||||||
|
|
||||||
for (const [dr,dc] of DIRS8) {
|
for (const [dr,dc] of DIRS8) {
|
||||||
const r=row+dr, c=col+dc;
|
const r=row+dr, c=col+dc;
|
||||||
if (r<0||r>=GRID||c<0||c>=GRID) continue;
|
if (r<0||r>=GRID||c<0||c>=GRID) continue;
|
||||||
const cell = grid[r][c];
|
if (terrain[r][c] === T_ROCK) continue; // bereits Felsen, überspringen
|
||||||
if (cell === ownerId) { destroyedByOwner++; grid[r][c] = 0; blastCells.push([r,c]); }
|
|
||||||
else if (cell === oppId) { destroyedByOpp++; grid[r][c] = 0; blastCells.push([r,c]); }
|
// Merke ob da eine Mine lag (BEVOR wir terrain ändern)
|
||||||
else if (cell === 0 && terrain[r][c] !== T_ROCK) { blastCells.push([r,c]); }
|
if (terrain[r][c] === T_MINE && !exploded.has(`${r},${c}`)) {
|
||||||
|
chainMines.push([r,c]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Punktabzug für besetzte Felder
|
||||||
|
if (grid[r][c] === ownerId) destroyedByOwner++;
|
||||||
|
else if (grid[r][c] === oppId) destroyedByOpp++;
|
||||||
|
|
||||||
|
// Feld wird zu Felsen
|
||||||
|
grid[r][c] = 0;
|
||||||
|
terrain[r][c] = T_ROCK;
|
||||||
|
blastCells.push([r,c]);
|
||||||
}
|
}
|
||||||
// Mine selbst wird neutral (bereits besetzt durch Spieler, bleibt als besetztes Mine-Feld)
|
|
||||||
|
// Kettenexplosionen zünden
|
||||||
|
for (const [mr,mc] of chainMines) {
|
||||||
|
// terrain[mr][mc] ist jetzt bereits T_ROCK (oben gesetzt),
|
||||||
|
// aber die Mine war dort — wir zünden sie trotzdem
|
||||||
|
const chain = explodeMine(grid, terrain, mr, mc, ownerId, oppId, exploded);
|
||||||
|
destroyedByOwner += chain.destroyedByOwner;
|
||||||
|
destroyedByOpp += chain.destroyedByOpp;
|
||||||
|
blastCells.push(...chain.blastCells);
|
||||||
|
}
|
||||||
|
|
||||||
return { destroyedByOwner, destroyedByOpp, blastCells };
|
return { destroyedByOwner, destroyedByOpp, blastCells };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ function HelpModal({ onClose }) {
|
|||||||
<div style={{ display:'grid', gridTemplateColumns:'28px 1fr', gap:'6px 10px', alignItems:'center' }}>
|
<div style={{ display:'grid', gridTemplateColumns:'28px 1fr', gap:'6px 10px', alignItems:'center' }}>
|
||||||
<span style={{ fontSize:16, textAlign:'center' }}>⬜</span><span><strong style={{ color:'rgba(255,255,255,0.9)' }}>Normales Feld</strong> — +1 Punkt</span>
|
<span style={{ fontSize:16, textAlign:'center' }}>⬜</span><span><strong style={{ color:'rgba(255,255,255,0.9)' }}>Normales Feld</strong> — +1 Punkt</span>
|
||||||
<span style={{ fontSize:16, textAlign:'center' }}>⭐</span><span><strong style={{ color:'#ffe66d' }}>Goldfeld</strong> — +3 Punkte, sehr wertvoll!</span>
|
<span style={{ fontSize:16, textAlign:'center' }}>⭐</span><span><strong style={{ color:'#ffe66d' }}>Goldfeld</strong> — +3 Punkte, sehr wertvoll!</span>
|
||||||
<span style={{ fontSize:16, textAlign:'center' }}>💣</span><span><strong style={{ color:'#ff6b9d' }}>Sprengmine</strong> — Betreten zündet eine Explosion: alle 8 umliegenden Felder werden zerstört und besetzte Felder gehen verloren. Außerdem verlierst du deinen nächsten Zug.</span>
|
<span style={{ fontSize:16, textAlign:'center' }}>💣</span><span><strong style={{ color:'#ff6b9d' }}>Sprengmine</strong> — Betreten zündet eine Explosion: alle 8 umliegenden Felder werden zu Felsen (auch Gold!). Besetzte Felder gehen verloren. Liegt eine weitere Mine im Umkreis, explodiert auch diese (Kettenreaktion!). Du verlierst deinen nächsten Zug.</span>
|
||||||
<span style={{ fontSize:16, textAlign:'center' }}>🪨</span><span><strong style={{ color:'rgba(255,255,255,0.4)' }}>Felsen</strong> — unbesetzbar, blockiert Wege</span>
|
<span style={{ fontSize:16, textAlign:'center' }}>🪨</span><span><strong style={{ color:'rgba(255,255,255,0.4)' }}>Felsen</strong> — unbesetzbar, blockiert Wege</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user