📄 activeboard.java
字号:
}
case 3://马,蹩腿
return squares[Move.src + HORSE_LEG_TABLE[Move.dst - Move.src + 21]]==0;
case 2://象,塞象眼
return squares[(Move.src + Move.dst) >> 1]==0;
default://仕将卒,无特别规则
return true;
}
}
//将状态检测
public boolean checked(int Side) {
int SrcSq, Side7, BitFileWord, BitRankWord;
SrcSq = pieces[(Side + 1) << 4];
if (SrcSq == -1) {
return true; // 被将
}
BitFileWord = bitFiles[FILE[SrcSq]];
BitRankWord = bitRanks[RANK[SrcSq]];
SrcSq = PreMoveNodesGen.KingIndex[SrcSq];
if (SrcSq == -1) {
return true; // 将出九宫?
}
Side7 = Side!=0 ? 7 : 0;
if (((PreMoveNodesGen.FileRookCheck[SrcSq][BitFileWord].opXor(PreMoveNodesGen.RankRookCheck[SrcSq][BitRankWord])).opAnd(pieceBits[7 - Side7].opXor(pieceBits[11 - Side7]))).notZero()) {
return true; // 老将会面或被车将
}
if (((PreMoveNodesGen.FileCannonCheck[SrcSq][BitFileWord].opXor(PreMoveNodesGen.RankCannonCheck[SrcSq][BitRankWord])).opAnd(pieceBits[12 - Side7])).notZero()){
return true; // 炮
}
BitBoard tmpBit00 = PreMoveNodesGen.CheckLegs[SrcSq];//别马腿的位置
BitBoard tmpBit0 = tmpBit00.opAnd(allPieces);//别马腿的位置有子的位置
int tmpI = BitBoard.CheckSum(PreMoveNodesGen.CheckLegs[SrcSq].opAnd(allPieces));
int tmpI2 = BitBoard.CheckSum(tmpBit0);//tmpI==tmpI2?
BitBoard tmpBit1 = PreMoveNodesGen.KnightPinCheck[SrcSq][tmpI];//马将军不蹩腿的位置(实际)
BitBoard tmpBit2 = pieceBits[10 - Side7];
BitBoard tmpBit3 = tmpBit1.opAnd(tmpBit2);
if ((PreMoveNodesGen.KnightPinCheck[SrcSq][BitBoard.CheckSum(PreMoveNodesGen.CheckLegs[SrcSq].opAnd(allPieces))].opAnd(pieceBits[10 - Side7])).notZero()) {
return true; // 马将
}
if ((PreMoveNodesGen.PawnCheck[SrcSq].opAnd(pieceBits[13 - Side7])).notZero()) {
return true; // 兵将
}
return false;
}
// 重复检测
private final int loopMove = 1;
private final int perpCheckMove = 2;
private final int oppPerpCheckMove = 4;
public int loopValue(int Arg, int MoveNum) {
return ((Arg & perpCheckMove)!=0 ? MoveNum + 1 - CCEvalue.MaxValue : 0) + ((Arg & oppPerpCheckMove)!=0 ? CCEvalue.MaxValue - 1 - MoveNum : 0);
}
public int isLoop(int Recur){
int Index, i, j, MovedPieces, ThisRecur;
boolean OppSide,PerpCheck, OppPerpCheck;
int[] DstLst=new int[MAX_MOVE_NUM], SrcLst=new int[MAX_MOVE_NUM];
MoveNode ThisMove;
if (loopHash[(int) (zobristKey & LOOP_HASH_MASK)]==0) {
return 0;
}
ThisRecur = 0;
OppSide = true;
MovedPieces = 0;
PerpCheck = OppPerpCheck = true;
Index = moveNum;
while (true) {
Index --;
ThisMove = moveList[Index];
if (ThisMove.cap!=0) {
break;
}
if (OppSide) {
if (OppPerpCheck && ThisMove.chk) {
OppPerpCheck = false;
}
} else {
if (PerpCheck && ThisMove.chk) {
PerpCheck = false;
}
}
for (i = 0; i < MovedPieces; i ++) {
if (SrcLst[i] == ThisMove.dst) {
SrcLst[i] = ThisMove.src;
if (!OppSide) {
for (j = 0; j < MovedPieces; j ++) {
if (SrcLst[j] != DstLst[j]) {
break;
}
}
if (j == MovedPieces) {
ThisRecur ++;
if (ThisRecur == Recur) {
return loopMove + (PerpCheck ? perpCheckMove : 0) + (OppPerpCheck ? oppPerpCheckMove : 0);
}
}
}
break;
}
}
if (i == MovedPieces) {
DstLst[MovedPieces] = ThisMove.dst;
SrcLst[MovedPieces] = ThisMove.src;
MovedPieces ++;
}
OppSide = !OppSide;
}
return 0;
}
//Piece Types and Values
public static int fenPiece(char Arg) {
switch (Arg) {
case 'K'://将,帅
return 0;
case 'A'://仕
return 1;
case 'B'://相
case 'E'://象
return 2;
case 'N'://knight
case 'H'://horse
return 3;
case 'R'://rook
return 4;
case 'C'://cannon
return 5;
default://卒,兵
return 6;
}
}
//------------------------------------------------------------
public void loadFen(final String FenStr) {
int i, j, k;
int[] RedPiece=new int[7];
int[] BlackPiece=new int[7];
final char[] CharPtr;
int index;
// Init:
RedPiece[0] = 16;
for (i = 1; i < 7; i ++) {
RedPiece[i] = (i << 1) + 15;
}
for (i = 0; i < 7; i ++) {
BlackPiece[i] = RedPiece[i] + 16;
}
for (i = 16; i < 48; i ++) {
if (pieces[i] != -1) {
clearPiece(i);
}
}
moveNum = 1;
if (FenStr.length()==0) {
return;
}else{
CharPtr = FenStr.toCharArray();
}
// Read Board:
i = 0;
j = 9;
index=0;
while (CharPtr[index] != ' ') {
if (CharPtr[index] == '/') {
i = 0;
j --;
if (j < 0) {
break;
}
} else if (CharPtr[index] >= '1' && CharPtr[index] <= '9') {
for (k = 0; k < (CharPtr[index] - '0'); k ++) {
if (i >= 9) {
break;
}
i ++;
}
} else if (CharPtr[index] >= 'A' && CharPtr[index] <= 'Z') {
k = fenPiece(CharPtr[index]);
if (i < 9) {
if (RedPiece[k] < 32) {
setPiece(BOTTOM[i] + j, RedPiece[k]);
RedPiece[k] ++;
}
}
i ++;
} else if (CharPtr[index] >= 'a' && CharPtr[index] <= 'z') {
k = fenPiece((char) (CharPtr[index] + 'A' - 'a'));
if (i < 9) {
if (BlackPiece[k] < 48) {
setPiece(BOTTOM[i] + j, BlackPiece[k]);
BlackPiece[k] ++;
}
}
i ++;
}
index++;
if (CharPtr[index] == '\0') {
return;
}
}
index ++;
// Read Player:
if (player == (CharPtr[index] == 'b' ? 0 : 1)) {
changeSide();
}
// Set Check Status
moveList[moveNum - 1].chk = checked(player);
//catch (ArrayIndexOutOfBoundsException e){
// e.printStackTrace();
// System.out.println(this.AllPieces);
//}
}
public String getFenStr(){//current state FenStr
ArrayList pieceList = new ArrayList();
int i,j,k,pieceType;
int FilePieces;
int low,high;
int bitMask = 1<<8;
String FileStr="";
for (i=9;i>=0;i--){
FilePieces=bitRanks[i];
for (j=8;j>=0;j--){
if ((FilePieces & (bitMask>>j))==0){
FileStr=FileStr+"1";
}else{
int tmpPiece = squares[(8-j)*10+i];
FileStr=FileStr+getFenName(PIECE_TYPES[tmpPiece]);
}
}
if (i!=0)
FileStr=FileStr+"/";
}
if(player==0)
FileStr=FileStr + " w - - 0 " + (moveNum+1)/2;
else
FileStr=FileStr + " b - - 0 " + (moveNum+1)/2;
i=0;
String retVal="";
if (FileStr.charAt(i)!='1'){
retVal = retVal+FileStr.charAt(i);
i++;
}
int maxId = FileStr.indexOf('-');
while(i<maxId){
int m = 0;
while(FileStr.charAt(i)=='1'){
m++;i++;
}
if(m!=0){
retVal=retVal+m;
}
if(i<maxId){
retVal=retVal+FileStr.charAt(i);
i++;
}
}
retVal = retVal + FileStr.substring(FileStr.indexOf('-'));
return retVal;
}
public char getFenName(int pieceTypeNum){
//rnbakabnr/9/1c5c1/p1p1p1p1p/9/9/P1P1P1P1P/1C5C1/9/RNBAKABNR w - - 0 1
switch (pieceTypeNum%7){
case 0 ://将,帅
return (pieceTypeNum < 7) ? 'K':'k';
case 1://仕
return (pieceTypeNum < 7) ? 'A':'a';
case 2://相
return (pieceTypeNum < 7) ? 'B':'b';
case 3://knight
return (pieceTypeNum < 7) ? 'N':'n';
case 4://rook
return (pieceTypeNum < 7) ? 'R':'r';
case 5://cannon
return (pieceTypeNum < 7) ? 'C':'c';
default://卒,兵
return (pieceTypeNum < 7) ? 'P':'p';
}
}
public static void main(String[] args){
System.out.println("new ChessPosition");
ActiveBoard cp = new ActiveBoard();
String tmpStr = "nbakabnr/9/1c5c1/p1p1p1p1p/9/9/P1P1P1P1P/1C5C1/9/RNBAKABNR w - - 0 1";
cp.loadFen(tmpStr);
System.out.println(cp.allPieces);
ActiveBoard cp1 = new ActiveBoard();
cp1.loadFen(tmpStr);
System.out.println(cp1.allPieces);
ActiveBoard cp2 = new ActiveBoard();
cp2.loadFen(tmpStr);
System.out.println(cp2.allPieces);
}
public int getPlayer() {
return player;
}
public int getOppPlayer(){
return 1-player;
}
public int getSquares(int dstSq) {
return squares[dstSq];
}
public long getZobristKey() {
return zobristKey;
}
public long getZobristLock() {
return zobristLock;
}
public int getMoveNum() {
return moveNum;
}
public int getEvalue(int redOrBlack){return evalue[redOrBlack];}
public int getPieces(int i) {
return pieces[i];
}
public int getBitFiles(int x) {
return bitFiles[x];
}
public int getBitRanks(int y) {
return bitRanks[y];
}
public BitBoard getPieceBits(int piece) {
return pieceBits[piece];
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -