⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 activeboard.java

📁 用jav语言开发的基于J2SE平台的中国象棋.供大家参考和学习
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
			}
		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 + -