feat: add foodsPerLevel to GameOptions with default of 10

- New option: foodsPerLevel (defaults to 10)
- Controls how many foods must be eaten to level up
- Example: useGame({ foodsPerLevel: 5 })
This commit is contained in:
2025-10-31 00:21:20 +00:00
parent 5cbb2ee94c
commit 520a640ea0
3 changed files with 6 additions and 5 deletions
+1
View File
@@ -33,6 +33,7 @@ export type GameOptions = {
rows?: number; rows?: number;
timeLimit?: number; timeLimit?: number;
startingLevel?: number; startingLevel?: number;
foodsPerLevel?: number;
}; };
// ============================================================================ // ============================================================================
+2 -2
View File
@@ -8,7 +8,7 @@ import { useKeyBindings, type UseKeyBindingsType } from "./useKeyBindings";
import { useScore } from "../useScore"; import { useScore } from "../useScore";
export function useGame(options?: GameOptions, platformHook?: unknown): GameManager { export function useGame(options?: GameOptions, platformHook?: unknown): GameManager {
const { cols = 30, rows = 20, startingLevel } = options ?? {}; const { cols = 30, rows = 20, startingLevel, foodsPerLevel } = options ?? {};
const boardManager = useBoard(); const boardManager = useBoard();
const { containerRef, renderBoard } = boardManager; const { containerRef, renderBoard } = boardManager;
@@ -18,7 +18,7 @@ export function useGame(options?: GameOptions, platformHook?: unknown): GameMana
const foodManager = useFood(cols, rows, boardManager); const foodManager = useFood(cols, rows, boardManager);
const gameManager = useGameStatus(boardManager, snakeManager, foodManager, { startingLevel }); const gameManager = useGameStatus(boardManager, snakeManager, foodManager, { startingLevel, foodsPerLevel });
const { gameStatus, setGameStatus, startGame, quitGame, togglePause, score, level } = gameManager; const { gameStatus, setGameStatus, startGame, quitGame, togglePause, score, level } = gameManager;
useEffect(() => { useEffect(() => {
+3 -3
View File
@@ -4,10 +4,9 @@ import type { UseBoardType } from "../useBoard";
import type { UseCursorType } from "../useCursor"; import type { UseCursorType } from "../useCursor";
import type { UseFoodType } from "../useGame/useFood"; import type { UseFoodType } from "../useGame/useFood";
const FOODS_PER_LEVEL = 2;
export type UseGameStatusParams = { export type UseGameStatusParams = {
startingLevel?: number; startingLevel?: number;
foodsPerLevel?: number;
}; };
export function useGameStatus( export function useGameStatus(
@@ -17,6 +16,7 @@ export function useGameStatus(
params?: UseGameStatusParams params?: UseGameStatusParams
) { ) {
const startingLevel = params?.startingLevel ?? 1; const startingLevel = params?.startingLevel ?? 1;
const foodsPerLevel = params?.foodsPerLevel ?? 10;
const { containerRef } = boardManager; const { containerRef } = boardManager;
const { initSnake, clearSnake, snakeBodyRef } = snakeManager; const { initSnake, clearSnake, snakeBodyRef } = snakeManager;
const { spawnFood, clearFood } = foodManager; const { spawnFood, clearFood } = foodManager;
@@ -91,7 +91,7 @@ export function useGameStatus(
shouldGrow = true; shouldGrow = true;
// Check BEFORE incrementing if we're about to level up // Check BEFORE incrementing if we're about to level up
const willLevelUp = (foodsEatenRef.current + 1) >= FOODS_PER_LEVEL; const willLevelUp = (foodsEatenRef.current + 1) >= foodsPerLevel;
foodsEatenRef.current += 1; foodsEatenRef.current += 1;