Link: MobileChess-TouchScreen(1).jar
In evaluate class,what is represented by distance?
Welcome to the Java Programming Forums
The professional, friendly Java community. 21,500 members and growing!
The Java Programming Forums are a community of Java programmers from all around the World. Our members have a wide range of skills and they all have one thing in common: A passion to learn and code Java. We invite beginner Java programmers right through to Java professionals to post here and share your knowledge. Become a part of the community, help others, expand your knowledge of Java and enjoy talking with like minded people. Registration is quick and best of all free. We look forward to meeting you.
>> REGISTER NOW TO START POSTING
Members have full access to the forums. Advertisements are removed for registered users.
Link: MobileChess-TouchScreen(1).jar
In evaluate class,what is represented by distance?
Thread moved to Java Theory & Questions
I honestly don't even know what you are asking...and I can only speak for myself, but am not going to download an executable jar from an unknown source
This thread has been cross posted here:Although cross posting is allowed, for everyone's benefit, please read:
Post the code here that you have questions about.
If you don't understand my answer, don't ignore it, ask a question.
trusted suceforge link :Mobile Chess and Flash Chess | Free Games software downloads at SourceForge.net
Copy and paste here the code you have questions about. Be sure to wrap the code with[code=java]<YOUR CODE HERE>[/code] to get highlighting
If you don't understand my answer, don't ignore it, ask a question.
part of code (full code on link):
package chess; // Referenced classes of package chess: // Position, Util public class Evaluate { public static final int PIECE_KING = 0; public static final int PIECE_QUEEN = 1; public static final int PIECE_ROOK = 2; public static final int PIECE_BISHOP = 3; public static final int PIECE_KNIGHT = 4; public static final int PIECE_PAWN = 5; public static final int FULL_BIT_RANK = 4080; public static final int LAZY_MARGIN = 100; public static final int ISOLATED_PENALTY = 10; public static final int DOUBLE_PENALTY = 4; public static final int PIECE_VALUE[] = { 0, 9, 5, 3, 3, 1 }; public static final int PASS_PAWN[] = { 0, 35, 30, 20, 10, 5, 0, 0 }; public static final byte DISTANCE[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 6, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 6, 5, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 7, 6, 5, 4, 3, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 7, 6, 5, 4, 3, 2, 3, 4, 5, 6, 7, 0, 0, 0, 0, 7, 6, 5, 4, 3, 2, 1, 2, 3, 4, 5, 6, 7, 0, 0, 7, 6, 5, 4, 3, 2, 1, 0, 1, 2, 3, 4, 5, 6, 7, 0, 0, 7, 6, 5, 4, 3, 2, 1, 2, 3, 4, 5, 6, 7, 0, 0, 0, 0, 7, 6, 5, 4, 3, 2, 3, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 7, 6, 5, 4, 3, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 7, 6, 5, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 6, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
Last edited by rajeshverma; June 15th, 2012 at 11:21 AM.
What is you question about the code?
Please Edit your post and wrap your code with[code=java]<YOUR CODE HERE>[/code] to get highlighting
If you don't understand my answer, don't ignore it, ask a question.
Question is : what is represented by 'distance' in code ?
This code is a part of mobile chess jar file downloaded from : Mobile Chess and Flash Chess | Free Games software downloads at SourceForge.net
It looks like an array of byte values. How does the code use the contents of the array? You will have to read the code and see how it is used. Perhaps the author's comments will explain what it is used for.
How many elements are there in the array? Does that number correspond with any other features of the program?
If you don't understand my answer, don't ignore it, ask a question.
Yes sir,it is an array of byte values. Second thing, I don't know author. Now as far as correspondence with any other features is concerned, I guess it has something to do with chessboard.
Other detail: (1)I have downloaded this from : Mobile Chess and Flash Chess | Free Games software downloads at SourceForge.net .
(2)I have decompiled the jar.
(3)Now I post full code under.
(4)The code is for 'evaluating' position on board.
(5)Other things about code ,I feel, it uses alpha-beta for analysis,squares have different values in all functions
package chess; // Referenced classes of package chess: // Position, Util public class Evaluate { public static final int PIECE_KING = 0; public static final int PIECE_QUEEN = 1; public static final int PIECE_ROOK = 2; public static final int PIECE_BISHOP = 3; public static final int PIECE_KNIGHT = 4; public static final int PIECE_PAWN = 5; public static final int FULL_BIT_RANK = 4080; public static final int LAZY_MARGIN = 100; public static final int ISOLATED_PENALTY = 10; public static final int DOUBLE_PENALTY = 4; public static final int PIECE_VALUE[] = { 0, 9, 5, 3, 3, 1 }; public static final int PASS_PAWN[] = { 0, 35, 30, 20, 10, 5, 0, 0 }; public static final byte DISTANCE[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 6, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 6, 5, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 7, 6, 5, 4, 3, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 7, 6, 5, 4, 3, 2, 3, 4, 5, 6, 7, 0, 0, 0, 0, 7, 6, 5, 4, 3, 2, 1, 2, 3, 4, 5, 6, 7, 0, 0, 7, 6, 5, 4, 3, 2, 1, 0, 1, 2, 3, 4, 5, 6, 7, 0, 0, 7, 6, 5, 4, 3, 2, 1, 2, 3, 4, 5, 6, 7, 0, 0, 0, 0, 7, 6, 5, 4, 3, 2, 3, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 7, 6, 5, 4, 3, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 7, 6, 5, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 6, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; public static final byte ENDGAME_EDGE[] = { 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0 }; public static final byte ENDGAME_BOTTOM[] = { 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0 }; public static final byte ENDGAME_KING_PENALTY[] = { 0, 0, 0, 0, 25, 22, 19, 16, 16, 19, 22, 25, 0, 0, 0, 0, 0, 0, 0, 0, 17, 14, 11, 8, 8, 11, 14, 17, 0, 0, 0, 0, 0, 0, 0, 0, 13, 10, 7, 4, 4, 7, 10, 13, 0, 0, 0, 0, 0, 0, 0, 0, 9, 6, 3, 0, 0, 3, 6, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 6, 3, 0, 0, 3, 6, 9, 0, 0, 0, 0, 0, 0, 0, 0, 13, 10, 7, 4, 4, 7, 10, 13, 0, 0, 0, 0, 0, 0, 0, 0, 17, 14, 11, 8, 8, 11, 14, 17, 0, 0, 0, 0, 0, 0, 0, 0, 25, 22, 19, 16, 16, 19, 22, 25, 0, 0, 0, 0 }; public static final byte EDGE_PENALTY[] = { 0, 0, 0, 0, 6, 5, 4, 3, 3, 4, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 5, 4, 3, 2, 2, 3, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 4, 3, 2, 1, 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 1, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 1, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 4, 3, 2, 1, 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 4, 3, 2, 2, 3, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 6, 5, 4, 3, 3, 4, 5, 6, 0, 0, 0, 0 }; public static final byte PAWN_VALUE[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 46, 70, 78, 46, 30, 30, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 22, 43, 50, 22, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 16, 34, 40, 16, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 12, 27, 32, 12, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 20, 24, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 15, 18, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; public static final byte CENTER_IMPORTANCE[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 5, 5, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 5, 8, 8, 5, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 5, 8, 8, 5, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 5, 5, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; public static final byte RANK_IMPORTANCE[] = { 0, 0, 0, 0, 12, 12, 12, 12, 12, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 12, 12, 12, 12, 12, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; public Evaluate() { } public static boolean IN_BOARD(int sq) { return Position.IN_BOARD(sq); } public static int SQUARE_FLIP(int sq) { return Position.SQUARE_FLIP(sq); } public static int losingKingValue(int sq) { return -ENDGAME_KING_PENALTY[sq] * 2 - ENDGAME_BOTTOM[sq] * 8; } public static int winningKingValue(int sq, int sqOppKing) { return -DISTANCE[(sqOppKing - sq) + 128] * 2 - ENDGAME_EDGE[sq] * 8; } public static int calcRookControl(Position pos, int sqSrc, short attack[]) { return calcSlideControl(pos, sqSrc, attack, true); } public static int calcBishopControl(Position pos, int sqSrc, short attack[]) { return calcSlideControl(pos, sqSrc, attack, false); } public static int calcSlideControl(Position pos, int sqSrc, short attack[], boolean isRook) { int control = 0; for(int i = 0; i < 4; i++) { int delta = isRook ? Position.ROOK_DELTA[i] : Position.BISHOP_DELTA[i]; int sqDst = sqSrc + delta; boolean direct = true; for(; IN_BOARD(sqDst); sqDst += delta) { control += direct ? ((int) (attack[sqDst])) : attack[sqDst] / 2; if(pos.squares[sqDst] <= 0) { continue; } int pieceType = Position.PIECE_TYPE(pos.squares[sqDst]); if(pieceType == 5) { break; } if(pieceType == 0 || pieceType == 4 || pieceType == (isRook ? 3 : 2)) { direct = false; } } } return control; } public static void preEval(Position pos) { int vlWhite = 0; int vlBlack = 0; int sqWhiteKing = 0; int sqBlackKing = 0; for(int sq = 0; sq < 128; sq++) { int pc = pos.squares[sq]; if(pc != 0) { if(pc < 16) { vlWhite += PIECE_VALUE[pc - 8]; if(pc == 8) { sqWhiteKing = sq; } } else { vlBlack += PIECE_VALUE[pc - 16]; if(pc == 16) { sqBlackKing = sq; } } } } boolean inEndgame = Math.min(vlWhite, vlBlack) <= 6 && Math.abs(vlWhite - vlBlack) >= 2; short whiteAttack[] = new short[128]; short blackAttack[] = new short[128]; for(int sq = 0; sq < 128; sq++) { whiteAttack[sq] = blackAttack[SQUARE_FLIP(sq)] = (short)((RANK_IMPORTANCE[sq] * Math.max((vlWhite + vlBlack) - 24, 8)) / 32 + CENTER_IMPORTANCE[sq]); } for(int i = 0; i < 8; i++) { int importance = (12 * Math.max((vlWhite + vlBlack) - 24, 8)) / 32; int sq = sqWhiteKing + Position.KING_DELTA[i]; if(IN_BOARD(sq)) { blackAttack[sq] += importance; } sq = sqBlackKing + Position.KING_DELTA[i]; if(IN_BOARD(sq)) { whiteAttack[sq] += importance; } } short whiteRookControl[] = new short[128]; short whiteBishopControl[] = new short[128]; short blackRookControl[] = new short[128]; short blackBishopControl[] = new short[128]; for(int sq = 0; sq < 128; sq++) { if(IN_BOARD(sq)) { whiteRookControl[sq] = (short)calcRookControl(pos, sq, whiteAttack); blackRookControl[sq] = (short)calcRookControl(pos, sq, blackAttack); whiteBishopControl[sq] = (short)calcBishopControl(pos, sq, whiteAttack); blackBishopControl[sq] = (short)calcBishopControl(pos, sq, blackAttack); } } for(int sq = 0; sq < 128; sq++) { if(IN_BOARD(sq)) { int edgePenalty = EDGE_PENALTY[sq]; if(inEndgame) { if(vlWhite < vlBlack) { pos.vlWhitePiecePos[0][sq] = (short)losingKingValue(sq); pos.vlBlackPiecePos[0][sq] = (short)winningKingValue(sq, sqWhiteKing); } else { pos.vlBlackPiecePos[0][sq] = (short)losingKingValue(sq); pos.vlWhitePiecePos[0][sq] = (short)winningKingValue(sq, sqBlackKing); } for(int i = 1; i <= 4; i++) { pos.vlWhitePiecePos[i][sq] = pos.vlBlackPiecePos[i][sq] = (short)(PIECE_VALUE[i] * 100); } } else { if(vlWhite + vlBlack <= 32) { pos.vlWhitePiecePos[0][sq] = pos.vlBlackPiecePos[0][sq] = (short)(-edgePenalty); } else { pos.vlWhitePiecePos[0][sq] = pos.vlBlackPiecePos[0][sq] = 0; } pos.vlWhitePiecePos[1][sq] = (short)(PIECE_VALUE[1] * 100 + (whiteRookControl[sq] + whiteBishopControl[sq]) / 8); pos.vlBlackPiecePos[1][sq] = (short)(PIECE_VALUE[1] * 100 + (blackRookControl[sq] + blackBishopControl[sq]) / 8); pos.vlWhitePiecePos[2][sq] = (short)(PIECE_VALUE[2] * 100 + whiteRookControl[sq] / 2); pos.vlBlackPiecePos[2][sq] = (short)(PIECE_VALUE[2] * 100 + blackRookControl[sq] / 2); pos.vlWhitePiecePos[3][sq] = (short)(PIECE_VALUE[3] * 100 + whiteBishopControl[sq] / 2); pos.vlBlackPiecePos[3][sq] = (short)(PIECE_VALUE[3] * 100 + blackBishopControl[sq] / 2); int whiteKnightAttack = 0; int blackKnightAttack = 0; for(int i = 0; i < 8; i++) { int sqDst = sq + Position.KNIGHT_DELTA[i]; if(IN_BOARD(sqDst)) { whiteKnightAttack += whiteAttack[sqDst]; blackKnightAttack += blackAttack[sqDst]; } } pos.vlWhitePiecePos[4][sq] = (short)((PIECE_VALUE[4] * 100 + whiteKnightAttack / 4) - (edgePenalty * 3) / 2); pos.vlBlackPiecePos[4][sq] = (short)((PIECE_VALUE[4] * 100 + blackKnightAttack / 4) - (edgePenalty * 3) / 2); } pos.vlWhitePiecePos[5][sq] = pos.vlBlackPiecePos[5][SQUARE_FLIP(sq)] = (short)((PIECE_VALUE[5] * 100 + PAWN_VALUE[sq] / 2) - 6); } } for(int sd = 0; sd < 2; sd++) { int brSelf = 0; int brSide = 0; int brBehindOppPass = 0; int brOppPass = 4080; for(int i = 1; i <= 6; i++) { int y = sd != 0 ? i : 7 - i; int brOpp = sd != 0 ? pos.brWhitePawn[y] : pos.brBlackPawn[y]; brOppPass &= ~(brSelf | brSide); brBehindOppPass |= brOppPass & brOpp; int brChain = brSide; brSelf = sd != 0 ? pos.brBlackPawn[y] : pos.brWhitePawn[y]; brSide = (brSelf >> 1 | brSelf << 1) & 0xff0; int brForward = sd != 0 ? pos.brBlackPawn[y + 1] : pos.brWhitePawn[y + 1]; int brLeftCover = brForward >> 1 & 0xff0; int brRightCover = brForward << 1 & 0xff0; for(int x = 4; x <= 11; x++) { int sq = Position.COORD_XY(x, y); int brSquare = 1 << x; int value = ((brSide & brSquare) == 0 ? 0 : 3) + ((brChain & brSquare) == 0 ? 0 : 2); value += ((brLeftCover & brSquare) == 0 ? 0 : 2) + ((brRightCover & brSquare) == 0 ? 0 : 2); value += (brSelf & brSquare) == 0 ? 0 : 1; if(sd == 0) { pos.vlWhitePiecePos[5][sq] += value; } else { pos.vlBlackPiecePos[5][sq] += value; } if(vlWhite + vlBlack <= 32) { if((brOppPass & brSquare) != 0) { if(sd == 0) { pos.vlBlackPiecePos[5][sq] += PASS_PAWN[i]; } else { pos.vlWhitePiecePos[5][sq] += PASS_PAWN[i]; } } if((brBehindOppPass & brSquare) != 0) { pos.vlWhitePiecePos[2][sq] += 8; pos.vlBlackPiecePos[2][sq] += 8; if(i == 6) { int sqBottom = sq + Position.FORWARD_DELTA(sd); pos.vlWhitePiecePos[2][sqBottom] += 8; pos.vlBlackPiecePos[2][sqBottom] += 8; } } } } } } for(int sq = 103; sq <= 104; sq++) { if(pos.squares[sq] == 13) { pos.vlWhitePiecePos[3][sq - 16] -= 10; } } for(int sq = 23; sq <= 24; sq++) { if(pos.squares[sq] == 21) { pos.vlBlackPiecePos[3][sq + 16] -= 10; } } pos.vlWhite = pos.vlBlack = 0; for(int sq = 0; sq < 128; sq++) { int pc = pos.squares[sq]; if(pc > 0) { if(pc < 16) { pos.vlWhite += pos.vlWhitePiecePos[pc - 8][sq]; } else { pos.vlBlack += pos.vlBlackPiecePos[pc - 16][sq]; } } } } public static int evaluate(Position pos, int vlAlpha, int vlBeta) { int vl = pos.material(); if(vl + 100 <= vlAlpha) { return vl + 100; } if(vl - 100 >= vlBeta) { return vl - 100; } for(int sd = 0; sd < 2; sd++) { int brSingle = 0; int brDouble = 0; int brs[] = sd != 0 ? pos.brBlackPawn : pos.brWhitePawn; for(int i = 1; i <= 6; i++) { brDouble |= brSingle & brs[i]; brSingle |= brs[i]; } int brIsolated = brSingle & ~(brSingle << 1 | brSingle >> 1); int penalty = Util.POP_COUNT_16(brDouble) * 4 + Util.POP_COUNT_16(brIsolated) * 10 + Util.POP_COUNT_16(brIsolated & brDouble) * 10 * 2; vl += pos.sdPlayer != sd ? penalty : -penalty; } return vl; } }
Yes sir,it is an array of byte values. Second thing, I don't know author. Now as far as correspondence with any other features is concerned, I guess it has something to do with chessboard.
Other detail: (1)I have downloaded this from : Mobile Chess and Flash Chess | Free Games software downloads at SourceForge.net .
(2)I have decompiled the jar.
(3)Now I post full code under.
(4)The code is for 'evaluating' position on board.
(5)Other things about code ,I feel, it uses alpha-beta for analysis,squares have different values in all functions
package chess; // Referenced classes of package chess: // Position, Util public class Evaluate { public static final int PIECE_KING = 0; public static final int PIECE_QUEEN = 1; public static final int PIECE_ROOK = 2; public static final int PIECE_BISHOP = 3; public static final int PIECE_KNIGHT = 4; public static final int PIECE_PAWN = 5; public static final int FULL_BIT_RANK = 4080; public static final int LAZY_MARGIN = 100; public static final int ISOLATED_PENALTY = 10; public static final int DOUBLE_PENALTY = 4; public static final int PIECE_VALUE[] = { 0, 9, 5, 3, 3, 1 }; public static final int PASS_PAWN[] = { 0, 35, 30, 20, 10, 5, 0, 0 }; public static final byte DISTANCE[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 6, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 6, 5, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 7, 6, 5, 4, 3, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 7, 6, 5, 4, 3, 2, 3, 4, 5, 6, 7, 0, 0, 0, 0, 7, 6, 5, 4, 3, 2, 1, 2, 3, 4, 5, 6, 7, 0, 0, 7, 6, 5, 4, 3, 2, 1, 0, 1, 2, 3, 4, 5, 6, 7, 0, 0, 7, 6, 5, 4, 3, 2, 1, 2, 3, 4, 5, 6, 7, 0, 0, 0, 0, 7, 6, 5, 4, 3, 2, 3, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 7, 6, 5, 4, 3, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 7, 6, 5, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 6, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; public static final byte ENDGAME_EDGE[] = { 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0 }; public static final byte ENDGAME_BOTTOM[] = { 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0 }; public static final byte ENDGAME_KING_PENALTY[] = { 0, 0, 0, 0, 25, 22, 19, 16, 16, 19, 22, 25, 0, 0, 0, 0, 0, 0, 0, 0, 17, 14, 11, 8, 8, 11, 14, 17, 0, 0, 0, 0, 0, 0, 0, 0, 13, 10, 7, 4, 4, 7, 10, 13, 0, 0, 0, 0, 0, 0, 0, 0, 9, 6, 3, 0, 0, 3, 6, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 6, 3, 0, 0, 3, 6, 9, 0, 0, 0, 0, 0, 0, 0, 0, 13, 10, 7, 4, 4, 7, 10, 13, 0, 0, 0, 0, 0, 0, 0, 0, 17, 14, 11, 8, 8, 11, 14, 17, 0, 0, 0, 0, 0, 0, 0, 0, 25, 22, 19, 16, 16, 19, 22, 25, 0, 0, 0, 0 }; public static final byte EDGE_PENALTY[] = { 0, 0, 0, 0, 6, 5, 4, 3, 3, 4, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 5, 4, 3, 2, 2, 3, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 4, 3, 2, 1, 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 1, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 1, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 4, 3, 2, 1, 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 4, 3, 2, 2, 3, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 6, 5, 4, 3, 3, 4, 5, 6, 0, 0, 0, 0 }; public static final byte PAWN_VALUE[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 46, 70, 78, 46, 30, 30, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 22, 43, 50, 22, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 16, 34, 40, 16, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 12, 27, 32, 12, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 20, 24, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 15, 18, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; public static final byte CENTER_IMPORTANCE[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 5, 5, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 5, 8, 8, 5, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 5, 8, 8, 5, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 5, 5, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; public static final byte RANK_IMPORTANCE[] = { 0, 0, 0, 0, 12, 12, 12, 12, 12, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 12, 12, 12, 12, 12, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; public Evaluate() { } public static boolean IN_BOARD(int sq) { return Position.IN_BOARD(sq); } public static int SQUARE_FLIP(int sq) { return Position.SQUARE_FLIP(sq); } public static int losingKingValue(int sq) { return -ENDGAME_KING_PENALTY[sq] * 2 - ENDGAME_BOTTOM[sq] * 8; } public static int winningKingValue(int sq, int sqOppKing) { return -DISTANCE[(sqOppKing - sq) + 128] * 2 - ENDGAME_EDGE[sq] * 8; } public static int calcRookControl(Position pos, int sqSrc, short attack[]) { return calcSlideControl(pos, sqSrc, attack, true); } public static int calcBishopControl(Position pos, int sqSrc, short attack[]) { return calcSlideControl(pos, sqSrc, attack, false); } public static int calcSlideControl(Position pos, int sqSrc, short attack[], boolean isRook) { int control = 0; for(int i = 0; i < 4; i++) { int delta = isRook ? Position.ROOK_DELTA[i] : Position.BISHOP_DELTA[i]; int sqDst = sqSrc + delta; boolean direct = true; for(; IN_BOARD(sqDst); sqDst += delta) { control += direct ? ((int) (attack[sqDst])) : attack[sqDst] / 2; if(pos.squares[sqDst] <= 0) { continue; } int pieceType = Position.PIECE_TYPE(pos.squares[sqDst]); if(pieceType == 5) { break; } if(pieceType == 0 || pieceType == 4 || pieceType == (isRook ? 3 : 2)) { direct = false; } } } return control; } public static void preEval(Position pos) { int vlWhite = 0; int vlBlack = 0; int sqWhiteKing = 0; int sqBlackKing = 0; for(int sq = 0; sq < 128; sq++) { int pc = pos.squares[sq]; if(pc != 0) { if(pc < 16) { vlWhite += PIECE_VALUE[pc - 8]; if(pc == 8) { sqWhiteKing = sq; } } else { vlBlack += PIECE_VALUE[pc - 16]; if(pc == 16) { sqBlackKing = sq; } } } } boolean inEndgame = Math.min(vlWhite, vlBlack) <= 6 && Math.abs(vlWhite - vlBlack) >= 2; short whiteAttack[] = new short[128]; short blackAttack[] = new short[128]; for(int sq = 0; sq < 128; sq++) { whiteAttack[sq] = blackAttack[SQUARE_FLIP(sq)] = (short)((RANK_IMPORTANCE[sq] * Math.max((vlWhite + vlBlack) - 24, 8)) / 32 + CENTER_IMPORTANCE[sq]); } for(int i = 0; i < 8; i++) { int importance = (12 * Math.max((vlWhite + vlBlack) - 24, 8)) / 32; int sq = sqWhiteKing + Position.KING_DELTA[i]; if(IN_BOARD(sq)) { blackAttack[sq] += importance; } sq = sqBlackKing + Position.KING_DELTA[i]; if(IN_BOARD(sq)) { whiteAttack[sq] += importance; } } short whiteRookControl[] = new short[128]; short whiteBishopControl[] = new short[128]; short blackRookControl[] = new short[128]; short blackBishopControl[] = new short[128]; for(int sq = 0; sq < 128; sq++) { if(IN_BOARD(sq)) { whiteRookControl[sq] = (short)calcRookControl(pos, sq, whiteAttack); blackRookControl[sq] = (short)calcRookControl(pos, sq, blackAttack); whiteBishopControl[sq] = (short)calcBishopControl(pos, sq, whiteAttack); blackBishopControl[sq] = (short)calcBishopControl(pos, sq, blackAttack); } } for(int sq = 0; sq < 128; sq++) { if(IN_BOARD(sq)) { int edgePenalty = EDGE_PENALTY[sq]; if(inEndgame) { if(vlWhite < vlBlack) { pos.vlWhitePiecePos[0][sq] = (short)losingKingValue(sq); pos.vlBlackPiecePos[0][sq] = (short)winningKingValue(sq, sqWhiteKing); } else { pos.vlBlackPiecePos[0][sq] = (short)losingKingValue(sq); pos.vlWhitePiecePos[0][sq] = (short)winningKingValue(sq, sqBlackKing); } for(int i = 1; i <= 4; i++) { pos.vlWhitePiecePos[i][sq] = pos.vlBlackPiecePos[i][sq] = (short)(PIECE_VALUE[i] * 100); } } else { if(vlWhite + vlBlack <= 32) { pos.vlWhitePiecePos[0][sq] = pos.vlBlackPiecePos[0][sq] = (short)(-edgePenalty); } else { pos.vlWhitePiecePos[0][sq] = pos.vlBlackPiecePos[0][sq] = 0; } pos.vlWhitePiecePos[1][sq] = (short)(PIECE_VALUE[1] * 100 + (whiteRookControl[sq] + whiteBishopControl[sq]) / 8); pos.vlBlackPiecePos[1][sq] = (short)(PIECE_VALUE[1] * 100 + (blackRookControl[sq] + blackBishopControl[sq]) / 8); pos.vlWhitePiecePos[2][sq] = (short)(PIECE_VALUE[2] * 100 + whiteRookControl[sq] / 2); pos.vlBlackPiecePos[2][sq] = (short)(PIECE_VALUE[2] * 100 + blackRookControl[sq] / 2); pos.vlWhitePiecePos[3][sq] = (short)(PIECE_VALUE[3] * 100 + whiteBishopControl[sq] / 2); pos.vlBlackPiecePos[3][sq] = (short)(PIECE_VALUE[3] * 100 + blackBishopControl[sq] / 2); int whiteKnightAttack = 0; int blackKnightAttack = 0; for(int i = 0; i < 8; i++) { int sqDst = sq + Position.KNIGHT_DELTA[i]; if(IN_BOARD(sqDst)) { whiteKnightAttack += whiteAttack[sqDst]; blackKnightAttack += blackAttack[sqDst]; } } pos.vlWhitePiecePos[4][sq] = (short)((PIECE_VALUE[4] * 100 + whiteKnightAttack / 4) - (edgePenalty * 3) / 2); pos.vlBlackPiecePos[4][sq] = (short)((PIECE_VALUE[4] * 100 + blackKnightAttack / 4) - (edgePenalty * 3) / 2); } pos.vlWhitePiecePos[5][sq] = pos.vlBlackPiecePos[5][SQUARE_FLIP(sq)] = (short)((PIECE_VALUE[5] * 100 + PAWN_VALUE[sq] / 2) - 6); } } for(int sd = 0; sd < 2; sd++) { int brSelf = 0; int brSide = 0; int brBehindOppPass = 0; int brOppPass = 4080; for(int i = 1; i <= 6; i++) { int y = sd != 0 ? i : 7 - i; int brOpp = sd != 0 ? pos.brWhitePawn[y] : pos.brBlackPawn[y]; brOppPass &= ~(brSelf | brSide); brBehindOppPass |= brOppPass & brOpp; int brChain = brSide; brSelf = sd != 0 ? pos.brBlackPawn[y] : pos.brWhitePawn[y]; brSide = (brSelf >> 1 | brSelf << 1) & 0xff0; int brForward = sd != 0 ? pos.brBlackPawn[y + 1] : pos.brWhitePawn[y + 1]; int brLeftCover = brForward >> 1 & 0xff0; int brRightCover = brForward << 1 & 0xff0; for(int x = 4; x <= 11; x++) { int sq = Position.COORD_XY(x, y); int brSquare = 1 << x; int value = ((brSide & brSquare) == 0 ? 0 : 3) + ((brChain & brSquare) == 0 ? 0 : 2); value += ((brLeftCover & brSquare) == 0 ? 0 : 2) + ((brRightCover & brSquare) == 0 ? 0 : 2); value += (brSelf & brSquare) == 0 ? 0 : 1; if(sd == 0) { pos.vlWhitePiecePos[5][sq] += value; } else { pos.vlBlackPiecePos[5][sq] += value; } if(vlWhite + vlBlack <= 32) { if((brOppPass & brSquare) != 0) { if(sd == 0) { pos.vlBlackPiecePos[5][sq] += PASS_PAWN[i]; } else { pos.vlWhitePiecePos[5][sq] += PASS_PAWN[i]; } } if((brBehindOppPass & brSquare) != 0) { pos.vlWhitePiecePos[2][sq] += 8; pos.vlBlackPiecePos[2][sq] += 8; if(i == 6) { int sqBottom = sq + Position.FORWARD_DELTA(sd); pos.vlWhitePiecePos[2][sqBottom] += 8; pos.vlBlackPiecePos[2][sqBottom] += 8; } } } } } } for(int sq = 103; sq <= 104; sq++) { if(pos.squares[sq] == 13) { pos.vlWhitePiecePos[3][sq - 16] -= 10; } } for(int sq = 23; sq <= 24; sq++) { if(pos.squares[sq] == 21) { pos.vlBlackPiecePos[3][sq + 16] -= 10; } } pos.vlWhite = pos.vlBlack = 0; for(int sq = 0; sq < 128; sq++) { int pc = pos.squares[sq]; if(pc > 0) { if(pc < 16) { pos.vlWhite += pos.vlWhitePiecePos[pc - 8][sq]; } else { pos.vlBlack += pos.vlBlackPiecePos[pc - 16][sq]; } } } } public static int evaluate(Position pos, int vlAlpha, int vlBeta) { int vl = pos.material(); if(vl + 100 <= vlAlpha) { return vl + 100; } if(vl - 100 >= vlBeta) { return vl - 100; } for(int sd = 0; sd < 2; sd++) { int brSingle = 0; int brDouble = 0; int brs[] = sd != 0 ? pos.brBlackPawn : pos.brWhitePawn; for(int i = 1; i <= 6; i++) { brDouble |= brSingle & brs[i]; brSingle |= brs[i]; } int brIsolated = brSingle & ~(brSingle << 1 | brSingle >> 1); int penalty = Util.POP_COUNT_16(brDouble) * 4 + Util.POP_COUNT_16(brIsolated) * 10 + Util.POP_COUNT_16(brIsolated & brDouble) * 10 * 2; vl += pos.sdPlayer != sd ? penalty : -penalty; } return vl; } }
If you do not have the original source with the author's comments, you will have to spend lots of time trying to figure out what the code does and why it is doing what it does.I have decompiled the jar.
Good luck.
If you don't understand my answer, don't ignore it, ask a question.
how can i know if i don know what is distance refering ?
Look at the source and see how it is used.
If you don't understand my answer, don't ignore it, ask a question.
If the array is not used, you can remove it and there should not be any compiler errors and the execution of the program should not change.if i remove it, no error in compiling
Its strange there are no compiler errors. There should be an error for the line in this method:public static int winningKingValue(int sq, int sqOppKing) { return -DISTANCE[(sqOppKing - sq) + 128] * 2 - ENDGAME_EDGE[sq] * 8; }
If you don't understand my answer, don't ignore it, ask a question.
byte variables can not have a null value.
If you don't understand my answer, don't ignore it, ask a question.
I have found same code on googlecode :http://j2me-chess.googlecode.com/svn.../Evaluate.java
(1)It explains function.
(2)I was right for alpha beta.
(3)it shows squares as byte values.
(4)here also endgame edge and bottom make sense.
(5)square of distance (byte values) not match as board.
can i get answer of this? if yes,how where?
Ask the author
If you don't understand my answer, don't ignore it, ask a question.