...
This commit is contained in:
@@ -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("확인"),
|
||||
)
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user