From 64f3fb8adfd4eaaaecae5bce77f3356ebbc0ba8f Mon Sep 17 00:00:00 2001 From: lunaticbum Date: Wed, 19 Nov 2025 17:34:52 +0900 Subject: [PATCH] ... --- .../lib/controllers/cardflip_controller.dart | 45 ++++++-- .../lib/models/cardflip_models.dart | 102 ++++++++++++------ 2 files changed, 105 insertions(+), 42 deletions(-) diff --git a/packages/feature_game_cardflip/lib/controllers/cardflip_controller.dart b/packages/feature_game_cardflip/lib/controllers/cardflip_controller.dart index cb6d891..fa79f34 100644 --- a/packages/feature_game_cardflip/lib/controllers/cardflip_controller.dart +++ b/packages/feature_game_cardflip/lib/controllers/cardflip_controller.dart @@ -35,10 +35,7 @@ class CardFlipController with ChangeNotifier { bool _isGameStarted = false; bool get isGameStarted => _isGameStarted; - // [๐Ÿ”ฅ ์‹ ๊ทœ] ๋งค์นญ๋œ ์Œ์˜ ๊ฐœ์ˆ˜ int get matchedPairsCount => _cards.where((c) => c.isMatched).length ~/ 2; - - // [๐Ÿ”ฅ ์‹ ๊ทœ] ์ด ์Œ์˜ ๊ฐœ์ˆ˜ int get totalPairsCount => _cards.length ~/ 2; void setUserInfo(String userId, String? userName) { @@ -91,32 +88,56 @@ class CardFlipController with ChangeNotifier { final Random random = Random(); if (difficulty.contentType == CardContentType.calculation) { + // [๐Ÿ”ฅ ์ˆ˜์ •] ์—ฐ์‚ฐ ๋ชจ๋“œ final Set usedResults = {}; + + // ๋ ˆ๋ฒจ 4์ธ์ง€ ํ™•์ธ (ํ•œ ์ž๋ฆฟ์ˆ˜ ๋ง์…ˆ/๋บ„์…ˆ๋งŒ) + final bool isLevel4 = difficulty.levelIndex == 4; + for (int i = 0; i < pairsCount; i++) { String equation; String answer; int result; while (true) { - final int opType = random.nextInt(3); + // Lv 4: 0(๋ง์…ˆ), 1(๋บ„์…ˆ)๋งŒ ์„ ํƒ / ๊ทธ ์™ธ: 0, 1, 2(๊ณฑ์…ˆ) ์„ ํƒ + final int opType = isLevel4 ? random.nextInt(2) : random.nextInt(3); int a, b; - if (opType == 0) { // + - a = random.nextInt(15) + 1; - b = random.nextInt(15) + 1; + + if (opType == 0) { // ๋ง์…ˆ (+) + if (isLevel4) { + // ํ•œ ์ž๋ฆฟ์ˆ˜ (1~9) + a = random.nextInt(9) + 1; + b = random.nextInt(9) + 1; + } else { + // ๋‘ ์ž๋ฆฟ์ˆ˜ ํฌํ•จ (1~15) + a = random.nextInt(15) + 1; + b = random.nextInt(15) + 1; + } result = a + b; equation = "$a + $b"; - } else if (opType == 1) { // - - a = random.nextInt(20) + 5; - b = random.nextInt(a - 1) + 1; + + } else if (opType == 1) { // ๋บ„์…ˆ (-) + if (isLevel4) { + // ๊ฒฐ๊ณผ๊ฐ€ ์–‘์ˆ˜์ด๊ณ  ํ•œ ์ž๋ฆฟ์ˆ˜ ๋‚ด์—์„œ ์ฒ˜๋ฆฌ๋˜๋„๋ก + a = random.nextInt(9) + 2; // 2~10 + b = random.nextInt(a - 1) + 1; + } else { + a = random.nextInt(20) + 5; + b = random.nextInt(a - 1) + 1; + } result = a - b; equation = "$a - $b"; - } else { // * + + } else { // ๊ณฑ์…ˆ (*) + // Lv 4์—์„œ๋Š” ์ด ๋ธ”๋ก์— ๋“ค์–ด์˜ค์ง€ ์•Š์Œ a = random.nextInt(9) + 2; b = random.nextInt(5) + 2; result = a * b; equation = "$a x $b"; } + // ์ •๋‹ต ์ค‘๋ณต ๋ฐฉ์ง€ if (!usedResults.contains(result)) { usedResults.add(result); answer = result.toString(); @@ -130,6 +151,7 @@ class CardFlipController with ChangeNotifier { } } else if (difficulty.contentType == CardContentType.pairWord) { + // ์—ฐ์ƒ ๋ชจ๋“œ var entries = CardFlipDifficulties.wordPairs.entries.toList()..shuffle(); for (int i = 0; i < pairsCount; i++) { var entry = entries[i % entries.length]; @@ -139,6 +161,7 @@ class CardFlipController with ChangeNotifier { } } else { + // ๋™์ผ ๋งค์นญ ๋ชจ๋“œ List pool = List.of(CardFlipDifficulties.emojis)..shuffle(); for (int i = 0; i < pairsCount; i++) { String content; diff --git a/packages/feature_game_cardflip/lib/models/cardflip_models.dart b/packages/feature_game_cardflip/lib/models/cardflip_models.dart index 3e09b5b..13cbc0b 100644 --- a/packages/feature_game_cardflip/lib/models/cardflip_models.dart +++ b/packages/feature_game_cardflip/lib/models/cardflip_models.dart @@ -7,7 +7,7 @@ enum CardContentType { emoji, // ๐Ÿฐ โ†” ๐Ÿฐ icon, // โญ๏ธ โ†” โญ๏ธ number, // 1 โ†” 1 - calculation, // 3+4 โ†” 7 (๋™์  ์ƒ์„ฑ) + calculation, // 3+4 โ†” 7 pairWord, // ํ† ๋ผ โ†” ๋‹น๊ทผ } @@ -49,7 +49,7 @@ class CardFlipDifficulty extends GameDifficulty { } class CardFlipDifficulties { - // ์ด๋ชจ์ง€ ํ’€ + // --- ์ฝ˜ํ…์ธ  ํ’€ --- static const List emojis = [ "๐Ÿถ", "๐Ÿฑ", "๐Ÿญ", "๐Ÿน", "๐Ÿฐ", "๐ŸฆŠ", "๐Ÿป", "๐Ÿผ", "๐Ÿจ", "๐Ÿฏ", "๐Ÿฆ", "๐Ÿฎ", "๐Ÿท", "๐Ÿธ", "๐Ÿต", "๐Ÿ”", "๐Ÿง", "๐Ÿฆ", "๐Ÿค", "๐Ÿฆ†", @@ -57,44 +57,84 @@ class CardFlipDifficulties { "โšฝ", "๐Ÿ€", "๐Ÿˆ", "โšพ", "๐ŸŽพ", "๐Ÿ", "๐Ÿ‰", "๐ŸŽฑ", "๐Ÿ“", "๐Ÿธ" ]; - // โŒ [์‚ญ์ œ๋จ] calculationPairs (์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋™์  ์ƒ์„ฑํ•˜๋ฏ€๋กœ ์ œ๊ฑฐ) - - // ์—ฐ์ƒ ๋‹จ์–ด ํ’€ (A : B) + // ์—ฐ์ƒ ๋‹จ์–ด ํ’€ (์ด 80+์Œ) static const Map wordPairs = { - "ํ† ๋ผ": "๋‹น๊ทผ", "์›์ˆญ์ด": "๋ฐ”๋‚˜๋‚˜", "ํ•œ๊ตญ": "์„œ์šธ", "๋ฏธ๊ตญ": "์›Œ์‹ฑํ„ด", - "ํ•ด": "๋‹ฌ", "์—ฌ๋ฆ„": "๊ฒจ์šธ", "๋‚จ์ž": "์—ฌ์ž", "ํ•™๊ต": "ํ•™์ƒ", - "๋ณ‘์›": "์˜์‚ฌ", "๋ฐ”๋Š˜": "์‹ค", "์šฐ์‚ฐ": "๋น„", "์ฑ…์ƒ": "์˜์ž", - "๋ด„": "๊ฝƒ", "๊ฐ€์„": "๋‹จํ’", "์ˆŸ๊ฐ€๋ฝ": "์ “๊ฐ€๋ฝ" + "ํ† ๋ผ": "๋‹น๊ทผ", "์›์ˆญ์ด": "๋ฐ”๋‚˜๋‚˜", "๋‹ค๋žŒ์ฅ": "๋„ํ† ๋ฆฌ", "๊ณ ์–‘์ด": "์ƒ์„ ", + "๊ฐœ": "๋ผˆ๋‹ค๊ท€", "์†Œ": "์—ฌ๋ฌผ", "๋‹ญ": "๋‹ฌ๊ฑ€", "๋ฒŒ": "๊ฟ€", + "๊ฑฐ๋ฏธ": "๊ฑฐ๋ฏธ์ค„", "๊ฐœ๊ตฌ๋ฆฌ": "์˜ฌ์ฑ™์ด", "ํŒฌ๋”": "๋Œ€๋‚˜๋ฌด", "ํ˜ธ๋ž‘์ด": "๊ฐ€์ฃฝ", + "๋ˆ„์—": "๋ฝ•์žŽ", "์–‘": "์–‘ํ„ธ", "ํŽญ๊ท„": "๋‚จ๊ทน", "์‚ฌ์ž": "์ดˆ์›", + + "๋ฐ”๋Š˜": "์‹ค", "๋ง์น˜": "๋ชป", "ํ™œ": "ํ™”์‚ด", "์ž๋ฌผ์‡ ": "์—ด์‡ ", + "์ˆŸ๊ฐ€๋ฝ": "์ “๊ฐ€๋ฝ", "์ฑ…์ƒ": "์˜์ž", "์‹ ๋ฐœ": "์–‘๋ง", "์žฅ๊ฐ‘": "๋ชฉ๋„๋ฆฌ", + "์ง€์šฐ๊ฐœ": "์—ฐํ•„", "์น ํŒ": "๋ถ„ํ•„", "๋ถ“": "๋ฌผ๊ฐ", "๋„์žฅ": "์ธ์ฃผ", + "๋ƒ„๋น„": "๋šœ๊ป‘", "์ƒดํ‘ธ": "๋ฆฐ์Šค", "์น˜์•ฝ": "์นซ์†”", "๋น„๋ˆ„": "์ˆ˜๊ฑด", + "๋ฐฐ๊ฒŒ": "์ด๋ถˆ", "ํ•ญ์•„๋ฆฌ": "๋šœ๊ป‘", "์•ˆ๊ฒฝ": "์•ˆ๊ฒฝ์ง‘", "ํ•ธ๋“œํฐ": "์ถฉ์ „๊ธฐ", + + "ํ•ด": "๋‹ฌ", "ํ•˜๋Š˜": "๊ตฌ๋ฆ„", "๋น„": "์šฐ์‚ฐ", "๋ˆˆ": "๋ˆˆ์‚ฌ๋žŒ", + "๋ด„": "๊ฝƒ", "์—ฌ๋ฆ„": "๋ถ€์ฑ„", "๊ฐ€์„": "๋‹จํ’", "๊ฒจ์šธ": "๋ˆˆ", + "๋ฐ”๋‹ค": "ํŒŒ๋„", "์‚ฐ": "๋‚˜๋ฌด", "์‚ฌ๋ง‰": "์„ ์ธ์žฅ", "๋ฐค": "๋ณ„", + "๋ฒˆ๊ฐœ": "์ฒœ๋‘ฅ", "๋ฌด์ง€๊ฐœ": "๋น„์˜จ๋’ค", "ํ™”์‚ฐ": "์šฉ์•”", "์ง€์ง„": "์ง„๋™", + + "๋ฐฅ": "๊ตญ", "๋นต": "์šฐ์œ ", "์‚ผ๊ฒน์‚ด": "์ƒ์ถ”", "์งœ์žฅ๋ฉด": "๋‹จ๋ฌด์ง€", + "์น˜ํ‚จ": "๋ฌด", "๋–ก๋ณถ์ด": "์˜ค๋Ž…", "ํ”ผ์ž": "์ฝœ๋ผ", "ํšŒ": "์ดˆ์žฅ", + "๊ฐ์ž": "๊ณ ๊ตฌ๋งˆ", "์†Œ๊ธˆ": "์„คํƒ•", "๊ฐ„์žฅ": "๊ณ ์ถ”์žฅ", "๋œ์žฅ": "์Œˆ์žฅ", + + "๋‚จ์ž": "์—ฌ์ž", "๋ถ€๋ชจ": "์ž์‹", "ํ• ์•„๋ฒ„์ง€": "ํ• ๋จธ๋‹ˆ", "ํ˜•": "๋™์ƒ", + "์„ ์ƒ๋‹˜": "ํ•™์ƒ", "์˜์‚ฌ": "ํ™˜์ž", "๊ฒฝ์ฐฐ": "๋„๋‘‘", "๊ฐ€์ˆ˜": "๋งˆ์ดํฌ", + "ํ™”๊ฐ€": "๊ทธ๋ฆผ", "์š”๋ฆฌ์‚ฌ": "์ฃผ๋ฐฉ", "์–ด๋ถ€": "๋‚š์‹œ๋Œ€", "๊ตฐ์ธ": "์ด", + "์™•": "์™•๋น„", "์™•์ž": "๊ณต์ฃผ", "์‹ ๋ž‘": "์‹ ๋ถ€", "์ฃผ์ธ": "์†๋‹˜", + + "ํ•œ๊ตญ": "์„œ์šธ", "๋ฏธ๊ตญ": "์›Œ์‹ฑํ„ด", "ํ”„๋ž‘์Šค": "ํŒŒ๋ฆฌ", "์˜๊ตญ": "๋Ÿฐ๋˜", + "์ผ๋ณธ": "๋„์ฟ„", "์ค‘๊ตญ": "๋ฒ ์ด์ง•", "ํ•™๊ต": "๊ต์‹ค", "๋ณ‘์›": "์ฃผ์‚ฌ๊ธฐ", + "์€ํ–‰": "๋ˆ", "์šฐ์ฒด๊ตญ": "ํŽธ์ง€", "๊ทน์žฅ": "์˜ํ™”", "๋„์„œ๊ด€": "์ฑ…", + "๊ณตํ•ญ": "๋น„ํ–‰๊ธฐ", "ํ•ญ๊ตฌ": "๋ฐฐ", "์—ญ": "๊ธฐ์ฐจ", "์ •๋ฅ˜์žฅ": "๋ฒ„์Šค", + + "์‹œ๊ณ„": "์‹œ๊ฐ„", "๋‹ฌ๋ ฅ": "๋‚ ์งœ", "๊ฑฐ์šธ": "์–ผ๊ตด", "๋น—": "๋จธ๋ฆฌ์นด๋ฝ", + "๊ฐ€๋ฐฉ": "์ฑ…", "๋ชจ์ž": "๋จธ๋ฆฌ", "์•ˆ๊ฒฝ": "๋ˆˆ", "๋งˆ์Šคํฌ": "์ž…", }; - // ๋‚œ์ด๋„ ๋ชฉ๋ก (15๋‹จ๊ณ„) + // [๐Ÿ”ฅ ์ˆ˜์ •] 21๋‹จ๊ณ„ ๋‚œ์ด๋„ ๋ชฉ๋ก (6x6 ํ—ฌ๋ชจ๋“œ ์ถ”๊ฐ€) static final List allDifficulties = [ - // Phase 1: ์ž…๋ฌธ (๋™์ผ ๋งค์นญ) - const CardFlipDifficulty(levelIndex: 1, name: 'Lv. 1: ์ž…๋ฌธ (์ด๋ชจ์ง€ 12)', contextId: 'FLIP_L1_EMOJI', rows: 4, cols: 3, timeLimitSeconds: 40, contentType: CardContentType.emoji), - const CardFlipDifficulty(levelIndex: 2, name: 'Lv. 2: ์ดˆ๊ธ‰ (์•„์ด์ฝ˜ 12)', contextId: 'FLIP_L2_ICON', rows: 4, cols: 3, timeLimitSeconds: 30, contentType: CardContentType.icon), - const CardFlipDifficulty(levelIndex: 3, name: 'Lv. 3: ๊ธฐ์ดˆ (์ˆซ์ž 16)', contextId: 'FLIP_L3_NUM', rows: 4, cols: 4, timeLimitSeconds: 50, contentType: CardContentType.number), + // --- Phase 1: ์ž…๋ฌธ (6~8์žฅ) --- + const CardFlipDifficulty(levelIndex: 1, name: 'Lv. 1: ์ž…๋ฌธ (์ˆซ์ž 6์žฅ)', contextId: 'FLIP_L1_2x3_NUM', rows: 3, cols: 2, timeLimitSeconds: 30, contentType: CardContentType.number), + const CardFlipDifficulty(levelIndex: 2, name: 'Lv. 2: ์ž…๋ฌธ (์ด๋ชจ์ง€ 6์žฅ)', contextId: 'FLIP_L2_2x3_EMOJI', rows: 3, cols: 2, timeLimitSeconds: 25, contentType: CardContentType.emoji), + const CardFlipDifficulty(levelIndex: 3, name: 'Lv. 3: ๊ธฐ์ดˆ (์ˆซ์ž 8์žฅ)', contextId: 'FLIP_L3_2x4_NUM', rows: 4, cols: 2, timeLimitSeconds: 40, contentType: CardContentType.number), + const CardFlipDifficulty(levelIndex: 4, name: 'Lv. 4: ๊ธฐ์ดˆ (์ด๋ชจ์ง€ 8์žฅ)', contextId: 'FLIP_L4_2x4_EMOJI', rows: 4, cols: 2, timeLimitSeconds: 35, contentType: CardContentType.emoji), - // Phase 2: ์—ฐ์‚ฐ/์—ฐ์ƒ (๊ธฐ์–ต + ์‚ฌ๊ณ ) - const CardFlipDifficulty(levelIndex: 4, name: 'Lv. 4: ์—ฐ์‚ฐ (๋ง์…ˆ/๋บ„์…ˆ)', contextId: 'FLIP_L4_CALC', rows: 4, cols: 4, timeLimitSeconds: 60, contentType: CardContentType.calculation), - const CardFlipDifficulty(levelIndex: 5, name: 'Lv. 5: ์—ฐ์ƒ (์ง๊ฟ ๋‹จ์–ด)', contextId: 'FLIP_L5_PAIR', rows: 4, cols: 4, timeLimitSeconds: 60, contentType: CardContentType.pairWord), - const CardFlipDifficulty(levelIndex: 6, name: 'Lv. 6: ๋„์ „ (์ด๋ชจ์ง€ 20)', contextId: 'FLIP_L6_EMOJI_20', rows: 5, cols: 4, timeLimitSeconds: 70, contentType: CardContentType.emoji), + // --- Phase 2: ์ดˆ๊ธ‰ (12์žฅ) --- + const CardFlipDifficulty(levelIndex: 5, name: 'Lv. 5: ์ดˆ๊ธ‰ (์ด๋ชจ์ง€ 12์žฅ)', contextId: 'FLIP_L5_3x4_EMOJI', rows: 4, cols: 3, timeLimitSeconds: 50, contentType: CardContentType.emoji), + const CardFlipDifficulty(levelIndex: 6, name: 'Lv. 6: ์ดˆ๊ธ‰ (์•„์ด์ฝ˜ 12์žฅ)', contextId: 'FLIP_L6_3x4_ICON', rows: 4, cols: 3, timeLimitSeconds: 45, contentType: CardContentType.icon), + const CardFlipDifficulty(levelIndex: 7, name: 'Lv. 7: ์ดˆ๊ธ‰ (์—ฐ์‚ฐ 12์žฅ)', contextId: 'FLIP_L7_3x4_CALC', rows: 4, cols: 3, timeLimitSeconds: 60, contentType: CardContentType.calculation), + const CardFlipDifficulty(levelIndex: 8, name: 'Lv. 8: ์ดˆ๊ธ‰ (๋‹จ์–ด 12์žฅ)', contextId: 'FLIP_L8_3x4_PAIR', rows: 4, cols: 3, timeLimitSeconds: 60, contentType: CardContentType.pairWord), - // Phase 3: ์ƒ๊ธ‰ (ํ˜ผํ•ฉ/ํ™•์žฅ) - const CardFlipDifficulty(levelIndex: 7, name: 'Lv. 7: ์ƒ๊ธ‰ (์—ฐ์‚ฐ 20)', contextId: 'FLIP_L7_CALC_20', rows: 5, cols: 4, timeLimitSeconds: 90, contentType: CardContentType.calculation), - const CardFlipDifficulty(levelIndex: 8, name: 'Lv. 8: ์ „๋ฌธ๊ฐ€ (์—ฐ์ƒ 20)', contextId: 'FLIP_L8_PAIR_20', rows: 5, cols: 4, timeLimitSeconds: 90, contentType: CardContentType.pairWord), - const CardFlipDifficulty(levelIndex: 9, name: 'Lv. 9: ์—˜๋ฆฌํŠธ (์•„์ด์ฝ˜ 24)', contextId: 'FLIP_L9_ICON_24', rows: 6, cols: 4, timeLimitSeconds: 100, contentType: CardContentType.icon), + // --- Phase 3: ์ค‘๊ธ‰ (16์žฅ) --- + const CardFlipDifficulty(levelIndex: 9, name: 'Lv. 9: ์ค‘๊ธ‰ (์ˆซ์ž 16์žฅ)', contextId: 'FLIP_L9_4x4_NUM', rows: 4, cols: 4, timeLimitSeconds: 70, contentType: CardContentType.number), + const CardFlipDifficulty(levelIndex: 10, name: 'Lv. 10: ์ค‘๊ธ‰ (์•„์ด์ฝ˜ 16์žฅ)', contextId: 'FLIP_L10_4x4_ICON', rows: 4, cols: 4, timeLimitSeconds: 65, contentType: CardContentType.icon), + const CardFlipDifficulty(levelIndex: 11, name: 'Lv. 11: ์ค‘๊ธ‰ (์—ฐ์‚ฐ 16์žฅ)', contextId: 'FLIP_L11_4x4_CALC', rows: 4, cols: 4, timeLimitSeconds: 90, contentType: CardContentType.calculation), + const CardFlipDifficulty(levelIndex: 12, name: 'Lv. 12: ์ค‘๊ธ‰ (๋‹จ์–ด 16์žฅ)', contextId: 'FLIP_L12_4x4_PAIR', rows: 4, cols: 4, timeLimitSeconds: 90, contentType: CardContentType.pairWord), - // Phase 4: ๋งˆ์Šคํ„ฐ (๋Œ€ํ˜• ๊ทธ๋ฆฌ๋“œ) - const CardFlipDifficulty(levelIndex: 10, name: 'Lv. 10: ๋งˆ์Šคํ„ฐ (24์žฅ)', contextId: 'FLIP_L10_6x4', rows: 6, cols: 4, timeLimitSeconds: 100, contentType: CardContentType.emoji), - const CardFlipDifficulty(levelIndex: 11, name: 'Lv. 11: ๊ทธ๋žœ๋“œ๋งˆ์Šคํ„ฐ', contextId: 'FLIP_L11_6x4_CALC', rows: 6, cols: 4, timeLimitSeconds: 110, contentType: CardContentType.calculation), - const CardFlipDifficulty(levelIndex: 12, name: 'Lv. 12: ๋ ˆ์ „๋“œ', contextId: 'FLIP_L12_6x4_PAIR', rows: 6, cols: 4, timeLimitSeconds: 110, contentType: CardContentType.pairWord), + // --- Phase 4: ์ƒ๊ธ‰ (20~24์žฅ) --- + const CardFlipDifficulty(levelIndex: 13, name: 'Lv. 13: ์ƒ๊ธ‰ (์ด๋ชจ์ง€ 20์žฅ)', contextId: 'FLIP_L13_5x4_EMOJI', rows: 5, cols: 4, timeLimitSeconds: 100, contentType: CardContentType.emoji), + const CardFlipDifficulty(levelIndex: 14, name: 'Lv. 14: ์ƒ๊ธ‰ (์—ฐ์‚ฐ 20์žฅ)', contextId: 'FLIP_L14_5x4_CALC', rows: 5, cols: 4, timeLimitSeconds: 120, contentType: CardContentType.calculation), + const CardFlipDifficulty(levelIndex: 15, name: 'Lv. 15: ์ „๋ฌธ๊ฐ€ (์•„์ด์ฝ˜ 24์žฅ)', contextId: 'FLIP_L15_6x4_ICON', rows: 6, cols: 4, timeLimitSeconds: 120, contentType: CardContentType.icon), + const CardFlipDifficulty(levelIndex: 16, name: 'Lv. 16: ์ „๋ฌธ๊ฐ€ (๋‹จ์–ด 24์žฅ)', contextId: 'FLIP_L16_6x4_PAIR', rows: 6, cols: 4, timeLimitSeconds: 150, contentType: CardContentType.pairWord), - // Phase 5: ์‹ ์˜ ์˜์—ญ - const CardFlipDifficulty(levelIndex: 13, name: 'Lv. 13: ๊ฐ“๋ชจ๋“œ (30์žฅ)', contextId: 'FLIP_L13_6x5', rows: 6, cols: 5, timeLimitSeconds: 130, contentType: CardContentType.emoji), - const CardFlipDifficulty(levelIndex: 14, name: 'Lv. 14: ํƒ€์ž„์–ดํƒ (์—ฐ์‚ฐ)', contextId: 'FLIP_L14_6x5_CALC', rows: 6, cols: 5, timeLimitSeconds: 120, contentType: CardContentType.calculation), - const CardFlipDifficulty(levelIndex: 15, name: 'Lv. 15: ์—”๋“œ๊ฒŒ์ž„ (์—ฐ์ƒ)', contextId: 'FLIP_L15_6x5_PAIR', rows: 6, cols: 5, timeLimitSeconds: 120, contentType: CardContentType.pairWord), + // --- Phase 5: ๋งˆ์Šคํ„ฐ (30์žฅ) --- + const CardFlipDifficulty(levelIndex: 17, name: 'Lv. 17: ๋งˆ์Šคํ„ฐ (์ˆซ์ž 30์žฅ)', contextId: 'FLIP_L17_6x5_NUM', rows: 6, cols: 5, timeLimitSeconds: 150, contentType: CardContentType.number), + const CardFlipDifficulty(levelIndex: 18, name: 'Lv. 18: ๋งˆ์Šคํ„ฐ (์—ฐ์‚ฐ 30์žฅ)', contextId: 'FLIP_L18_6x5_CALC', rows: 6, cols: 5, timeLimitSeconds: 180, contentType: CardContentType.calculation), + const CardFlipDifficulty(levelIndex: 19, name: 'Lv. 19: ๋ ˆ์ „๋“œ (๋‹จ์–ด 30์žฅ)', contextId: 'FLIP_L19_6x5_PAIR', rows: 6, cols: 5, timeLimitSeconds: 180, contentType: CardContentType.pairWord), + const CardFlipDifficulty(levelIndex: 20, name: 'Lv. 20: ๊ฐ“๋ชจ๋“œ (์ด๋ชจ์ง€ 30์žฅ)', contextId: 'FLIP_L20_6x5_EMOJI', rows: 6, cols: 5, timeLimitSeconds: 120, contentType: CardContentType.emoji), - const CardFlipDifficulty(levelIndex: 16, name: 'Lv. 15: ํ—ฌ (์—ฐ์ƒ)', contextId: 'FLIP_L16_6x6_PAIR', rows: 6, cols: 6, timeLimitSeconds: 120, contentType: CardContentType.pairWord), + // --- [๐Ÿ”ฅ ์‹ ๊ทœ] Phase 6: ํ—ฌ๋ชจ๋“œ (6x6 = 36์žฅ) --- + const CardFlipDifficulty( + levelIndex: 21, + name: 'Lv. 21: ํ—ฌ๋ชจ๋“œ (36์žฅ)', + contextId: 'FLIP_L21_6x6_HELL', + rows: 6, + cols: 6, + timeLimitSeconds: 240, + contentType: CardContentType.pairWord + ), ]; static CardFlipDifficulty getLevel(int levelIndex) {