diff --git a/apps/app_finddiff/ios/Runner/Info.plist b/apps/app_finddiff/ios/Runner/Info.plist index 030eb75..5dc07eb 100644 --- a/apps/app_finddiff/ios/Runner/Info.plist +++ b/apps/app_finddiff/ios/Runner/Info.plist @@ -45,7 +45,7 @@ UIApplicationSupportsIndirectInputEvents - GADApplicationIdentifier - ca-app-pub-3940256099942544~1458002511 + GADApplicationIdentifier + ca-app-pub-3940256099942544~1458002511 diff --git a/packages/feature_brain_trainer/.gitignore b/packages/feature_brain_trainer/.gitignore new file mode 100644 index 0000000..dd5eb98 --- /dev/null +++ b/packages/feature_brain_trainer/.gitignore @@ -0,0 +1,31 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. +/pubspec.lock +**/doc/api/ +.dart_tool/ +.flutter-plugins-dependencies +/build/ +/coverage/ diff --git a/packages/feature_brain_trainer/.metadata b/packages/feature_brain_trainer/.metadata new file mode 100644 index 0000000..d7469f0 --- /dev/null +++ b/packages/feature_brain_trainer/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "adc901062556672b4138e18a4dc62a4be8f4b3c2" + channel: "stable" + +project_type: package diff --git a/packages/feature_brain_trainer/CHANGELOG.md b/packages/feature_brain_trainer/CHANGELOG.md new file mode 100644 index 0000000..41cc7d8 --- /dev/null +++ b/packages/feature_brain_trainer/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.0.1 + +* TODO: Describe initial release. diff --git a/packages/feature_brain_trainer/LICENSE b/packages/feature_brain_trainer/LICENSE new file mode 100644 index 0000000..ba75c69 --- /dev/null +++ b/packages/feature_brain_trainer/LICENSE @@ -0,0 +1 @@ +TODO: Add your license here. diff --git a/packages/feature_brain_trainer/README.md b/packages/feature_brain_trainer/README.md new file mode 100644 index 0000000..4a260d8 --- /dev/null +++ b/packages/feature_brain_trainer/README.md @@ -0,0 +1,39 @@ + + +TODO: Put a short description of the package here that helps potential users +know whether this package might be useful for them. + +## Features + +TODO: List what your package can do. Maybe include images, gifs, or videos. + +## Getting started + +TODO: List prerequisites and provide or point to information on how to +start using the package. + +## Usage + +TODO: Include short and useful examples for package users. Add longer examples +to `/example` folder. + +```dart +const like = 'sample'; +``` + +## Additional information + +TODO: Tell users more about the package: where to find more information, how to +contribute to the package, how to file issues, what response they can expect +from the package authors, and more. diff --git a/packages/feature_brain_trainer/analysis_options.yaml b/packages/feature_brain_trainer/analysis_options.yaml new file mode 100644 index 0000000..a5744c1 --- /dev/null +++ b/packages/feature_brain_trainer/analysis_options.yaml @@ -0,0 +1,4 @@ +include: package:flutter_lints/flutter.yaml + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/packages/feature_brain_trainer/lib/feature_brain_trainer.dart b/packages/feature_brain_trainer/lib/feature_brain_trainer.dart new file mode 100644 index 0000000..298576d --- /dev/null +++ b/packages/feature_brain_trainer/lib/feature_brain_trainer.dart @@ -0,0 +1,5 @@ +/// A Calculator. +class Calculator { + /// Returns [value] plus 1. + int addOne(int value) => value + 1; +} diff --git a/packages/feature_brain_trainer/lib/models/cognitive_type.dart b/packages/feature_brain_trainer/lib/models/cognitive_type.dart new file mode 100644 index 0000000..c83983c --- /dev/null +++ b/packages/feature_brain_trainer/lib/models/cognitive_type.dart @@ -0,0 +1,21 @@ +enum CognitiveArea { + memory, // 기억력 + calculation, // 계산/논리력 + attention, // 주의집중력 + perception, // 시지각/공간지각력 +} + +// 게임별 훈련 영역 매핑 +enum BrainGameType { + sequence(CognitiveArea.memory, '순서 기억'), // feature_game_sequence + cardFlip(CognitiveArea.memory, '카드 뒤집기'), // feature_game_cardflip + mathQuiz(CognitiveArea.calculation, '암산 퀴즈'), // feature_game_mathquiz + sudoku(CognitiveArea.calculation, '스도쿠'), // feature_game_sudoku + colorMatch(CognitiveArea.attention, '색상 매칭'), // feature_game_colormatch + findDiff(CognitiveArea.perception, '다른 그림 찾기'), // feature_game_finddiff + spider(CognitiveArea.perception, '스파이더 카드'); // feature_game_spider + + final CognitiveArea area; + final String label; + const BrainGameType(this.area, this.label); +} \ No newline at end of file diff --git a/packages/feature_brain_trainer/lib/screens/brain_training_home.dart b/packages/feature_brain_trainer/lib/screens/brain_training_home.dart new file mode 100644 index 0000000..0a8b621 --- /dev/null +++ b/packages/feature_brain_trainer/lib/screens/brain_training_home.dart @@ -0,0 +1,116 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:feature_common/feature_common.dart'; +import 'package:service_api/service_api.dart'; + +// 각 게임 패키지 import +import 'package:feature_game_sudoku/feature_game_sudoku.dart'; +import 'package:feature_game_mathquiz/feature_game_mathquiz.dart'; +// ... (나머지 게임들) + +class BrainTrainingHome extends StatelessWidget { + const BrainTrainingHome({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: const Text('두뇌 건강 지킴이')), + body: SingleChildScrollView( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + // 1. 상태 체크 카드 + _buildCheckupCard(context), + + const SizedBox(height: 24), + + // 2. 오늘의 추천 코스 (자동 믹스 게임) + const Text('오늘의 추천 훈련', style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold)), + const SizedBox(height: 10), + _buildDailyTrainingButton(context), + + const SizedBox(height: 24), + + // 3. 게임 아케이드 (자유 선택) + const Text('전체 게임', style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold)), + const SizedBox(height: 10), + _buildGameGrid(context), + ], + ), + ), + ); + } + + Widget _buildCheckupCard(BuildContext context) { + return Card( + color: Colors.indigo.shade50, + child: ListTile( + leading: const Icon(Icons.health_and_safety, size: 40, color: Colors.indigo), + title: const Text('나의 두뇌 건강 체크'), + subtitle: const Text('간단한 질문으로 현재 상태를 확인하고\n맞춤형 훈련을 추천받으세요.'), + trailing: const Icon(Icons.arrow_forward_ios), + onTap: () { + // TODO: 체크리스트 화면으로 이동 + // Navigator.push(context, MaterialPageRoute(builder: (_) => AssessmentScreen())); + }, + ), + ); + } + + Widget _buildDailyTrainingButton(BuildContext context) { + return ElevatedButton.icon( + style: ElevatedButton.styleFrom( + padding: const EdgeInsets.all(20), + backgroundColor: Colors.orange, + foregroundColor: Colors.white, + ), + icon: const Icon(Icons.play_circle_fill, size: 32), + label: const Text('오늘의 코스 시작하기\n(맞춤형 3종 세트)', textAlign: TextAlign.center, style: TextStyle(fontSize: 18)), + onPressed: () { + // TODO: Assessment 결과에 따라 선정된 게임들을 순차적으로 실행하는 로직 + // 예: Sequence -> Math -> ColorMatch 순서로 실행되는 별도 Flow 화면으로 이동 + }, + ); + } + + Widget _buildGameGrid(BuildContext context) { + // 모든 게임 리스트 + final games = [ + {'name': '스도쿠', 'icon': Icons.grid_3x3, 'dest': const SudokuLobbyScreen()}, + {'name': '계산 퀴즈', 'icon': Icons.calculate, 'dest': const MathQuizLobbyScreen()}, + {'name': '순서 기억', 'icon': Icons.onetwothree, 'dest': const SequenceLobbyScreen()}, + // ... 나머지 게임 추가 + ]; + + return GridView.builder( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + childAspectRatio: 1.5, + crossAxisSpacing: 10, + mainAxisSpacing: 10, + ), + itemCount: games.length, + itemBuilder: (context, index) { + return GestureDetector( + onTap: () { + Navigator.push(context, MaterialPageRoute(builder: (_) => games[index]['dest'] as Widget)); + }, + child: Card( + elevation: 2, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(games[index]['icon'] as IconData, size: 36, color: Colors.blueGrey), + const SizedBox(height: 8), + Text(games[index]['name'] as String, style: const TextStyle(fontWeight: FontWeight.bold)), + ], + ), + ), + ); + }, + ); + } +} \ No newline at end of file diff --git a/packages/feature_brain_trainer/lib/services/assessment_service.dart b/packages/feature_brain_trainer/lib/services/assessment_service.dart new file mode 100644 index 0000000..9a1fd3e --- /dev/null +++ b/packages/feature_brain_trainer/lib/services/assessment_service.dart @@ -0,0 +1,35 @@ +import 'package:flutter/material.dart'; +import '../models/cognitive_type.dart'; + +class AssessmentService { + // 간단한 점수 산출 (Yes = 1점, 부족함 표시) + Map calculateWeaknesses(Map answers) { + Map scoreMap = { + CognitiveArea.memory: 0, + CognitiveArea.calculation: 0, + CognitiveArea.attention: 0, + CognitiveArea.perception: 0, + }; + + // 실제로는 질문 ID와 영역을 매핑해서 처리 + // 예시 로직: + if (answers['q_memory_1'] == true) scoreMap[CognitiveArea.memory] = (scoreMap[CognitiveArea.memory] ?? 0) + 1; + // ... + return scoreMap; + } + + // 점수에 기반하여 오늘의 추천 게임 리스트 생성 + List generateDailyCourse(Map weaknesses) { + List course = []; + + // 1. 가장 취약한 영역의 게임 1개 (난이도 하) + CognitiveArea weakest = weaknesses.entries.reduce((a, b) => a.value > b.value ? a : b).key; + course.add(BrainGameType.values.firstWhere((g) => g.area == weakest)); + + // 2. 랜덤하게 다른 영역 게임 2개 섞기 (균형 잡힌 훈련) + List others = BrainGameType.values.where((g) => g.area != weakest).toList()..shuffle(); + course.addAll(others.take(2)); + + return course; + } +} \ No newline at end of file diff --git a/packages/feature_brain_trainer/pubspec.yaml b/packages/feature_brain_trainer/pubspec.yaml new file mode 100644 index 0000000..e65a569 --- /dev/null +++ b/packages/feature_brain_trainer/pubspec.yaml @@ -0,0 +1,54 @@ +name: feature_brain_trainer +description: "A new Flutter package project." +version: 0.0.1 +homepage: + +environment: + sdk: ^3.9.2 + flutter: ">=1.17.0" + +dependencies: + flutter: + sdk: flutter + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^5.0.0 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + + # To add assets to your package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/to/asset-from-package + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/to/resolution-aware-images + + # To add custom fonts to your package, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts in packages, see + # https://flutter.dev/to/font-from-package diff --git a/packages/feature_brain_trainer/test/feature_brain_trainer_test.dart b/packages/feature_brain_trainer/test/feature_brain_trainer_test.dart new file mode 100644 index 0000000..6c3b827 --- /dev/null +++ b/packages/feature_brain_trainer/test/feature_brain_trainer_test.dart @@ -0,0 +1,12 @@ +import 'package:flutter_test/flutter_test.dart'; + +import 'package:feature_brain_trainer/feature_brain_trainer.dart'; + +void main() { + test('adds one to input values', () { + final calculator = Calculator(); + expect(calculator.addOne(2), 3); + expect(calculator.addOne(-7), -6); + expect(calculator.addOne(0), 1); + }); +}