From 5de30cde5ddc9344db724284f2af47d835457f5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Harrault?= <benoit@harrault.fr> Date: Tue, 11 Feb 2025 15:02:35 +0100 Subject: [PATCH] Add grid generator, add/fix/improve default templates --- .../metadata/android/en-US/changelogs/5.txt | 1 + .../metadata/android/fr-FR/changelogs/5.txt | 1 + generator/.gitignore | 1 + generator/cell.py | 78 ++++++++ generator/cell2.py | 19 ++ generator/functions.py | 108 +++++++++++ generator/generate.py | 81 ++++++++ generator/generate.sh | 3 + generator/shapes.py | 43 +++++ generator/solver.py | 34 ++++ generator/tectonic.py | 106 +++++++++++ lib/data/game_data.dart | 177 ++++++++++++++++-- lib/ui/pages/game.dart | 5 + pubspec.yaml | 2 +- 14 files changed, 640 insertions(+), 19 deletions(-) create mode 100644 fastlane/metadata/android/en-US/changelogs/5.txt create mode 100644 fastlane/metadata/android/fr-FR/changelogs/5.txt create mode 100644 generator/.gitignore create mode 100644 generator/cell.py create mode 100644 generator/cell2.py create mode 100644 generator/functions.py create mode 100644 generator/generate.py create mode 100755 generator/generate.sh create mode 100644 generator/shapes.py create mode 100644 generator/solver.py create mode 100644 generator/tectonic.py diff --git a/fastlane/metadata/android/en-US/changelogs/5.txt b/fastlane/metadata/android/en-US/changelogs/5.txt new file mode 100644 index 0000000..eed3c07 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/5.txt @@ -0,0 +1 @@ +Add grid generator, add default templates. diff --git a/fastlane/metadata/android/fr-FR/changelogs/5.txt b/fastlane/metadata/android/fr-FR/changelogs/5.txt new file mode 100644 index 0000000..9d45ff9 --- /dev/null +++ b/fastlane/metadata/android/fr-FR/changelogs/5.txt @@ -0,0 +1 @@ +Ajout d'un générateur de grilles et de grilles de démarrage. diff --git a/generator/.gitignore b/generator/.gitignore new file mode 100644 index 0000000..bee8a64 --- /dev/null +++ b/generator/.gitignore @@ -0,0 +1 @@ +__pycache__ diff --git a/generator/cell.py b/generator/cell.py new file mode 100644 index 0000000..6035f26 --- /dev/null +++ b/generator/cell.py @@ -0,0 +1,78 @@ +from shapes import * +from functions import * + + +class Cell: + # 1st char = name, 2nd = number of rotations, 3rd = number of reflections + s = {"s1": ["p00"], # List of all the shapes possible, indexed by the number of cells + "s2": ["s00", "s10"], + "s3": ["l00", "l10", + "c00", "c10", "c20", "c30"], + "s4": ["O00", + "J00", "J10", "J20", "J30", "J01", "J11", "J21", "J31", + "i00", "i10", + "z00", "z10", "z01", "z11", + "t00", "t10", "t20", "t30"], + "s5": ["L00", "L10", "L20", "L30", "L01", "L11", "L21", "L31", + "T00", "T10", "T20", "T30", + "N00", "N10", "N20", "N30", "N01", "N11", "N21", "N31", + "Z00", "Z10", "Z01", "Z11", + "I00", "I10", + "P00", "P10", "P20", "P30", "P01", "P11", "P21", "P31", + "W00", "W10", "W20", "W30", + "F00", "F10", "F20", "F30", "F01", "F11", "F21", "F31", + "X00", + "Y00", "Y10", "Y20", "Y30", "Y01", "Y11", "Y21", "Y31"]} + + def __init__(self, co: list, val: int): # Initialisaiton + self.co = co # Coordinates + self.val = val # Value + self.numGroup = None # Number of group + # List of possible positions + self.lpos = [z + 1 for z in range(self.val)] + self.lform = list(Cell.s["s" + str(self.val)] + ) # List of possible forms + self.selForm = None # Selected form + self.selPos = None # Selected position + self.coefx = None # Coefficient of x + self.coefy = None # Coefficient of y + + def give(self): # Give a new form and/or position + if self.selForm == None: + self.selForm = select(extract(self.lform)) + elif len(self.lpos) == 0: + if len(self.lform) == 0: + return False + else: + self.selForm = select(extract(self.lform)) + self.lpos = [z + 1 for z in range(self.val)] + self.selPos = extract(self.lpos) + + z = 0 # Determination of the position of the selected form corresponding to the number + for y in range(len(self.selForm)): + for x in range(len(self.selForm[0])): + if self.selForm[y][x] == 1: + z += 1 + if z == self.selPos: + # Coordinates of the point inside the form + coForme = [y, x] + + self.coefx = self.co[1] - coForme[1] + self.coefy = self.co[0] - coForme[0] + + return True + + def getSelForm(self): + return self.selForm + + def getCoefx(self): + return self.coefx + + def getCoefy(self): + return self.coefy + + def getNum(self): + return self.numGroup + + def setNum(self, num: int): + self.numGroup = num diff --git a/generator/cell2.py b/generator/cell2.py new file mode 100644 index 0000000..cc974ee --- /dev/null +++ b/generator/cell2.py @@ -0,0 +1,19 @@ +class Cell2: + def __init__(self, co: tuple): + self.pos = [1, 2, 3, 4, 5] + self.num = 0 + self.co = co + + def give(self): + if len(self.pos) == 0: + return False + else: + self.num = self.pos[0] + self.pos = self.pos[1:] + return True + + def getNum(self): + return self.num + + def getCo(self): + return self.co diff --git a/generator/functions.py b/generator/functions.py new file mode 100644 index 0000000..73547bc --- /dev/null +++ b/generator/functions.py @@ -0,0 +1,108 @@ +from random import choice + + +def isFin(m, arg): + '''Check if a matrix (m) has a cell with arg in it''' + for i in range(len(m)): + for j in range(len(m[0])): + if m[i][j] == arg: + return True + return False + + +def next(t, tform): + '''Find the next cell without any form in it, and with the biggest number''' + a = [0, None, None] + for i in range(len(t)): + for j in range(len(t[0])): + if tform[i][j] == 0: + if t[i][j] > a[0]: + a[0] = t[i][j] + a[1] = i + a[2] = j + return a + + +def inGrid(cx, cy, tf, tm): + '''Check if a matrix f can fit in a matrix m with the coefficients cx and cy''' + if cx < 0 or cy < 0 or tf[0] + cy > tm[0] or tf[1] + cx > tm[1]: + return False + return True + + +def with0(fo, gr, cx, cy): + '''Check if a form can fit in a formTab''' + for i in range(len(fo)): + for j in range(len(fo[0])): + if fo[i][j] == 1 and gr[i + cy][j + cx] != 0: + return False + return True + + +def allNums(fo, tab, cx, cy): + '''Check if all the nums in the form are from 1 to n''' + liste = [] + for i in range(len(fo)): + for j in range(len(fo[0])): + if fo[i][j] == 1: + liste.append(tab[i + cy][j + cx]) + + liste.sort() + if liste[0] != 1: + return False + for i in range(1, len(liste)): + if liste[i] - liste[i - 1] != 1: + return False + return True + + +def testNear(co, tab): + '''Check if the number at co is not present in the surrounding cells''' + for i in range(-1, 2): + for j in range(-1, 2): + if i != 0 or j != 0: + y = co[0] + i + x = co[1] + j + if y >= 0 and x >= 0 and len(tab) > y and len(tab[0]) > x: + if tab[y][x] == tab[co[0]][co[1]]: + return False + return True + + +def testForm(co, tab, formTab): + '''Check if the numbers in the form are valid''' + l = [] + for i in range(-4, 5): + for j in range(-4, 5): + y = co[0] + i + x = co[1] + j + if y >= 0 and x >= 0 and len(tab) > y and len(tab[0]) > x: + if 0 <= abs(i) + abs(j) < 5: + if formTab[y][x] == formTab[co[0]][co[1]]: + l.append(tab[y][x]) + + l.sort() + if l[-1] > len(l): + return False + l = [elt for elt in l if elt != 0] + for i in range(1, len(l)): + if l[i] == l[i - 1]: + return False + return True + + +def next2(tab): + '''Find the next cell to put a number in''' + for j in range(len(tab)): + for i in range(len(tab[0])): + if tab[j][i] == 0: + return j, i + + +def extract(liste): + '''Choose randomly an item from a list, remove it, and return it''' + if len(liste) > 0: + a = choice(liste) + liste.remove(a) + return a + return None diff --git a/generator/generate.py b/generator/generate.py new file mode 100644 index 0000000..9d080c4 --- /dev/null +++ b/generator/generate.py @@ -0,0 +1,81 @@ +from math import floor +from tectonic import * + + +def build_and_print_grid(size_x, size_y): + print('building ' + str(size_x) + 'x' + str(size_y) + '...') + cells_count = size_x * size_y + + if cells_count > 47: + print('too big') + else: + tab, formTab = generate(size_x, size_y) + if tab == 'Error': + error = '' + for elt in formTab: + for i in elt: + error += str(i) + print( + 'Error : no shape placement configuration found - Code error : ' + str(size_y) + str(size_x) + error) + else: + print('values: ' + str(tab)) + print('blocks: ' + str(formTab)) + + # size + template = str(size_x)+'x'+str(size_y) + template += ';' + + # blocks + max_block_index = 0 + for line in formTab: + for block in line: + template += chr(block+64) + if (block > max_block_index): + max_block_index = block + template += ';' + + # values + empty_cells_count = 0 + for line in tab: + for cell in line: + template += str(cell) + if (cell == 0): + empty_cells_count += 1 + + size = '' + if (cells_count < 26): # < 5x5 + size = 'small' + else: + if (cells_count < 37): # < 6x6 + size = 'medium' + else: + size = 'large' + + ratio = floor(100 * empty_cells_count / cells_count) + + level = '' + if (ratio < 70): # < 5x5 + level = 'easy' + else: + if (ratio < 80): # < 6x6 + level = 'medium' + else: + level = 'hard' + + debug = '' + debug += ' (size:'+size+')' + debug += ' (level:'+level+')' + # debug += ' (blocks:' + str(max_block_index)+')' + # debug += ' (empty:'+str(empty_cells_count)+')' + # debug += ' (ratio:'+str(ratio)+')' + + print('template:' + debug + ' ' + template) + + +size_min = 4 +size_max = 9 + +for count in range(5): + for size_x in range(size_min, size_max + 1): + for size_y in range(size_min, size_max + 1): + build_and_print_grid(size_x, size_y) diff --git a/generator/generate.sh b/generator/generate.sh new file mode 100755 index 0000000..dc97cba --- /dev/null +++ b/generator/generate.sh @@ -0,0 +1,3 @@ +#!/bin/bash -i + +python3 ./generate.py diff --git a/generator/shapes.py b/generator/shapes.py new file mode 100644 index 0000000..b65abd6 --- /dev/null +++ b/generator/shapes.py @@ -0,0 +1,43 @@ +c = {"p": [[1]], # 1 + + "s": [[1, 1]], # 2 + + "l": [[1, 1, 1]], # 3 + "c": [[1, 1], [1, 0]], + + "O": [[1, 1], [1, 1]], # 4 + "J": [[1, 1, 1], [1, 0, 0]], + "i": [[1, 1, 1, 1]], + "z": [[1, 1, 0], [0, 1, 1]], + "t": [[1, 1, 1], [0, 1, 0]], + + "L": [[1, 1, 1, 1], [1, 0, 0, 0]], # 5 + "T": [[1, 0, 0], [1, 1, 1], [1, 0, 0]], + "N": [[0, 1, 1, 1], [1, 1, 0, 0]], + "Z": [[0, 0, 1], [1, 1, 1], [1, 0, 0]], + "I": [[1, 1, 1, 1, 1]], + "P": [[1, 1, 1], [1, 1, 0]], + "W": [[1, 1, 0], [0, 1, 1], [0, 0, 1]], + "F": [[0, 1, 0], [1, 1, 1], [0, 0, 1]], + "X": [[0, 1, 0], [1, 1, 1], [0, 1, 0]], + "Y": [[1, 1, 1, 1], [0, 1, 0, 0]]} + + +def select(name): + na = name[0] + ro = int(name[1]) + re = int(name[2]) + ans = c[na] + for i in range(ro): + ans = rotate(ans) + for i in range(re): + ans = reflect(ans) + return ans + + +def rotate(m): + return [[m[len(m) - j - 1][i] for j in range(len(m))] for i in range(len(m[0]))] + + +def reflect(m): + return m[::-1] diff --git a/generator/solver.py b/generator/solver.py new file mode 100644 index 0000000..b58a7be --- /dev/null +++ b/generator/solver.py @@ -0,0 +1,34 @@ +from cell2 import * +from functions import * + + +def numOfSol(tab, formTab): + all = [] + c = True + state = True + nbSol = 0 + while len(all) > 0 or c: + c = False + if state: + a = next2(tab) + if a != None: + current = a + all.append(Cell2(current)) # Creation of a new element + state = False + current = all[-1].getCo() + + if all[-1].give(): + n = all[-1].getNum() + tab[current[0]][current[1]] = n + if testNear(current, tab) and testForm(current, tab, formTab): + state = True + else: + tab[current[0]][current[1]] = 0 + else: + tab[current[0]][current[1]] = 0 + all.pop() + + if not isFin(tab, 0): + nbSol += 1 + + return nbSol == 1 diff --git a/generator/tectonic.py b/generator/tectonic.py new file mode 100644 index 0000000..d7bf800 --- /dev/null +++ b/generator/tectonic.py @@ -0,0 +1,106 @@ +from random import randint, choice +from cell import * +from solver import * +from functions import * + + +def generate(x, y) -> list: + + xMatrice = x + yMatrice = y + + #### Phase 1 : Creation of a matrix of numbers #### + + tab = [[0 for i in range(xMatrice)] for j in range( + yMatrice)] # Creation of the matrix (empty) + for i in range(yMatrice): + for j in range(xMatrice): + cond = True + while cond: + cond = False + nb = randint(1, 5) + for k in range(-1, 2): + for l in range(-1, 2): + if i + k >= 0 and i + k < yMatrice and j + l >= 0 and j + l < xMatrice and nb == tab[k + i][l + j]: + cond = True + tab[i][j] = nb + + # Counting occurrences of numbers in the matrix + l = [[1, 0], [2, 0], [3, 0], [4, 0], [5, 0]] + for i in range(yMatrice): + for j in range(xMatrice): + a = tab[i][j] + l[a - 1][1] += 1 + + for i in range(1, len(l)): # Sort occurrences in ascending order + j = i + while l[j][1] > l[j - 1][1] and j > 0: + l[j], l[j - 1] = l[j - 1], l[j] + j -= 1 + + t2 = [[0 for i in range(xMatrice)] for j in range(yMatrice)] + # Exchange of the numbers to respect the rule ( nb 1 >= nb 2 >= nb 3 >= nb 4 >= nb 5) + for k in range(len(l)): + for i in range(yMatrice): + for j in range(xMatrice): + if tab[i][j] == l[k][0]: + t2[i][j] = k + 1 + tab = list(t2) + + #### Phase 2 : Setting up shapes #### + + formTab = [[0 for i in range(xMatrice)] for j in range( + yMatrice)] # Creation of the form matrix + all = [] + tailleMatrice = [yMatrice, xMatrice] + state = True + while isFin(formTab, 0): + if state: + current = next(tab, formTab) + # Creation of a new element + all.append(Cell(current[1:], current[0])) + state = False + + if all[-1].give(): # See if the element is finished + forme = all[-1].getSelForm() # Retrieving the shape of the element + # Retrieving of the size of the form + tailleForme = len(forme), len(forme[0]) + # Retrieving of the coefficient in x of the element + coefx = all[-1].getCoefx() + # Retrieving of the coefficient in y of the element + coefy = all[-1].getCoefy() + + if inGrid(coefx, coefy, tailleForme, tailleMatrice): # Verifications + if with0(forme, formTab, coefx, coefy): + if allNums(forme, tab, coefx, coefy): + n = len(all) + # Affectation of the number of the form + all[-1].setNum(n) + for y in range(tailleForme[0]): + for x in range(tailleForme[1]): + if forme[y][x] == 1: + formTab[y + coefy][x + coefx] = n + state = True + else: + all.pop() + if len(all) == 0: + return 'Error', tab + for y in range(len(tab)): + for x in range(len(tab[0])): + if all[-1].getNum() == formTab[y][x]: + formTab[y][x] = 0 + + ### Phase 3 : Clearing some cells ### + + tabCheck = [[False for i in range(xMatrice)] for j in range(yMatrice)] + tabNumber = [[(j, i) for i in range(xMatrice)] for j in range(yMatrice)] + while isFin(tabCheck, False): + y, x = choice(choice(tabNumber)) + if tabCheck[y][x] == False: + save = tab[y][x] + tab[y][x] = 0 + if not numOfSol(tab, formTab): + tab[y][x] = save + tabCheck[y][x] = True + + return tab, formTab diff --git a/lib/data/game_data.dart b/lib/data/game_data.dart index 87c6c6c..0c97fc6 100644 --- a/lib/data/game_data.dart +++ b/lib/data/game_data.dart @@ -7,44 +7,185 @@ class GameData { // }, 'small': { 'easy': [ - // ok - '5x5;AABBBAABBCADECCDDCCFGGGGG;0205030001000300000040003', + '4x4;AAAACADBCCBBCCBB;0004000530200004', + '4x4;AAACAACCBBCDBBBD;0140230000000500', + '4x4;BBAABBAACBADCCCC;0050204000000420', + '4x4;BBAABBAACBADCCCD;2001100040000100', + '4x4;CAAACAABCBBBCCBD;0001052020053000', + '4x4;DDCCAACCAABBABBB;0003304002034000', + '4x5;BAAEBBAABBCADDCCDDCC;25000023000000302100', + '4x5;EAAAAABBCBBBCCDDCCDD;02100300021000000401', + '4x6;AAAEAAEEBBBECBBDCCDDCCDD;020000304500000005052101', + '4x6;DDAADDAABBBABBEECCEEFCCC;205000010230000103000510', + '4x6;EAAAEEAAEBCCBBCCBBCDDDDD;052020400010030002020430', + '5x4;DDDAABBAAABBCCEBCCCE;00050140310310020000', + '5x5;AAFBBAAEBBAEEEBCCCDDCCDDD;0300414030000020023004000', + '5x5;BBAAABBAAEDBCEEDDCCCDDFCG;0000140040120000400520000', + '6x4;BBBAEEBBAAEEDAACCCDDDDCC;012031400000000000504004', + '6x4;DAABBBDAABBEDACCEEDDCCCE;051305400000000040300300', ], 'medium': [ - // duplicate // to replace - '5x5;AAABCAADBBEEEEBEFFFBEEGGG;1000002004504000000000000', + '4x4;AACCBAACBBACBBDD;0020400000001001', + '4x4;CCAACAAACDDBBBBB;0030200030000040', + '4x5;BAAEBBAACBBACCDDCCDD;00201003400000001020', + '4x5;BBBBAABDAAADCCCDCCDD;40100300000000045010', + '4x5;DDAABDAEBAAEBCCCBBCC;03000040000250000003', + '4x5;DDAADAABDABBCBBECCCC;20040000300400005000', + '4x5;DDDBAABBAABBACCCCCEE;20005004020000500002', + '4x6;BAAABBAAEBFCEBFCDDCCDDDC;000440001000000400005040', + '4x6;EEAAEAAAFBBDBBBDCCCDCCDD;100200300000000210002005', + '4x6;EEACEAACBBACBBACFBDDFFDD;305020000000100000000030', + '4x6;EEBBEAABAAABCDDBCCDDCCFD;010105000005000050400002', + '4x6;EEEFABBBAABBAACCDCCCDDDD;000000050200000500003041', + '5x4;AAAABACEEBDCCBBDDCCB;01405000000040030000', + '5x4;AAABBAABBBCCCDDECCDD;20040300002042000000', + '5x4;AADDBAAADBCEEBBCCCCB;00000304020000050300', + '5x4;EAADDAAADDBBBCCBBCCC;00201000000500401020', + '6x4;AAAFDDAABBBDEBBCCDEECCCD;000000300043000010003000', + '6x4;BFAAAEBBAAEEBBCCCCDDDDDC;000000400000100004403000', + '6x4;EEAAADEBAADDFBBCCDBBCCCD;000000003020000005040040', + '6x4;FABBBBAAABEEACCCEDCCDDDD;040040020000300204000000', + '6x4;FBBBAABBCAADEECADDECCCDD;000000005310020003100000', + '6x4;FDAAAABDDDACBBDECCBBEECC;030400000005300002000000', ], 'hard': [ - // to check - '5x5;AAABCAADBBEEEEBEFFFBEEGGG;1000002004504000000000000', + '4x5;DDDDAABBAABBEABCCCCC;04000000305000000005', + '5x4;DDDBEDABBBAAABCACCCC;00020000000200040100', + '5x4;EAAAACCCCAFBBDDBBBDD;00040400000000303000', + '5x5;AAAEEAABBEBBBDFCCGDDCCCDD;0000050000200305000000200', + '5x5;ABBBBAADBFAADDFCCCDDCCEEE;1003005000000004000300000', + '5x5;DDAAADDAAFEBBBFEBBCCEGCCC;0100500000000000003400000', + '5x5;EEADDEAADDCAABBCCCBBGCFFB;0050100030000020000400000', + '5x5;GAAAACCADDCCBDDEEBBFEEBBF;0052002000000040000000000', + '5x5;GABBBAAABBFCAEEFCDDDCCCDD;0013003000000000405000000', ], }, 'medium': { 'easy': [ - // to check - '8x5;ABBBBCDDAABECCDDFAAECCGDFFEEHHGGFFEHHHIG;0005005040300404020500001040000002000500', + '4x7;AABBAABBDACBDCCCDDCEFDEEFFEE;0402300000051000300000002015', + '4x8;BBBABBAACCCACCEADEEEDDFEDDFFGGFF;02055100000001000300000530100005', + '7x4;GCCAABBCCCAABBDDDAEEBDDFFEEE;0000052540214003005014000040', ], 'medium': [ - // to check - '8x5;AABBCCCDAABBCCDDAEBFFGDHIIIFFJJHIIKFJJJH;2020003000000000003050005000000000001050', + '4x7;AAAAAEEEBBBECCBBDCCCDDFFGDDF;1032000001000200000504000000', + '4x7;AABBAABBCADBCCDDCCDDFEEEFFEE;1004005000000300205000000102', + '4x7;BBBBAABDAAADCFFDCFDDCCEECEEE;4000005000010000005001000203', + '4x7;EEAAFEEAFFBAFBBACCBBCCDDCDDD;0205000000030050000000051001', + '4x8;AAAACABBCCBBCCDBDDDDFFGGFFEEFEEE;00044000050300040200000000405010', + '4x8;AAAFAAFFBBBFBBCCDDCCDDCEDGEEGGEE;00003004000120400500000003510000', + '4x8;AAAFBAFFBACFBBCCEBCCEDDDEDDGEEGG;00010400300320000000005000002002', + '4x8;AAHBAAABCCCBCCBBFDDDFFDDEEEGEEGG;00000035000034100000001020500010', + '4x8;FFAHFFAABBAABBCCGBCCGEECDDEEDDDE;00000030000500300040000004003005', + '4x8;FFFABFAABAAGBBGGDBCCDECCDEECDDEE;01005032000000003000000000142020', + '4x8;FFFAFAAAGGACBBCCBBBCHDDCDDEEDEEE;10000000204000003000000220050302', + '4x9;AAACAACCBCCEBBEEDBBEDGFEDGFHDGFHDGFF;350000100400000350000300000000000004', + '4x9;AAACAACCBCCHBBBHDDBEDDEEFDEEFFGGFFGG;320100400000400000000040010000000303', + '4x9;HHAAAAABGGBBGGBBCCDDCDDFCDFFCEEFEEEF;000000104050000050020004003000005025', + '5x6;AABBBAADBBGADDDGCCCDFCCEEFFEEE;000400300000200050000000320050', + '5x6;AAFFBAAFFBACCCBGCCBBDDDEEDDEEE;402003000000000000400530000150', + '5x6;BAAAABFFFABBCCCBDCCGHDEEEDDDEE;400040000005005000000024004000', + '5x6;BGAAABBAACBBFCCDFFCCDDFEEDDEEE;000054031050003000000400510000', + '5x6;GABBBAABBFCAAFFCCCEFCDDEEDDDEE;000300205000000005000000350100', + '5x6;GBBBHGAABBAACEEACCEEDDCCFDDDFF;040000525004000005000100100000', + '5x7;AAABBAABBBEGGJFECCFFECCDFECDDDHHDII;02501000400000040540000000050400000', + '5x7;BBBAABBDAAGDDCAGDCCIEDCCFEEHFFEEHFF;00002040000300010030040002005000101', + '5x7;DGGABDGAABDAABBDCCCBDCCEEFFFEEFFHHE;00000000050010200000500100400250000', + '5x7;GAAHHGAABBGABBBECCCCECFDDEFFDDEEFFD;00301040000000000400010504000000014', + '5x7;HAAGGHABBGAACBBCCCDBECDDDEEFFDEEFFF;04003000000000540001000500400010102', + '6x5;AAAACCFFABCCFFBBECDDDBEEDDGBEE;052001000000000003000201030000', + '6x5;AABBBBFAACDBFFACDDFEECCDGEEECD;050054000000002025040003000000', + '6x5;ABBFFCAABBFCAABECCDDEEECDDDEGG;003000100002300000000000034510', + '6x5;FFFBBGAFBBCCAADBCCADDEECADDEEE;402000000400400000303000000040', + '6x5;GGBBBBAAAEEBAACEEDCCCCDDFFFFDD;000000050005000040000105010004', + '6x6;AAAAHBCCCABBDDCCEBDDDEEBFFEEGGFFFGGG;050000020000400030000054000100020001', + '6x6;BBAAAACBBBHACCCCDDEEDDDGEEFFGGEFFFGG;000003400000020500000000100500404002', + '6x6;BBAAGGBBAAGGBCCADDCCCFDDHEEFFDHEEEFF;000003102002005000200004040300000010', + '6x6;CAABBBCCAABBECADDDECHDDGEEFFGGEFFFGG;000300404050000000000400030023004000', + '7x4;DDDAAEEBBDAAEEBBGACFFBCCCCFF;4000500000004100005002000000', + '7x4;EEEAABGCEAAABFCCDDBBFCCDDDBF;0000000001005052050000000003', + '7x4;GAADBBBAAADDBBFCCDDEEFFCCCEE;0000502320004000000012000000', + '7x5;AAAFFFFAACCBBHECCCBBBEEDDDGGEEDDIGG;05000033402000000003000050000200000', + '7x5;BGGGGAABBBCCAAEBCCCDAEEFFFDDHEEFFDD;00300200000004000005050050000000034', + '7x5;GBBBBHHGAABCCCGAAEECCDDAEEEFDDDFFFF;00200020500300000000104000040010100', + '8x4;ABBEEECCAABBECCCADDBEFFGADDDFFFG;00000042300000300003000040200002', + '8x4;CAAAFFBBCCAAFFBBCCDEEEBGDDDDEEGG;05000005300010300000400004000000', + '8x4;FAAABBBCFFAABBCCGDDEEECCGGDDDEEH;00300000000005053020000400005000', + '8x4;FAAABBBGFFAABBCGFDDDEECCDDHEEECC;00502030400000000520001000003000', + '9x4;FAAAABBHHFGACBBBEEFGGCCDDEEFFGCCDDDE;000001000100004003000200000054003002', + '9x4;HHAAABBCCGAADBBBCCGGDDEEFFCGDDEEEFFF;005301000000000200000000104000500050', ], 'hard': [ - // to check - '8x5;AABCCCDDEEBBCCDDEEFFFGGDEHHFFGGGHHHIIIII;0000100500000200000500014030005001001000', + '4x7;AAGBACCBACBBACBDECDDEEFDEFFD;4000000300000000000000053000', + '4x7;EEAGEAAAEBBADBBBDDDFCCDFCCCH;0200000000000040200000002000', + '4x7;GEEEBBAEBBAHCBAACCDACDDFCDDF;0000400400000004000030400000', + '4x9;FFFHBAFHBAAABBACBDICGDCCGDDCGDEEGEEE;100000000003300000000000300000000050', + '4x9;GGGBGABBAAABACEBCCEEDCCEDHHEDDFFDFFF;010000040000400200000400000000000013', + '4x9;HHAAAAABCBBBCCCBEECDGEEDGGEDFFFDFFID;000000000004500000050000302000400000', + '4x9;HHFFAAFFGAAAGBCCGBBCDDBCDEBCDEEIDEEI;000300000020000000010000000054000050', + '5x6;BAAGCBAAGCBBACCDBFCEDDFEEDDFEE;005001000350000000044000000000', + '5x6;EAAAHEEGAAECGBBCCBBBCDDDDCDFFF;000300000020000400301000000200', + '5x7;FFFAAFAAAGHCBBGHCBBGECCBGEECDDEEDDD;30100000000005003000000004000100030', + '5x7;GGGBBGAABBAAABDCCCDDCCDDEFFHEEFFFEE;40004000020000000000000303000000202', + '5x7;HAAAGHAAGGFFBBCFBBCCFDBCCDDEEEDDIEE;10002000000300000000040102000000000', + '6x5;AAAFCGAABFCCDBBFCCDDBBEEDDEEEH;040040500000000200000000205000', + '6x5;AGBBCCAAABBCFADBHCFDDEECFDDEEE;000000500002000000005000000010', + '6x5;GGAABBAAAFBECCFFBECCDDBEHCDDDE;100000050050100000000001040000', + '6x6;BAAAAHBBBACHDBGGCCDDGGFCDEEEFCDEEFFF;000000400400000000100100000020400000', + '6x6;HHAABBHAAABBFFFCCBFDDECCDDGEECDGGGEE;000305040000000010000003030000100000', + '6x6;IAACCFBAAACFBBBBCFEEEGCFDEEGGHDDDDGH;050000000004400001000000500000104000', + '7x5;CCDAAABCDDGAABCDGGEBBCDFFEBHFFFEEEH;04000005000101000000300000004000000', + '8x4;CAAFFFBBCCAAFDBBGCADDDEBGCHDEEEE;04500005500000000000504000000000', + '9x4;AAAABBBDDAEHBBCDDDEEFFFCCCCEEFFGGGGG;030010000000000205500300000000002000', ], }, 'large': { 'easy': [ - // duplicate // to replace - '5x11;ABBCCDBBCCDDBCEDDFFEGGHEEGGHEIJGHIIJHHKIJLKKILLKMMLLMMM;0003040004000000200000030200000400000003300000400520000', + '5x8;BBBIIAABBCAADDCADDCCEDFFCEEEFFEGGHFGGGHH;0200250530020000000400000304300100450000', ], 'medium': [ - // to check - '5x11;ABBCCDBBCCDDBCEDDFFEGGHEEGGHEIJGHIIJHHKIJLKKILLKMMLLMMM;0003040004000000200000030200000400000003300000400520000', + '5x8;AAABBAABBDICCBDCCHHDCEHFDEEHFDEEGFFGGGGF;1005000000002003000100002000002053030000', + '5x8;AHHHHAAAADBBBCDBBCCDEICCDEEEFDGGEFFGGGFF;0001040004000000400000000500000004240200', + '5x8;BBBAABBAAHDDAHHDCCHEDCCEEDCIEEFFFGGFFGGG;0005050000020040000100004000200000010024', + '5x8;HABBBHAJBIHAABIGGACCGGDCCEDDDCEEDFFEEFFF;0003004000300000000002000040042000000203', + '5x8;IAABBAABBBADDDDCCDEECCCEEFFFFEFHHGGHHGGG;0000420030004200000503400020020000000050', + '5x8;IIBBBAABBDAAADDCCCDDCCFFFEEEFFHEEGGHHGGG;2000450003100040401000020000000400000305', + '5x9;AJBBBAABBCDAACCDDCCEDDEEEGGEFFGGHFFGIHHFIIIHH;003020050040000000000000000300000015000301040', + '5x9;HHHJBHABBBAABCKAACCCDDCELDDEEEDFFGEFFGGGMFGII;004001000040000000040400005050000003000402000', + '6x7;AABBBBAACCBJACCCEEHDDEEEHHDDDGHFFGGGIIFFFG;450040000000000102000300040020000030020000', + '6x7;BAAAAIBBBBAIDDEECCDDEECCDFEGCHFFGGHHFFGGHH;001050403000100000000004500000000000015050', + '6x8;AAJJJDAAABBDCCFBBDCCFFBDCEFFHDGEEEHHGGEHHIGGIIII;050200000003500004000000100000000200000000200430', + '6x8;JAAAAAJBCCDDJBBCDDBBFCCDEEFFFGEEEFGGHHIIIGHHHIIG;201000000003000000200000000300200000000243030000', + '6x8;JAAABDJAABBDCCBBKDCCEEDDCGEEFFGGEFFFGHHHIIGHHIII;001000200054000000500000000010305004000300500004', + '6x8;KKAACCAAABCCDDEBBCDDEEBBDGEEFFGGGFFFIGHHHJIIHHJJ;000001402030010000050340000000000001000002003010', + '7x6;AABCCCIAABBCCIADDBBHHFDDEEEHFFDEEGGJFFGGGK;000010020400001000002230500000000300004000', + '7x6;CCIIAAACCBBBAACFFBBDDFFEHDDDFEEHHGGEEHHGGG;200003000501200000000100000000003050000400', + '7x6;HHABBBJHHAABBEICFAAEEICFDDEECCFDDGGCFFDGGG;300205010030020500000000003000100010000002', + '8x5;HHAEBBBIHHAEBBCCDAAECCCGDDAEEFGGDDFFFFGG;0300500000004000003000000002050043000002', + '8x6;AAAADDDDEEBACCDJEEBBCCCJEBBIFFFJGGIIIHFFGGGHHHHK;040103000050000030000000000010001000000002500100', + '8x6;AACCCBBBKAACCEBBDDAFFEEIDDFFFEJIDHHGGEJIHHHGGGII;500003020005000000000000000000034002000420004000', + '8x6;JJAAAAABJCEEEDBBCCEEDDBBHCCFDDKKHHFFIGGGHFFIIIGG;100020000000050100000004000020000000003000032002', ], 'hard': [ - // duplicate // to replace - '5x11;ABBCCDBBCCDDBCEDDFFEGGHEEGGHEIJGHIIJHHKIJLKKILLKMMLLMMM;0003040004000000200000030200000400000003300000400520000', + '5x8;GGIIAHGGAAHHBAACBBBBCCDDDCCDDFEEJFFEEEFF;0001300000000000000005004000000002020005', + '5x9;BAAAABACCEBCCCEBBJJEDDDEEDDFFGIFFGGIIFGGHHHHH;050000003000000200020105003000050000000004000', + '5x9;BBIIJBBIAADBKAADDCCADCCEEDCEEEFFFFGFHHGGHHHGG;000000200000004000000030040001050000001050004', + '5x9;HAAABHHAABCHDBBCDDDBCIIDFCEIFFCEFFGEEJGGEJJGG;000101000530000001000000000004000000005200030', + '5x9;HCCAAHCAAAHCJBBHCJBBIIJDBIFDDDFFDEEFFEEEGGGGG;010310002000000000000000000040000000000140300', + '5x9;IIABBIAABBAACCBJCCCDJEEDDEEDDFEGFFFGGGFHGHHHH;010000400000004050000000020000000000000120400', + '5x9;JBAHHBBAHHBBACCDAACCDDKGCIDDGEIIGGEIFFGEFFFEE;000020230000000020030000000000000020000040203', + '6x7;BAAAAIBBCAEGBBCCEGFDCCEGFDDDEGFFDHEGFHHHHJ;210000000003000000200400000030000020005000', + '6x7;HAAAAIHHBBAICCBBEECCDBEEFCDDDEFFFDGGFJJGGG;102040000000500002005000000000000000000025', + '6x8;BBAAAAJBBBADJCCCDDKCCDDFKEEEHFEEHHHFGGGHFFGGIIIL;000503000000000500000000000000000100054004000000', + '7x6;AAABBBBAAIICDBFFCCCDJEFFCKDDEEFGGGDEEGGHHH;030430000000000400000000000004540001000000', + '7x6;HHHABBJHAAAABBIFFCCEBIDFCCEEDDFGCEEDDFGGGG;300002000000500000000000040320100000000400', + '8x5;DAAAAIBBDDACCCBBDDEEECCBGGGEEFFFGGHHHFFJ;0000000540000001010000000000002005100000', + '8x5;HAAABBCJHEEAABCCDDEEEBBCIDDFFGGCIDFFFGGG;0050000000000005050400000000000004100501', + '8x5;HHHBBAADCCBBBADDCCGGAADDCGGEFFFFIIIEEEEF;0200050100000404500000200000000000000500', + '8x5;IAHHHBDDIAABBBBDEAACCCCDEEEFFCGDEFFFGGGG;0003030205000000000000000005000001030000', + '8x6;AAAACJDIAEBCCJDIEEBCCJDIEBBFFDDIEBGGFFHHKGGGFHHH;002000000000000050100100000000400000005100002040', + '9x5;GGGGBCIIIAABBBCCCJADDBKKCHJADDEEFFHHADEEEFFFH;020001003100000050200000000050000000000400000', + '9x5;HHBBKCIIIHABBBCCCFHAAAACJFFDDEEEEJGFDDDEGGGGF;402000000000000003100000000300000000004000002', + '9x5;JJBBKAAAIDJBBBAACIDDGGGGCCIHDDEECCFFHHHEEEFFF;000005000030000000014000000000000000100000403', ], }, }; diff --git a/lib/ui/pages/game.dart b/lib/ui/pages/game.dart index e592374..40ec1fe 100644 --- a/lib/ui/pages/game.dart +++ b/lib/ui/pages/game.dart @@ -29,6 +29,11 @@ class PageGame extends StatelessWidget { const GameBoardWidget(), const SizedBox(height: 8), const GameBottomWidget(), + // StyledButton.text( + // onPressed: () => SuguruSolver.checkAllTemplates(), + // caption: '[debug] test all templates', + // color: Colors.red, + // ), const Expanded(child: SizedBox.shrink()), currentActivity.isFinished ? const GameEndWidget() : const SizedBox.shrink(), ], diff --git a/pubspec.yaml b/pubspec.yaml index 65a9362..8baed9f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -3,7 +3,7 @@ description: A suguru game application. publish_to: "none" -version: 0.0.4+4 +version: 0.0.5+5 environment: sdk: "^3.0.0" -- GitLab