python-chinese-chess icon indicating copy to clipboard operation
python-chinese-chess copied to clipboard

当前代码棋盘hash实现似乎有问题?

Open mycve opened this issue 9 months ago • 4 comments

`import cchess

move1 = cchess.Move(cchess.H2, cchess.E2) # 炮二平五 move2 = cchess.Move(cchess.B2, cchess.E2) # 马二进三 move3 = cchess.Move(cchess.I3, cchess.I4) # 兵七进一 (假设I3是兵的某个位置)

print(f"Move1: {move1.uci()}, Hash: {move1.hash()}") print(f"Move2: {move2.uci()}, Hash: {move2.hash()}") print(f"Move3: {move3.uci()}, Hash: {move3.hash()}")

test_dict = {} test_dict[move1] = "炮二平五" test_dict[move2] = "马二进三" test_dict[move3] = "兵七进一" print(f"Dict size: {len(test_dict)}") for k,v in test_dict.items(): print(f" Dict Key: {k.uci()}, Value: {v}")

print(f"cchess.H2 = {cchess.H2}, cchess.E2 = {cchess.E2}")`

输出:

Move1: h2e2, Hash: 5740354900026072187 Move2: b2e2, Hash: 5740354900026072187 Move3: i3i4, Hash: 5740354900026072187 Dict size: 1 Dict Key: h2e2, Value: 兵七进一 cchess.H2 = 25, cchess.E2 = 22 `

存在相同hash

mycve avatar May 20 '25 07:05 mycve

我好像没有给Move类实现hash方法,您看看是怎么回事?

windshadow233 avatar May 20 '25 07:05 windshadow233

我好像没有给Move类实现hash方法,您看看是怎么回事?

`import cchess

move1 = cchess.Move(cchess.H2, cchess.E2) # 炮二平五 move2 = cchess.Move(cchess.B2, cchess.E2) # 马二进三 move3 = cchess.Move(cchess.I3, cchess.I4) # 兵七进一 (假设I3是兵的某个位置)

print(f"Move1: {move1.uci()}, Hash: {hash(move1)}") print(f"Move2: {move2.uci()}, Hash: {hash(move2)}") print(f"Move3: {move3.uci()}, Hash: {hash(move3)}")

test_dict = {} test_dict[move1] = "炮二平五" test_dict[move2] = "马二进三" test_dict[move3] = "兵七进一" print(f"Dict size: {len(test_dict)}") for k,v in test_dict.items(): print(f" Dict Key: {k.uci()}, Value: {v}")

print(f"cchess.H2 = {cchess.H2}, cchess.E2 = {cchess.E2}")`

这个issue自动把我贴的下划线去掉了变成了hash(),现在用hash(move3)调用,因为我看到你 @dataclasses.dataclass(unsafe_hash=True) class Move: 存在这个hash。

mycve avatar May 20 '25 07:05 mycve

哈哈,原来如此,草率了。因为没考虑过要给Move一个hash值,所以没注意这些。

直接定义:


    def __hash__(self):
        return hash((self.from_square, self.to_square))

是否能满足您的需求?

windshadow233 avatar May 20 '25 07:05 windshadow233

哈哈,原来如此,草率了。因为没考虑过要给Move一个hash值,所以没注意这些。

直接定义:

def __hash__(self):
    return hash((self.from_square, self.to_square))

是否能满足您的需求?

看着似乎没问题

mycve avatar May 20 '25 07:05 mycve