class LevelConfig { final int id; final List 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 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 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 allFaceIds = faceMap.keys.toList();