Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何处理非常大的比特板_Python_C++_Bitboard - Fatal编程技术网

Python 如何处理非常大的比特板

Python 如何处理非常大的比特板,python,c++,bitboard,Python,C++,Bitboard,我正在开发一款两人棋盘游戏(如connect 4),棋盘大小为h,w。我想使用硬件大小的比特板检查获胜条件 在像国际象棋这样的游戏中,棋盘大小是固定的,位棋盘通常用某种64位整数表示。当h和w不是常数并且可能非常大(假设为30*30)时,比特板是个好主意吗?如果是这样的话,C/C++中处理大位板的任何数据类型都能保持其性能吗 由于我目前正在研究python,因此也非常感谢使用这种语言的解决方案!:) 提前感谢我不久前写了这段代码,只是为了玩玩游戏的概念。不涉及智力行为。只是随机移动来演示游戏。我

我正在开发一款两人棋盘游戏(如connect 4),棋盘大小为h,w。我想使用硬件大小的比特板检查获胜条件

在像国际象棋这样的游戏中,棋盘大小是固定的,位棋盘通常用某种64位整数表示。当h和w不是常数并且可能非常大(假设为30*30)时,比特板是个好主意吗?如果是这样的话,C/C++中处理大位板的任何数据类型都能保持其性能吗

由于我目前正在研究python,因此也非常感谢使用这种语言的解决方案!:)


提前感谢

我不久前写了这段代码,只是为了玩玩游戏的概念。不涉及智力行为。只是随机移动来演示游戏。我想这对你来说并不重要,因为你只是想快速检查获胜的条件。这个实现很快,因为我尽了最大努力避免for循环,并且只使用内置python/numpy函数(使用了一些技巧)

如果你有任何问题,请告诉我

更新:说明:

每次移动时,查看穿过当前单元格的列、行、对角线和次对角线,并找到具有当前符号的连续单元格。避免扫描整个电路板

在每个方向提取单元格:

专栏:

current_col = S[:,current_col_idx]
行:

对角线: 找到所需对角线相对于基准面的偏移量 主对角线:

diag_offset = current_col_idx - current_row_idx
current_diag = S.diagonal(offset)
非对角:

diag_offset = current_col_idx - current_row_idx
current_diag = S.diagonal(offset)
反转矩阵的行:

S_reversed_rows = S[::-1,:]
在新矩阵中查找行索引

new_row_idx = row_size - 1 - current_row_idx
current_offdiag = S.diagonal(offset)

< C >还是C++中>他们是不同的语言。在C++中你可以使用。游戏中什么是获胜条件?我想这和解决这个问题有很大关系。C++安东森。Redings位集注释:如果位集的大小在编译时未知,则可以使用std::vector或boost::dynamic_位集。@RoddeyFrost k平铺一行。我发现Ammer的答案非常鼓舞人心,可以尝试实现一个通用算法
new_row_idx = row_size - 1 - current_row_idx
current_offdiag = S.diagonal(offset)