T0nyX1ang / noqx

Extended logic puzzle solver of noq.
https://noqx.tonyxiang.site/
GNU General Public License v3.0
3 stars 0 forks source link

[Feature] Add initial conditions in puzzles #1

Closed T0nyX1ang closed 7 months ago

T0nyX1ang commented 8 months ago

在solver中增加初始条件

我们以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

这样初始条件就加好啦!