This commit is contained in:
2025-12-15 18:18:17 +09:00
parent 03a7ed2ef2
commit 4c2c98de8a
216 changed files with 9831 additions and 725 deletions
@@ -0,0 +1,246 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:service_api/service_api.dart';
import 'package:feature_common/feature_common.dart';
// --- [Import] 각 게임별 패키지 ---
// 1. 스도쿠
import 'package:feature_game_sudoku/feature_game_sudoku.dart' as sudoku_pkg;
import 'package:feature_game_sudoku/models/game_level.dart' as sudoku_model;
import 'package:feature_game_sudoku/screens/game_screen.dart' as sudoku_screen;
// 2. 수학 퀴즈
import 'package:feature_game_mathquiz/feature_game_mathquiz.dart' as math_pkg;
import 'package:feature_game_mathquiz/models/math_quiz_difficulty.dart' as math_model;
import 'package:feature_game_mathquiz/screens/math_quiz_screen.dart' as math_screen;
import 'package:feature_game_mathquiz/controllers/math_quiz_controller.dart';
// 3. 순서 기억
import 'package:feature_game_sequence/feature_game_sequence.dart' as sequence_pkg;
import 'package:feature_game_sequence/models/sequence_models.dart' as sequence_model;
import 'package:feature_game_sequence/screens/sequence_game_screen.dart' as sequence_screen;
import 'package:feature_game_sequence/controllers/sequence_game_controller.dart';
// 4. 카드 뒤집기
import 'package:feature_game_cardflip/feature_game_cardflip.dart' as cardflip_pkg;
import 'package:feature_game_cardflip/models/cardflip_models.dart' as cardflip_model;
import 'package:feature_game_cardflip/screens/cardflip_game_screen.dart' as cardflip_screen;
import 'package:feature_game_cardflip/controllers/cardflip_controller.dart';
// 5. 색상 매칭
import 'package:feature_game_colormatch/feature_game_colormatch.dart' as colormatch_pkg;
import 'package:feature_game_colormatch/models/colormatch_models.dart' as colormatch_model;
import 'package:feature_game_colormatch/screens/colormatch_game_screen.dart' as colormatch_screen;
import 'package:feature_game_colormatch/controllers/colormatch_controller.dart';
// 6. 다른 그림 찾기
import 'package:feature_game_finddiff/feature_game_finddiff.dart' as finddiff_pkg;
import 'package:feature_game_finddiff/models/finddiff_models.dart' as finddiff_model;
import 'package:feature_game_finddiff/screens/finddiff_game_screen.dart' as finddiff_screen;
import 'package:feature_game_finddiff/controllers/finddiff_controller.dart';
import 'package:feature_game_schulte/feature_game_schulte.dart' as schulte_pkg; // ✅ 추가
// 8. [신규] 따라 그리기
import 'package:feature_game_tracing/feature_game_tracing.dart' as tracing_pkg;
import 'package:feature_game_read_aloud/feature_game_read_aloud.dart' as readAloud;
import 'package:feature_game_dictation/feature_game_dictation.dart' as dictation_pkg;
class DailyCourseController {
final BuildContext context;
final List<BrainGameType> course;
int _currentIndex = 0;
DailyCourseController(this.context, this.course);
// 1. 코스 시작
void start() {
if (course.isEmpty) return;
_currentIndex = 0;
_launchCurrentGame();
}
// 2. 다음 게임으로 이동
void _next() {
_currentIndex++;
if (_currentIndex < course.length) {
Future.delayed(const Duration(milliseconds: 300), () {
_launchCurrentGame();
});
} else {
_showCourseCompletedDialog();
}
}
// 3. 게임 실행 로직
void _launchCurrentGame() async {
final gameType = course[_currentIndex];
final session = context.read<SessionNotifier>().session;
final String userId = session?.userId ?? 'guest';
final String? userName = session?.userName;
Widget? gameScreen;
const int defaultLevelIndex = 1;
try {
switch (gameType) {
// --- 1. 스도쿠 ---
case BrainGameType.sudoku:
final level = sudoku_model.AppLevels.getLevel(defaultLevelIndex);
final puzzleService = PuzzleService();
final gameData = await puzzleService.startGame(level.levelIndex.toString());
gameScreen = sudoku_screen.GameScreen(
gameData: gameData,
themeName: "랜덤",
userId: userId,
userName: userName,
levelIndex: level.levelIndex,
onNextGame: _next,
);
break;
// --- 2. 수학 퀴즈 ---
case BrainGameType.mathQuiz:
final level = math_model.MathQuizDifficulties.getLevel(defaultLevelIndex);
final ctrl = MathQuizController();
ctrl.setUserInfo(userId, userName);
ctrl.startNewGame(level);
gameScreen = ChangeNotifierProvider<MathQuizController>.value(
value: ctrl,
child: math_screen.MathQuizScreen(
// onNextGame: _next, // MathQuizScreen에 onNextGame 추가 필요
),
);
break;
// --- 3. 순서 기억 ---
case BrainGameType.sequence:
final level = sequence_model.SequenceDifficulties.getLevel(defaultLevelIndex);
final ctrl = SequenceGameController();
ctrl.setUserInfo(userId, userName);
ctrl.startNewGame(level);
gameScreen = ChangeNotifierProvider<SequenceGameController>.value(
value: ctrl,
child: sequence_screen.SequenceGameScreen(
// onNextGame: _next,
),
);
break;
// --- 4. 카드 뒤집기 ---
case BrainGameType.cardFlip:
final level = cardflip_model.CardFlipDifficulties.getLevel(defaultLevelIndex);
final ctrl = CardFlipController();
ctrl.setUserInfo(userId, userName);
ctrl.startNewGame(level);
gameScreen = ChangeNotifierProvider<CardFlipController>.value(
value: ctrl,
child: cardflip_screen.CardFlipGameScreen(
// onNextGame: _next,
),
);
break;
// --- 5. 색상 매칭 ---
case BrainGameType.colorMatch:
final level = colormatch_model.ColorMatchDifficulties.getLevel(defaultLevelIndex);
final ctrl = ColorMatchController();
ctrl.setUserInfo(userId, userName);
ctrl.startNewGame(level);
gameScreen = ChangeNotifierProvider<ColorMatchController>.value(
value: ctrl,
child: colormatch_screen.ColorMatchGameScreen(
// onNextGame: _next,
),
);
break;
// --- 6. 다른 그림 찾기 ---
case BrainGameType.findDiff:
final level = finddiff_model.FindDiffDifficulties.getLevel(defaultLevelIndex);
final ctrl = FindDiffController();
ctrl.setUserInfo(userId, userName);
ctrl.startNewGame(level);
gameScreen = ChangeNotifierProvider<FindDiffController>.value(
value: ctrl,
child: finddiff_screen.FindDiffGameScreen(
// onNextGame: _next,
),
);
break;
// --- 7. 스파이더 ---
case BrainGameType.schulte:
// Lv1~3: 3x3, Lv4~6: 4x4 ... (화면 내부에서 처리)
gameScreen = schulte_pkg.SchulteGameScreen(
levelIndex: defaultLevelIndex,
onNextGame: _next,
);
break;
// --- 8. [신규] 따라 그리기 ---
case BrainGameType.tracing:
// TracingGame은 별도 컨트롤러 없이 로컬 상태로 구현됨
gameScreen = tracing_pkg.TracingGameScreen(
levelIndex: defaultLevelIndex, // 필요한 레벨 전달 (예: 1~6)
onNextGame: _next,
);
break;
// --- 9. [신규] 소리 내어 읽기 (추후 구현 시 추가) ---
case BrainGameType.readAloud:
gameScreen = readAloud.ReadAloudGameScreen(
levelIndex: defaultLevelIndex, // 필요한 레벨 전달 (예: 1~6)
onNextGame: _next,
);
break;
case BrainGameType.dictation:
gameScreen = dictation_pkg.DictationGameScreen(
levelIndex: 1, // 또는 사용자 레벨
onNextGame: _next,
);
break;
}
if (gameScreen != null) {
final route = MaterialPageRoute(builder: (_) => gameScreen!);
await Navigator.push(context, route);
} else {
debugPrint("게임 화면 생성 실패: $gameType");
_next();
}
} catch (e) {
debugPrint("게임 실행 중 오류 발생 ($gameType): $e");
_next();
}
}
void _showCourseCompletedDialog() {
showDialog(
context: context,
builder: (ctx) => AlertDialog(
title: const Text("🎉 훈련 완료!"),
content: const Text("오늘의 추천 코스를 모두 완수했습니다.\n두뇌가 한층 더 건강해졌습니다!"),
actions: [
ElevatedButton(
onPressed: () => Navigator.pop(ctx),
child: const Text("확인"),
)
],
),
);
}
}