209 lines
5.9 KiB
Dart
209 lines
5.9 KiB
Dart
class LevelConfig {
|
||
final int id;
|
||
final List<int> rowPattern;
|
||
final int poolSize;
|
||
final int? flipBackDelayMs;
|
||
final int? maxMistakes;
|
||
final int? timeSec;
|
||
const LevelConfig({
|
||
required this.id,
|
||
required this.rowPattern,
|
||
required this.poolSize,
|
||
this.flipBackDelayMs,
|
||
this.maxMistakes,
|
||
this.timeSec,
|
||
});
|
||
int get rows => rowPattern.length;
|
||
int get maxCols {
|
||
if (rowPattern.isEmpty) return 0;
|
||
int max = rowPattern.first;
|
||
for (final v in rowPattern) {
|
||
if (v > max) max = v;
|
||
}
|
||
return max;
|
||
}
|
||
|
||
int get totalCards {
|
||
int sum = 0;
|
||
for (final v in rowPattern) {
|
||
sum += v;
|
||
}
|
||
return sum;
|
||
}
|
||
}
|
||
|
||
// 15关高难度配置:16张牌起步,容错/时间/延迟全程递减,布局多样,行数≤8
|
||
const List<LevelConfig> levels = [
|
||
// 第1关:16张(4×4),基础高难起步
|
||
LevelConfig(
|
||
id: 1,
|
||
rowPattern: [4, 4, 4, 4],
|
||
poolSize: 8,
|
||
flipBackDelayMs: 600,
|
||
maxMistakes: 50,
|
||
timeSec: 90,
|
||
),
|
||
// 第2关:16张(5+3+5+3),4行交错非对称,记忆干扰提升
|
||
LevelConfig(
|
||
id: 2,
|
||
rowPattern: [5, 3, 5, 3],
|
||
poolSize: 8,
|
||
flipBackDelayMs: 580,
|
||
maxMistakes: 45,
|
||
timeSec: 85,
|
||
),
|
||
// 第3关:18张(3×6),6行紧凑布局,行数增加+牌数提升
|
||
LevelConfig(
|
||
id: 3,
|
||
rowPattern: [3, 3, 3, 3, 3, 3],
|
||
poolSize: 9,
|
||
flipBackDelayMs: 550,
|
||
maxMistakes: 40,
|
||
timeSec: 80,
|
||
),
|
||
// 第4关:18张(6+4+4+4),4行非对称,宽列+短列混合
|
||
LevelConfig(
|
||
id: 4,
|
||
rowPattern: [6, 4, 4, 4],
|
||
poolSize: 9,
|
||
flipBackDelayMs: 520,
|
||
maxMistakes: 38,
|
||
timeSec: 78,
|
||
),
|
||
// 第5关:20张(5×4),4行满列,牌数再提升+列数增加
|
||
LevelConfig(
|
||
id: 5,
|
||
rowPattern: [5, 5, 5, 5],
|
||
poolSize: 10,
|
||
flipBackDelayMs: 500,
|
||
maxMistakes: 35,
|
||
timeSec: 75,
|
||
),
|
||
// 第6关:20张(4+6+4+6),4行交错宽列,视觉复杂度升级
|
||
LevelConfig(
|
||
id: 6,
|
||
rowPattern: [4, 6, 4, 6],
|
||
poolSize: 10,
|
||
flipBackDelayMs: 480,
|
||
maxMistakes: 32,
|
||
timeSec: 70,
|
||
),
|
||
// 第7关:24张(4×6),6行满列,牌数大幅提升+行数拉满6行
|
||
LevelConfig(
|
||
id: 7,
|
||
rowPattern: [4, 4, 4, 4, 4, 4],
|
||
poolSize: 12,
|
||
flipBackDelayMs: 450,
|
||
maxMistakes: 30,
|
||
timeSec: 68,
|
||
),
|
||
// 第8关:24张(7+5+7+5),4行极限交错,宽列差提升记忆难度
|
||
LevelConfig(
|
||
id: 8,
|
||
rowPattern: [6, 5, 6, 5],
|
||
poolSize: 12,
|
||
flipBackDelayMs: 420,
|
||
maxMistakes: 28,
|
||
timeSec: 65,
|
||
),
|
||
// 第9关:28张(4×7),7行布局,行数接近上限+牌数再提升
|
||
LevelConfig(
|
||
id: 9,
|
||
rowPattern: [4, 4, 4, 4, 4, 4, 4],
|
||
poolSize: 14,
|
||
flipBackDelayMs: 400,
|
||
maxMistakes: 25,
|
||
timeSec: 60,
|
||
),
|
||
// 第10关:28张(6+5+6+5+6),5行非对称,不规则布局增加记忆压力
|
||
LevelConfig(
|
||
id: 10,
|
||
rowPattern: [6, 5, 6, 5, 6],
|
||
poolSize: 14,
|
||
flipBackDelayMs: 380,
|
||
maxMistakes: 22,
|
||
timeSec: 58,
|
||
),
|
||
// 第11关:30张(5×6),6行满列,牌数达中高段峰值+列数5列
|
||
LevelConfig(
|
||
id: 11,
|
||
rowPattern: [5, 5, 5, 5, 5, 5],
|
||
poolSize: 15,
|
||
flipBackDelayMs: 350,
|
||
maxMistakes: 20,
|
||
timeSec: 55,
|
||
),
|
||
// 第12关:30张(7+8+7+8),4行超宽列,列数拉满8列+极端非对称
|
||
LevelConfig(
|
||
id: 12,
|
||
rowPattern: [6, 6, 6, 6],
|
||
poolSize: 15,
|
||
flipBackDelayMs: 320,
|
||
maxMistakes: 18,
|
||
timeSec: 50,
|
||
),
|
||
// 第13关:36张(6×6),6行满列,牌数大幅提升+高列数,记忆量拉满
|
||
LevelConfig(
|
||
id: 13,
|
||
rowPattern: [6, 6, 6, 6, 6, 6],
|
||
poolSize: 18,
|
||
flipBackDelayMs: 300,
|
||
maxMistakes: 15,
|
||
timeSec: 48,
|
||
),
|
||
// 第14关:40张(5×8),8行上限,行数拉满+牌数峰值,布局压力拉满
|
||
LevelConfig(
|
||
id: 14,
|
||
rowPattern: [5, 5, 5, 5, 5, 5, 5, 5],
|
||
poolSize: 20,
|
||
flipBackDelayMs: 280,
|
||
maxMistakes: 10,
|
||
timeSec: 45,
|
||
),
|
||
// 第15关:40张(8+7+8+7+8+7),6行极致交错,全关难度顶峰
|
||
LevelConfig(
|
||
id: 15,
|
||
rowPattern: [6, 6, 6, 6, 6, 6],
|
||
poolSize: 20,
|
||
flipBackDelayMs: 250,
|
||
maxMistakes: 5,
|
||
timeSec: 40,
|
||
),
|
||
];
|
||
|
||
const Map<String, String> faceMap = {
|
||
'dx': 'faces/96a3be3cf272e017046d1b2674a52bd3.png',
|
||
'ht': 'faces/a2ef406e2c2351e0b9e80029c909242d.png',
|
||
'hx': 'faces/e45ee7ce7e88149af8dd32b27f9512ce.png',
|
||
'hl': 'faces/7d0665438e81d8eceb98c1e31fca80c1.png',
|
||
'js': 'faces/751d31dd6b56b26b29dac2c0e1839e34.png',
|
||
'kl': 'faces/faeac4e1eef307c2ab7b0a3821e6c667.png',
|
||
'm': 'faces/d72d187df41e10ea7d9fcdc7f5909205.png',
|
||
'mf': 'faces/fad6f4e614a212e80c67249a666d2b09.png',
|
||
'mty': 'faces/0a8005f5594bd67041f88c6196192646.png',
|
||
'xg': 'faces/d3d9446802a44259755d38e6d163e820.png',
|
||
'xj': 'faces/6512bd43d9caa6e02c990b0a82652dca.png',
|
||
'xm': 'faces/c20ad4d76fe97759aa27a0c99bff6710.png',
|
||
'xt': 'faces/c51ce410c124a10e0db5e4b97fc2af39.png',
|
||
'xy': 'faces/aab3238922bcc25a6f606eb525ffdc56.png',
|
||
'xz': 'faces/9bf31c7ff062936a96d3c8bd1f8f2ff3.png',
|
||
'xz1': 'faces/c74d97b01eae257e44aa9d5bade97baf.png',
|
||
'xz2': 'faces/70efdf2ec9b086079795c442636b55fb.png',
|
||
'xz3': 'faces/6f4922f45568161a8cdf4ad2299f6d23.png',
|
||
'xz4': 'faces/1f0e3dad99908345f7439f8ffabdffc4.png',
|
||
'xz5': 'faces/98f13708210194c475687be6106a3b84.png',
|
||
'xz6': 'faces/3c59dc048e8850243be8079a5c74d079.png',
|
||
'22': 'faces/b6d767d2f8ed5d21a44b0e5886680cb9.png',
|
||
'23': 'faces/37693cfc748049e45d87b8c7d8b9aacd.png',
|
||
'24': 'faces/1ff1de774005f8da13f42943881c655f.png',
|
||
'25': 'faces/8e296a067a37563370ded05f5a3bf3ec.png',
|
||
'26': 'faces/4e732ced3463d06de0ca9a15b6153677.png',
|
||
'27': 'faces/02e74f10e0327ad868d138f2b4fdd6f0.png',
|
||
'28': 'faces/33e75ff09dd601bbe69f351039152189.png',
|
||
'29': 'faces/6ea9ab1baa0efb9e19094440c317e21b.png',
|
||
'30': 'faces/34173cb38f07f89ddbebc2ac9128303f.png',
|
||
'31': 'faces/c16a5320fa475530d9583c34fd356ef5.png',
|
||
};
|
||
|
||
final List<String> allFaceIds = faceMap.keys.toList();
|