A react custom hook that provides the game logic for Minesweeper.
This hook provides the core mechanics for Minesweeper using only standard React APIs. It simplifies the integration of Minesweeper logic into your React applications.
You can play example web app here:
🌐 https://mine-sweeper.ebinas.dev/
Main hook to implement Minesweeper app.
Each method does't depend on state and was defined with useCallback
.
(You can optimize rendering with useMemo
in your app)
const {
board, // The current state of the Minesweeper board.
gameState, // The current state of the game (e.g., "initialized", "playing", "completed", "failed").
gameMode, // The current game mode (e.g., "easy", "normal", "hard").
init, // Function to select game mode & initialize the game.
restart, // Function to restart the game in same game mode.
open, // Function to open a cell.
toggleFlag, // Function to toggle a flag on a cell.
switchFlagType, // Function to switch the type of flag(e.g., 🚩, ❓).
flags, // The current number of flags used in the game.
settings // The game settings constant.
} = useMinesweeper();
type Props = {
defaultGameMode: GameMode;
};
const Example: React.FC<Props> = ({ defaultGameMode }) => {
const {
board, gameState, gameMode, init, restart, open, toggleFlag, switchFlagType, flags, settings,
} = useMinesweeper(defaultGameMode);
return (
<>
<h1>Example</h1>
<p>{`💣: ${board.meta.mines}, 🚩: ${flags.normal}, ❓: ${flags.suspected}`}</p>
{gameState === 'completed' && <p>🎉 You win!</p>}
<div>
{board.data.map((row) => {
return row.map((cell) => {
return (
<Cell key={cell.id} data={cell} open={open} toggleFlag={toggleFlag} switchFlagType={switchFlagType} />
);
});
})}
</div>
<div>
<button onClick={() => init('hard')}>Hard Mode</button>
<button onClick={restart}>Restart</button>
</div>
</>
);
};
Category | Name | Description | extra |
---|---|---|---|
Constants | GAME_MODE_LIST | A list of available game modes. | |
Helper Functions | isMine | Check if a cell is a mine. | |
isExplodedMine | Check if a cell is a flag. | ||
isMineCount | Check if a cell has a count. | renamed from isCount on v1.0.0 |
|
isEmpty | Check if a cell is empty. | ||
isOpened | Check if a cell is opened. | ||
isUnopened | Check if a cell is unopened. | ||
isFlagged | Check if a cell is flagged. (ignore flag type) | ||
Types | Minesweeper | Return type of useMinesweeper Hook | |
GameMode | Type for game modes. | ||
Board | Type for the game board. | ||
BoardConfig | Configuration type for the board. | ||
Cell | Type for individual cell data. | renamed from CellData on v1.0.0 |
This hook is derived from my Next.js application, ebinase/mine-sweeper. Its purpose is to separate the Minesweeper game logic from the UI, enabling easy implementation of Minesweeper in your projects.