diff --git a/example/src/App.tsx b/example/src/App.tsx
index 068cce8..22acd24 100644
--- a/example/src/App.tsx
+++ b/example/src/App.tsx
@@ -1,3 +1,4 @@
+import { useEffect } from "react";
import { useGame } from "../../src/useGame/useGame";
import { useKeyBindings } from './useKeyBindings';
import { useMounted } from './useMounted';
@@ -13,25 +14,32 @@ function formatTime(ms: number): string {
export default function App() {
const mounted = useMounted();
- const {
- containerRef,
- initGame,
- solveBoard,
+ const {
+ containerRef,
+ initGame,
+ solveBoard,
scoreManager,
+ boardManager,
keyLog,
gameStatus,
} = useGame(useKeyBindings);
const { timeValue, finalScore } = scoreManager;
+ const stringed = boardManager.boardToString(true);
+
+ useEffect(() => {
+ console.log(stringed);
+ }, [stringed]);
+
return (
VIMazing Sudoku
-
+
{/* Scoreboard */}
-
{mounted &&
}
-
+
diff --git a/src/useGame/useBoardState.ts b/src/useGame/useBoardState.ts
index dff74a7..c414e0c 100644
--- a/src/useGame/useBoardState.ts
+++ b/src/useGame/useBoardState.ts
@@ -41,6 +41,27 @@ export function useBoardState(cursorManager: UseCursorType) {
}
}, [board]);
+ const boardToString = useCallback((human: boolean = false) => {
+ // Computer-optimized: compact 81-character string
+ if (!human) {
+ return board;
+ }
+
+ // Human-readable: formatted grid with 3x3 box separators
+ let result = "";
+ for (let r = 0; r < 9; r++) {
+ for (let c = 0; c < 9; c++) {
+ const idx = r * 9 + c;
+ result += board[idx] === "." ? "." : board[idx];
+ if (c === 2 || c === 5) result += " | ";
+ else if (c < 8) result += " ";
+ }
+ result += "\n";
+ if (r === 2 || r === 5) result += "------+-------+------\n";
+ }
+ return result;
+ }, [board]);
+
return {
board,
initialBoard,
@@ -49,6 +70,7 @@ export function useBoardState(cursorManager: UseCursorType) {
erase,
reset,
solveBoard,
+ boardToString,
};
}