minesweeper-game.tsx
minesweeper-game.tsx
const DIFFICULTY_LEVELS = {
beginner: {
rows: 9,
cols: 9,
mines: 10,
name: 'Principiante',
cellSize: 'w-7 h-7'
},
intermediate: {
rows: 16,
cols: 16,
mines: 40,
name: 'Intermedio',
cellSize: 'w-5 h-5'
},
expert: {
rows: 16,
cols: 30,
mines: 99,
name: 'Experto',
cellSize: 'w-4 h-4'
}
};
return (
<button
className={`${cellSize} border border-gray-400 flex items-center justify-
center font-bold ${getBackgroundColor()} hover:bg-gray-200 ${getFontSize()}`}
onClick={onClick}
>
{getCellContent()}
</button>
);
};
setDifficulty(selectedDifficulty);
setGrid(newGrid);
setRevealed(newRevealed);
setFlagged(newFlagged);
setGameOver(false);
setGameWon(false);
setFirstClick(true);
setFlagMode(false);
}, []);
const returnToMenu = () => {
setDifficulty(null);
};
const isSafe = safeZone.some(([r, c]) => r === row && c === col);
setGrid(newGrid);
if (grid[row][col] === 0) {
for (let i = -1; i <= 1; i++) {
for (let j = -1; j <= 1; j++) {
revealCellAndNeighbors(grid, revealed, row + i, col + j);
}
}
}
};
if (flagMode) {
if (!revealed[row][col]) {
const newFlagged = [...flagged];
newFlagged[row][col] = !newFlagged[row][col];
setFlagged(newFlagged);
}
} else {
if (!flagged[row][col]) {
if (firstClick) {
setFirstClick(false);
placeMines(row, col);
} else {
revealCell(row, col);
}
}
}
};
React.useEffect(() => {
if (difficulty) {
initializeGame(difficulty);
}
}, [difficulty, initializeGame]);
if (!difficulty) {
return <WelcomeScreen onStartGame={initializeGame} />;
}
return (
<div className="flex flex-col items-center gap-4">
<div className="flex items-center w-full justify-between px-4">
<button
className="flex items-center gap-2 text-blue-500 hover:text-blue-600"
onClick={returnToMenu}
>
<ArrowLeft size={20} />
Volver al menú
</button>
<div className="text-2xl font-bold">
{config.name}
</div>
</div>
<button
className="mt-4 px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600"
onClick={() => initializeGame(difficulty)}
>
Nuevo Juego
</button>