java - Java中基于位板的数组生成问题

标签 java arrays bit-manipulation

我正在制作一个高级的国际象棋引擎来娱乐。我想使用位板来监视我的棋子的位置,但是,这东西不起作用。我已经编写了将二进制数字字符串转换为数字表示形式的方法,以便可以将其存储在 long 中。我已经验证该程序的该部分有效。我的问题是 to array 方法,它返回一个缺少车的数组而不是一个填充的数组。

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

[ 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]

这就是我得到的:

[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] 

这是国际象棋类的源代码:

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;
    }
}

非常感谢任何和所有帮助!

编辑*

抱歉,我输入了错误的代码!

最佳答案

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

public static void arrayToBitboards(String[][] chessBoard) {
    ...
}

调用:

arrayToBitboards(chessBoard);

关于java - Java中基于位板的数组生成问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30634237/

相关文章:

java - 如何将exe文件转换为.jar文件?

java - 将 if 语句转换为三元运算符 - 编译器提示它不是语句

JavaScript - 如何增加记录中数据的计数器

c++ - 获取 'ones' 数字在 C float 的 base-2 表示中的位置

c - 如果你将一个 big int 转换为 float 会发生什么

java - 访问远程数据库是否必须在android中编写Contract、Provider和DbHelper?

arrays - 尼姆 : find the index of an item in an array or sequence

javascript - 等分值算法

Java - 按位比较和移位

java - 通过 apache poi 读取 excel 文件(位于类路径中)