미지수 괄호 문제 풀이 추가

This commit is contained in:
2026-05-29 23:47:10 +09:00
parent 335898b721
commit f3d051cdd1
16 changed files with 1789 additions and 105 deletions
+90
View File
@@ -0,0 +1,90 @@
import { create } from "zustand";
import {
generateVariableParenthesisSession,
gradeVariableParenthesisAnswer,
} from "@/lib/engine/variable-parenthesis";
import type {
VariableGradeResult,
VariableParenthesisProblem,
VariableUserAnswer,
} from "@/lib/engine/variable-types";
export interface VariableGameSession {
problems: VariableParenthesisProblem[];
currentIndex: number;
results: (VariableGradeResult | null)[];
}
export type VariableProblemCount = 5 | 10;
interface VariableGameState {
session: VariableGameSession | null;
selectedProblemCount: VariableProblemCount;
setProblemCount: (count: VariableProblemCount) => void;
initSession: (count?: VariableProblemCount) => void;
submitAnswer: (answer: VariableUserAnswer) => void;
nextProblem: () => void;
resetSession: () => void;
}
const DEFAULT_SESSION_COUNT: VariableProblemCount = 10;
function createSession(
count: VariableProblemCount = DEFAULT_SESSION_COUNT,
): VariableGameSession {
const problems = generateVariableParenthesisSession(count);
return {
problems,
currentIndex: 0,
results: problems.map(() => null),
};
}
export const useVariableGameStore = create<VariableGameState>((set, get) => ({
session: null,
selectedProblemCount: DEFAULT_SESSION_COUNT,
setProblemCount: (count) => {
set({ selectedProblemCount: count });
},
initSession: (count) => {
const selectedProblemCount = count ?? get().selectedProblemCount;
set({ session: createSession(selectedProblemCount) });
},
submitAnswer: (answer) => {
const { session } = get();
if (!session || session.currentIndex >= session.problems.length) return;
if (session.results[session.currentIndex] !== null) return;
const problem = session.problems[session.currentIndex];
const result = gradeVariableParenthesisAnswer(problem, answer);
const results = [...session.results];
results[session.currentIndex] = result;
set({
session: {
...session,
results,
},
});
},
nextProblem: () => {
const { session } = get();
if (!session || session.currentIndex >= session.problems.length) return;
if (session.results[session.currentIndex] === null) return;
set({
session: {
...session,
currentIndex: session.currentIndex + 1,
},
});
},
resetSession: () => {
set({ session: createSession(get().selectedProblemCount) });
},
}));