import { useGame, version, calculateMazeScore } from "../../src"; import { useKeyBindings } from "./useKeyBindings"; import { useIsMobile } from "./useIsMobile"; import { useMemo } from "react"; import '../../src/game.css'; function App() { const isMobile = useIsMobile(); const cols = isMobile ? 12 : 32; const rows = isMobile ? 8 : 24; const gameManager = useGame({ cols, rows }, useKeyBindings); const { containerRef, gameStatus, scoreManager } = gameManager; const { timeValue, keystrokes, optimalSteps, efficiency } = scoreManager; const mazeSize = rows * cols; const finalScore = useMemo( () => gameStatus === "game-won" ? calculateMazeScore(scoreManager, mazeSize) : null, [gameStatus, scoreManager, mazeSize] ); const formatTime = (ms: number) => { const seconds = Math.floor(ms / 1000); const minutes = Math.floor(seconds / 60); const secs = seconds % 60; return `${minutes}:${secs.toString().padStart(2, '0')}`; }; return (

VIMazing vim-maze v{version} example

{(gameStatus === "started" || gameStatus === "has-key" || gameStatus === "game-won") && (
Time
{formatTime(timeValue)}
Keystrokes
{keystrokes}
{optimalSteps > 0 && ( <>
Optimal Steps
{optimalSteps}
Efficiency
{efficiency}%
)} {gameStatus === "game-won" && finalScore && ( <>
Final Score
{finalScore}
)}
)}
{gameStatus === "waiting" &&

Press space to start

} {gameStatus === "started" &&

Use hjkl to change direction • Press q to quit

} {gameStatus === "has-key" &&

Use hjkl to change direction • Press q to quit

} {gameStatus === "game-over" &&

Game Over! Press space to restart

} {gameStatus === "game-won" &&

You Won! Press space to play again

}
); }; export default App;