本质上,我试图创建一个连接四个人工智能,我遇到了一篇文章,它使用位板优化移动和检查的胜利。基本上,我从git hub自述文件中获取了一些方法,这些方法本应在位板上执行移动和撤消移动不幸的是,这些方法似乎不能正常工作,因为它将这些方法放在位字符串的末尾,而不是将它们间隔7。我假设这可能是一些java的东西,阻止了它们正常工作,我已经发布了一个示例程序,下面我认为它准确地演示了问题。例如,如果我设置一个长变量,使它在第五行有一行四个1,并显示它。它显示正确,没有开始的零,但另一方面,如果我添加三个标记到第一列。第三栏有三个记号。它显示为111和111。应该什么时候
000000000000000000000000011100000000000000
000000000000000000000000000000000000000111
没有前导零
11100000000000000
111
然后,如果我用这些column drops 1,3,1,3,2,4运行另一个测试,应该会导致这个board状态。
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| X | | O | | | | |
| X | X | O | O | | | |
-----------------------------
它显示10,10当它应该是
000000000000000000001000001100000000000000
000000000000000000000000000000000010000011
或
1000001100000000000000
10000011
下面是演示第二个场景的一些测试代码。在这一点上,我不知所措,因为这些方法的操作是相当优雅和复杂的,虽然他们只有3行代码,如果有人能告诉我什么是错误的,我会非常感激。干杯!
public class EConnectFour {
private static int[] height = {0, 0, 0, 0, 0, 0, 0};
private static int counter = 0;
private static int[] moves = new int[42];
private static long[] bitBoard = new long[2];
public static void main(String[] args) {
long TOP = 0b0000000001000000100000010000001000000000000000000L;
System.out.println(Long.toBinaryString(TOP));
makeMove(1);
makeMove(3);
makeMove(1);
makeMove(3);
makeMove(2);
makeMove(4);
System.out.println(Long.toBinaryString(bitBoard[0]));
System.out.println(Long.toBinaryString(bitBoard[1]));
}
private static boolean isWin(long board) {
int[] directions = {1, 7, 6, 8};
long bb;
for(int direction : directions) {
bb = board & (board >> direction);
if ((bb & (bb >> (2 * direction))) != 0) return true;
}
return false;
}
private static void makeMove(int column) {
long move = 1L << height[column]++;
bitBoard[counter & 1] ^= move;
moves[counter++] = column;
}
private static void undoMove() {
int column = moves[--counter];
long move = 1L << --height[column];
bitBoard[counter & 1] ^= move;
}
}
1条答案
按热度按时间7tofc5zh1#
你不小心把代币丢进了第一个相同的插槽。
替换:
你提到的
column
关闭1(java中的arrray是0索引的)。跑步结束时,高度如下所示:您可以通过以下方法解决此问题:
makemove的最终版本:
undomove版本: