Closed T0nyX1ang closed 7 months ago
我们以Hitori为例,讲一下如何给一个puzzle增加初始条件。
首先是前端部分:这些puzzle前端部分的代码主要在static/noq/elves.js中。以Hitori为例,首先在代码最后的
let elf_types = { ... }
中找到
hitori: HitoriElf,
可以发现,Hitori前端完全依靠HitoriElf。随后我们在文件中查找HitoriElf的定义部分并进行修改:
class HitoriElf extends
增加初始条件其实只需要把extends的class变为
DirectSum( class, BgColorElf({'x': ['black', 'darkgray']}, false) )
即可,也就是在原先的基础上加了一个BgColorElf,初始条件设定使用BgColorElf即可。注意到设置颜色(初始值)一般是用x键,但Hitori的LetterElf把x键给占了(被我们魔改掉了),因此这里我们把设置初始值的按键改为x。
到此前端部分修改完毕。下面修改后端部分:
在solvers文件夹下找到hitori.py,找到里面的solve函数,打印一下E.clues可以发现,加了颜色之后发现clues中对应的value会从(比如)4变为['4', 'black']。因此我们可以把含有gray的格子加上必须染色的约束,并把相应的value从['4', 'gray']改回4:
K = list(E.clues.keys()) for i, (r, c) in enumerate(K): if isinstance(E.clues[(r, c)], list): num, color = E.clues[(r, c)] assert color == 'black' require(s.grid[r][c]) E.clues[(r, c)] = int(num) if '0' <= num <= '9' else num
这样初始条件就加好啦!
在solver中增加初始条件
我们以Hitori为例,讲一下如何给一个puzzle增加初始条件。
首先是前端部分:这些puzzle前端部分的代码主要在static/noq/elves.js中。以Hitori为例,首先在代码最后的
中找到
可以发现,Hitori前端完全依靠HitoriElf。随后我们在文件中查找HitoriElf的定义部分并进行修改:
增加初始条件其实只需要把extends的class变为
即可,也就是在原先的基础上加了一个BgColorElf,初始条件设定使用BgColorElf即可。注意到设置颜色(初始值)一般是用x键,
但Hitori的LetterElf把x键给占了(被我们魔改掉了),因此这里我们把设置初始值的按键改为x。到此前端部分修改完毕。下面修改后端部分:
在solvers文件夹下找到hitori.py,找到里面的solve函数,打印一下E.clues可以发现,加了颜色之后发现clues中对应的value会从(比如)4变为['4', 'black']。因此我们可以把含有gray的格子加上必须染色的约束,并把相应的value从['4', 'gray']改回4:
这样初始条件就加好啦!