94 lines
3.5 KiB
Dart
94 lines
3.5 KiB
Dart
|
|
// lib/models/game_level.dart
|
||
|
|
|
||
|
|
// 11단계 레벨의 모든 속성을 정의하는 클래스
|
||
|
|
class GameLevel {
|
||
|
|
final int levelIndex; // 1-11
|
||
|
|
final String name; // "입문 (4x4)"
|
||
|
|
final int blockSize; // 2, 3, 4
|
||
|
|
final int generatorLevel; // 서버에 요청할 생성기 난이도 (1~5)
|
||
|
|
final String contextId; // 랭킹 ID "SUDOKU_4x4_L1"
|
||
|
|
|
||
|
|
// 🔽 [신규] 테마 정책
|
||
|
|
final bool isSequentialNumbers; // L1, L4, L9 (숫자 고정)
|
||
|
|
final bool isSequentialLetters; // L2, L5, L10 (문자 고정)
|
||
|
|
// (둘 다 false이면 HomeScreen에서 선택한 랜덤 테마 사용)
|
||
|
|
|
||
|
|
const GameLevel({
|
||
|
|
required this.levelIndex,
|
||
|
|
required this.name,
|
||
|
|
required this.blockSize,
|
||
|
|
required this.generatorLevel,
|
||
|
|
required this.contextId,
|
||
|
|
this.isSequentialNumbers = false,
|
||
|
|
this.isSequentialLetters = false,
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
// 앱 전역에서 사용할 11단계 레벨 정의
|
||
|
|
class AppLevels {
|
||
|
|
static final List<GameLevel> allLevels = [
|
||
|
|
// --- 2x2 (blockSize = 2) ---
|
||
|
|
const GameLevel(
|
||
|
|
levelIndex: 1, name: "입문 (4x4)", blockSize: 2, generatorLevel: 1,
|
||
|
|
contextId: "SUDOKU_4x4_L1", isSequentialNumbers: true // 👈 순차 숫자
|
||
|
|
),
|
||
|
|
const GameLevel(
|
||
|
|
levelIndex: 2, name: "초급 (4x4)", blockSize: 2, generatorLevel: 3,
|
||
|
|
contextId: "SUDOKU_4x4_L3", isSequentialLetters: true // 👈 순차 문자
|
||
|
|
),
|
||
|
|
const GameLevel(
|
||
|
|
levelIndex: 3, name: "숙련 (4x4)", blockSize: 2, generatorLevel: 5,
|
||
|
|
contextId: "SUDOKU_4x4_L5" // 👈 랜덤 테마
|
||
|
|
),
|
||
|
|
|
||
|
|
// --- 3x3 (blockSize = 3) ---
|
||
|
|
const GameLevel(
|
||
|
|
levelIndex: 4, name: "쉬움 (9x9)", blockSize: 3, generatorLevel: 1,
|
||
|
|
contextId: "SUDOKU_9x9_L1", isSequentialNumbers: true // 👈 순차 숫자
|
||
|
|
),
|
||
|
|
const GameLevel(
|
||
|
|
levelIndex: 5, name: "중급 (9x9)", blockSize: 3, generatorLevel: 2,
|
||
|
|
contextId: "SUDOKU_9x9_L2", isSequentialLetters: true // 👈 순차 문자
|
||
|
|
),
|
||
|
|
const GameLevel(
|
||
|
|
levelIndex: 6, name: "상급 (9x9)", blockSize: 3, generatorLevel: 3,
|
||
|
|
contextId: "SUDOKU_9x9_L3" // 👈 랜덤 테마
|
||
|
|
),
|
||
|
|
const GameLevel(
|
||
|
|
levelIndex: 7, name: "어려움 (9x9)", blockSize: 3, generatorLevel: 4,
|
||
|
|
contextId: "SUDOKU_9x9_L4" // 👈 랜덤 테마
|
||
|
|
),
|
||
|
|
const GameLevel(
|
||
|
|
levelIndex: 8, name: "최상급 (9x9)", blockSize: 3, generatorLevel: 5,
|
||
|
|
contextId: "SUDOKU_9x9_L5" // 👈 랜덤 테마
|
||
|
|
),
|
||
|
|
|
||
|
|
// --- 4x4 (blockSize = 4) ---
|
||
|
|
const GameLevel(
|
||
|
|
levelIndex: 9, name: "전문가 (16x16)", blockSize: 4, generatorLevel: 1,
|
||
|
|
contextId: "SUDOKU_16x16_L1", isSequentialNumbers: true // 👈 순차 숫자
|
||
|
|
),
|
||
|
|
const GameLevel(
|
||
|
|
levelIndex: 10, name: "마스터 (16x16)", blockSize: 4, generatorLevel: 3,
|
||
|
|
contextId: "SUDOKU_16x16_L3", isSequentialLetters: true // 👈 순차 문자
|
||
|
|
),
|
||
|
|
const GameLevel(
|
||
|
|
levelIndex: 11, name: "지옥 (16x16)", blockSize: 4, generatorLevel: 5,
|
||
|
|
contextId: "SUDOKU_16x16_L5" // 👈 랜덤 테마
|
||
|
|
),
|
||
|
|
];
|
||
|
|
|
||
|
|
// 인덱스(1-11)로 레벨 정보 찾기
|
||
|
|
static GameLevel getLevel(int levelIndex) {
|
||
|
|
if (levelIndex < 1) levelIndex = 1;
|
||
|
|
if (levelIndex > allLevels.length) levelIndex = allLevels.length;
|
||
|
|
return allLevels.firstWhere((level) => level.levelIndex == levelIndex,
|
||
|
|
orElse: () => allLevels[0] // 못찾으면 L1 반환
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
// 랭킹 화면용 맵 (ContextId -> 이름)
|
||
|
|
static Map<String, String> get contextIdToNameMap {
|
||
|
|
return { for (var level in allLevels) level.contextId : level.name };
|
||
|
|
}
|
||
|
|
}
|