首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java中基于Bitboard的数组生成问题

Java中基于Bitboard的数组生成问题
EN

Stack Overflow用户
提问于 2015-06-04 03:01:39
回答 1查看 95关注 0票数 1

我正在做一个高级国际象棋引擎来取乐。我想使用位板来监测我的作品的位置,然而,这东西是不起作用的。我已经编写了将二进制数字串转换成数字表示的方法,这样它就可以存储在很长的时间内。我已经证实了这个计划的那一部分是可行的。我的问题是to数组方法,它返回一个缺少一个rook的数组,而不是一个填充的数组。

这是我在调用该方法时所期望的结果:

代码语言:javascript
复制
[ r, n, b, q, k, b, n, r]
[ p, p, p, p, p, p, p, p]
[  ,  ,  ,  ,  ,  ,  ,  ]
[  ,  ,  ,  ,  ,  ,  ,  ]
[  ,  ,  ,  ,  ,  ,  ,  ]
[  ,  ,  ,  ,  ,  ,  ,  ]
[ P, P, P, P, P, P, P, P]
[ R, N, B, Q, K, B, N, R]

我得到的是:

代码语言:javascript
复制
[r, n, b, q, k, b, n, r]
[p, p, p, p, p, p, p, p]
[ ,  ,  ,  ,  ,  ,  ,  ]
[ ,  ,  ,  ,  ,  ,  ,  ]
[ ,  ,  ,  ,  ,  ,  ,  ]
[ ,  ,  ,  ,  ,  ,  ,  ]
[P, P, P, P, P, P, P, P]
[ , N, B, Q, K, B, N, R] 

以下是国际象棋类的源代码:

代码语言:javascript
复制
package chess2;
import com.google.common.base.*;
import java.util.*;

public class Chess {
    private static long WR = 0L;
    private static long WN = 0L;
    private static long WB = 0L;
    private static long WQ = 0L;
    private static long WK = 0L;
    private static long WP = 0L;
    private static long BR = 0L;
    private static long BN = 0L;
    private static long BB = 0L;
    private static long BQ = 0L;
    private static long BK = 0L;
    private static long BP = 0L;
    private static double time;
    private static Scanner read;
    //private static long EP = 0L;

    public Chess(int id) {
        String wR = "1000000100000000000000000000000000000000000000000000000000000000";
        String wN = "0100001000000000000000000000000000000000000000000000000000000000";
        String wB = "0010010000000000000000000000000000000000000000000000000000000000";
        String wQ = "0000100000000000000000000000000000000000000000000000000000000000";
        String wK = "0001000000000000000000000000000000000000000000000000000000000000";
        String wP = "0000000011111111000000000000000000000000000000000000000000000000";
        String bR = "0000000000000000000000000000000000000000000000000000000010000001";
        String bN = "0000000000000000000000000000000000000000000000000000000001000010";
        String bB = "0000000000000000000000000000000000000000000000000000000000100100";
        String bQ = "0000000000000000000000000000000000000000000000000000000000001000";
        String bK = "0000000000000000000000000000000000000000000000000000000000010000";
        String bP = "0000000000000000000000000000000000000000000000001111111100000000";
        String time1 = stringToLong(wR, wN, wB, wQ, wK, wP, bR, bN, bB, bK, bQ, bP);
        read = new Scanner(time1);
        time = read.nextDouble();
    }

    public static String stringToLong(String wR2, String wN2, String wB2,
            String wQ2, String wK2, String wP2, String bR2, String bN2,
            String bB2, String bK2, String bQ2, String bP2) {
        Stopwatch timer = Stopwatch.createUnstarted();
        timer.start();
        WR = stringToLong(wR2);
        WN = stringToLong(wN2);
        WB = stringToLong(wB2);
        WQ = stringToLong(wQ2);
        WK = stringToLong(wK2);
        WP = stringToLong(wP2);
        BR = stringToLong(bR2);
        BN = stringToLong(bN2);
        BB = stringToLong(bB2);
        BQ = stringToLong(bQ2);
        BK = stringToLong(bK2);
        BP = stringToLong(bP2);
        String time = timer.stop().toString();
        return time;
    }

    public static long stringToLong(String Binary) {
        if (Binary.charAt(0) =='0') { //not going to be a negative number
            return Long.parseLong(Binary, 2);
        } 
        else { //is negative
            return Long.parseLong("1" + Binary.substring(2), 2) * 2;
        }
    }

    public double getTime() {
        return time;
    }

    public String toString() {
        return ("" + WR + " \n" + WN + " \n" + WB + " \n" + WQ + " \n" + WK + " \n" + WP + " \n"+
                   + BR + " \n" + BN + " \n" + BB + " \n" + BQ + " \n" + BK + " \n" + BP + " \n");
    }

    public String[][] toArray() {
        String chessBoard[][] = new String[8][8];
        for (int i = 0; i < 64; i++) {
            chessBoard[i / 8][i % 8] = " ";
        }
        for (int i=0;i<64;i++) {
            if (((WP >> i) & 1) == 1) {
                chessBoard[i/8][i%8]="P";
            }
            else if (((WN >> i) & 1) == 1) {
                chessBoard[i/8][i%8]="N";
            }
            else if (((WB >> i) & 1) == 1) {
                chessBoard[i/8][i%8]="B";
            }
            else if (((WR >> i) & 1) == 1) {
                chessBoard[i/8][i%8]="R";
            }
            else if (((WQ >> i) & 1) == 1) {
                chessBoard[i/8][i%8]="Q";
            }
            else if (((WK >> i) & 1) == 1) {
                chessBoard[i/8][i%8]="K";
            }
            else if (((BP >> i) & 1) == 1) {
                chessBoard[i/8][i%8]="p";
            }
            else if (((BN >> i) & 1) == 1) {
                chessBoard[i/8][i%8]="n";
            }
            else if (((BB >> i) & 1) == 1) {
                chessBoard[i/8][i%8]="b";
            }
            else if (((BR >> i) & 1) == 1) {
                chessBoard[i/8][i%8]="r";
            }
            else if (((BQ >> i) & 1) == 1) {
                chessBoard[i/8][i%8]="q";
            }
            else if (((BK >> i) & 1) == 1) {
                chessBoard[i/8][i%8]="k";
            }
        }
        return chessBoard;
    }
}

所有的帮助都是非常感谢的!

编辑*

对不起,我把密码放错了!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-04 04:45:19

不要将long变量(如WPWNWB等)传递给arrayToBitboards函数,因为如果这样做,那么在函数中设置的值将只是参数变量,而不是类中的成员变量。

代码语言:javascript
复制
public static void arrayToBitboards(String[][] chessBoard) {
    ...
}

打电话:

代码语言:javascript
复制
arrayToBitboards(chessBoard);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30634237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档