├── README.md ├── com └── pj │ ├── .DS_Store │ └── chess │ ├── AICoreHandler.java │ ├── BitBoard.java │ ├── ChessBoardMain.java │ ├── ChessConstant.java │ ├── ChessInitialize.java │ ├── ComputerLevel.java │ ├── NodeLink.java │ ├── Tools.java │ ├── chessmove │ ├── ChessMoveAbs.java │ ├── ChessMovePlay.java │ ├── ChessQuiescMove.java │ ├── MoveNode.java │ └── MoveNodesSort.java │ ├── chessparam │ └── ChessParam.java │ ├── evaluate │ ├── EvaluateCompute.java │ ├── EvaluateComputeEndGame.java │ ├── EvaluateComputeMiddle.java │ ├── EvaluateComputeMiddleGame.java │ └── EvaluateComputeOther.java │ ├── history │ └── CHistoryHeuritic.java │ ├── movelist │ └── MoveNodeList.java │ ├── searchengine │ ├── PrincipalVariation.java │ └── SearchEngine.java │ └── zobrist │ ├── HashItem.java │ ├── InitZobristList32And64.java │ └── TranspositionTable.java ├── images ├── BA.GIF ├── BAS.GIF ├── BB.GIF ├── BBS.GIF ├── BC.GIF ├── BCS.GIF ├── BK.GIF ├── BKM.GIF ├── BKS.GIF ├── BN.GIF ├── BNS.GIF ├── BP.GIF ├── BPS.GIF ├── BR.GIF ├── BRS.GIF ├── MAIN.GIF ├── OO.GIF ├── OOS.GIF ├── RA.GIF ├── RAS.GIF ├── RB.GIF ├── RBS.GIF ├── RC.GIF ├── RCS.GIF ├── RK.GIF ├── RKM.GIF ├── RKS.GIF ├── RN.GIF ├── RNS.GIF ├── RP.GIF ├── RPS.GIF ├── RR.GIF └── RRS.GIF └── sounds ├── CAPTURE.WAV ├── CHECKED.WAV ├── LOSS.WAV └── MOVE.WAV /README.md: -------------------------------------------------------------------------------- 1 | # ChineseChess 2 | ## ChineseChess 中国象棋AI版,有UI界面可与电脑对弈。 3 | 1、基于 negaScout 剪树算法;
4 | 2、棋盘是基于Bit位的数据结构相比传统数组搜索效率大幅提高;
5 | 3、大部分着法全是基于Bit位提前生成;
6 |
7 | 在QQ象棋与高手对弈80%以上胜率》 8 |
9 | 启动类 com/pj/chess/ChessBoardMain 10 | -------------------------------------------------------------------------------- /com/pj/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengjiu/ChineseChess/df27f41cf80712b0cbf4420eaff84b0f4bf49321/com/pj/.DS_Store -------------------------------------------------------------------------------- /com/pj/chess/AICoreHandler.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengjiu/ChineseChess/df27f41cf80712b0cbf4420eaff84b0f4bf49321/com/pj/chess/AICoreHandler.java -------------------------------------------------------------------------------- /com/pj/chess/BitBoard.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengjiu/ChineseChess/df27f41cf80712b0cbf4420eaff84b0f4bf49321/com/pj/chess/BitBoard.java -------------------------------------------------------------------------------- /com/pj/chess/ChessBoardMain.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengjiu/ChineseChess/df27f41cf80712b0cbf4420eaff84b0f4bf49321/com/pj/chess/ChessBoardMain.java -------------------------------------------------------------------------------- /com/pj/chess/ChessConstant.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengjiu/ChineseChess/df27f41cf80712b0cbf4420eaff84b0f4bf49321/com/pj/chess/ChessConstant.java -------------------------------------------------------------------------------- /com/pj/chess/ChessInitialize.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengjiu/ChineseChess/df27f41cf80712b0cbf4420eaff84b0f4bf49321/com/pj/chess/ChessInitialize.java -------------------------------------------------------------------------------- /com/pj/chess/ComputerLevel.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengjiu/ChineseChess/df27f41cf80712b0cbf4420eaff84b0f4bf49321/com/pj/chess/ComputerLevel.java -------------------------------------------------------------------------------- /com/pj/chess/NodeLink.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengjiu/ChineseChess/df27f41cf80712b0cbf4420eaff84b0f4bf49321/com/pj/chess/NodeLink.java -------------------------------------------------------------------------------- /com/pj/chess/Tools.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengjiu/ChineseChess/df27f41cf80712b0cbf4420eaff84b0f4bf49321/com/pj/chess/Tools.java -------------------------------------------------------------------------------- /com/pj/chess/chessmove/ChessMoveAbs.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengjiu/ChineseChess/df27f41cf80712b0cbf4420eaff84b0f4bf49321/com/pj/chess/chessmove/ChessMoveAbs.java -------------------------------------------------------------------------------- /com/pj/chess/chessmove/ChessMovePlay.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengjiu/ChineseChess/df27f41cf80712b0cbf4420eaff84b0f4bf49321/com/pj/chess/chessmove/ChessMovePlay.java -------------------------------------------------------------------------------- /com/pj/chess/chessmove/ChessQuiescMove.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengjiu/ChineseChess/df27f41cf80712b0cbf4420eaff84b0f4bf49321/com/pj/chess/chessmove/ChessQuiescMove.java -------------------------------------------------------------------------------- /com/pj/chess/chessmove/MoveNode.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengjiu/ChineseChess/df27f41cf80712b0cbf4420eaff84b0f4bf49321/com/pj/chess/chessmove/MoveNode.java -------------------------------------------------------------------------------- /com/pj/chess/chessmove/MoveNodesSort.java: -------------------------------------------------------------------------------- 1 | package com.pj.chess.chessmove; 2 | 3 | import java.util.Arrays; 4 | 5 | 6 | 7 | import com.pj.chess.BitBoard; 8 | import com.pj.chess.movelist.MoveNodeList; 9 | public class MoveNodesSort{ 10 | public static final int TRANGODMOVE1=0,TRANGODMOVE2=7,KILLERMOVE1=1,KILLERMOVE2=8,OTHERALLMOVE=2,EATMOVE=3,OVER=-1,QUIESDEFAULT=-2; 11 | private int moveType,play,index; 12 | MoveNodeList tranGodMove; 13 | MoveNode[] KillerMove; 14 | MoveNodeList generalMoveList; 15 | MoveNodeList goodMoveList; 16 | ChessMoveAbs chessMove; 17 | boolean isChecked; 18 | MoveNodeList repeatMoveList=new MoveNodeList(4); 19 | BitBoard oppAttackSite; 20 | public static final int tran1=0,tran2=1,kill1=2,kill2=3,eatmove=4,other=5; 21 | public static int trancount1=0,trancount2=0,killcount1=0,killcount2=0,eatmovecount=0,othercount=0; 22 | 23 | public int currType; 24 | public MoveNodesSort(int play,MoveNodeList tranGodMove,MoveNode[] KillerMove,ChessMoveAbs chessMove,boolean isChecked){ 25 | this.play=play; 26 | this.tranGodMove=tranGodMove; 27 | this.KillerMove=KillerMove; 28 | this.chessMove=chessMove; 29 | this.moveType=TRANGODMOVE1; 30 | this.isChecked=isChecked; 31 | } 32 | /* 33 | * ��̬���� 34 | */ 35 | public MoveNodesSort(int play,ChessMoveAbs chessMove,boolean isChecked){ 36 | this.play=play; 37 | this.chessMove=chessMove; 38 | this.moveType=QUIESDEFAULT; 39 | this.isChecked=isChecked; 40 | } 41 | /* 42 | * ��̬���� 43 | */ 44 | public MoveNode quiescNext(){ 45 | MoveNode nextMoveNode = null; 46 | switch (moveType) { 47 | case QUIESDEFAULT: // �����ŷ� 48 | setMoveType(EATMOVE); 49 | case EATMOVE: // �����ŷ� 50 | if(index==0){ 51 | genEatMoveList(); 52 | } 53 | if (index < goodMoveList.size) { 54 | nextMoveNode = getSortAfterBestMove(goodMoveList); 55 | index++; 56 | return nextMoveNode; 57 | } else { 58 | if(isChecked){ 59 | //��������ȫ���߷� 60 | setMoveType(OTHERALLMOVE); 61 | }else{ 62 | //�ǽ���ֻ���������ŷ���������� 63 | setMoveType(OVER); 64 | break; 65 | } 66 | } 67 | case OTHERALLMOVE: // �����ŷ� 68 | if(index==0){ 69 | genNopMoveList(); 70 | } 71 | if (index < generalMoveList.size) { 72 | nextMoveNode = getSortAfterBestMove(generalMoveList); 73 | index++; 74 | } else { 75 | setMoveType(OVER); 76 | } 77 | break; 78 | } 79 | return nextMoveNode; 80 | } 81 | public MoveNode next(){ 82 | MoveNode nextMoveNode = null; 83 | switch (moveType) { 84 | case TRANGODMOVE1: // �û���������ŷ� 85 | this.currType=tran1; 86 | nextMoveNode = tranGodMove.get(0); 87 | setMoveType(TRANGODMOVE2); 88 | if(chessMove.legalMove(play, nextMoveNode)){ 89 | trancount1++; 90 | repeatMoveList.add(nextMoveNode); 91 | return nextMoveNode; 92 | } 93 | case TRANGODMOVE2: // �û���������ŷ� 94 | this.currType=tran2; 95 | nextMoveNode = tranGodMove.get(1); 96 | setMoveType(KILLERMOVE1); 97 | if(chessMove.legalMove(play, nextMoveNode) && !nextMoveNode.equals(tranGodMove.get(0))){ 98 | trancount2++; 99 | repeatMoveList.add(nextMoveNode); 100 | return nextMoveNode; 101 | } 102 | case KILLERMOVE1: // ɱ�ֱ��ŷ� 103 | this.currType=kill1; 104 | nextMoveNode = KillerMove[0]; 105 | setMoveType(KILLERMOVE2); 106 | if(chessMove.legalMove(play, nextMoveNode) && !nextMoveNode.equals(tranGodMove.get(0)) && !nextMoveNode.equals(tranGodMove.get(1))){ 107 | killcount1++; 108 | repeatMoveList.add(nextMoveNode); 109 | return nextMoveNode; 110 | } 111 | case KILLERMOVE2: // ɱ�ֱ��ŷ� 112 | this.currType=kill2; 113 | nextMoveNode = KillerMove[1]; 114 | setMoveType(EATMOVE); 115 | if(chessMove.legalMove(play, nextMoveNode) && !nextMoveNode.equals(tranGodMove.get(0)) && !nextMoveNode.equals(tranGodMove.get(1)) && !nextMoveNode.equals(KillerMove[0])){ 116 | killcount2++; 117 | repeatMoveList.add(nextMoveNode); 118 | return nextMoveNode; 119 | } 120 | case EATMOVE: // �����ŷ� 121 | this.currType=eatmove; 122 | if(index==0){ 123 | oppAttackSite=chessMove.getOppAttackSite(play); 124 | genEatMoveList(); 125 | } 126 | if (index < goodMoveList.size) { 127 | eatmovecount++; 128 | nextMoveNode = getSortAfterBestMove(goodMoveList); 129 | index++; 130 | return nextMoveNode; 131 | } else { 132 | setMoveType(OTHERALLMOVE); 133 | } 134 | case OTHERALLMOVE: // �����ŷ� 135 | this.currType=other; 136 | if(index==0){ 137 | genNopMoveList(); 138 | } 139 | if (index < generalMoveList.size) { 140 | othercount++; 141 | nextMoveNode = getSortAfterBestMove(generalMoveList); 142 | index++; 143 | return nextMoveNode; 144 | } else { 145 | moveType = OVER; 146 | } 147 | break; 148 | } 149 | return nextMoveNode; 150 | } 151 | public int getCurrTypeMoveSize(){ 152 | switch(this.currType){ 153 | case other: 154 | return generalMoveList.size; 155 | case eatmove: 156 | return goodMoveList.size; 157 | } 158 | return 100; 159 | } 160 | public boolean isOver(){ 161 | return moveType==OVER; 162 | } 163 | public boolean isKillerMove(){ 164 | return moveType==KILLERMOVE1 || moveType==KILLERMOVE2; 165 | } 166 | public int getMoveType(){ 167 | return moveType; 168 | } 169 | private void genEatMoveList(){ 170 | generalMoveList = new MoveNodeList(100); 171 | goodMoveList = new MoveNodeList(30); 172 | chessMove.setMoveNodeList(generalMoveList, goodMoveList,repeatMoveList,oppAttackSite); 173 | chessMove.genEatMoveList(play); 174 | } 175 | private void genNopMoveList(){ 176 | chessMove.setMoveNodeList(generalMoveList, goodMoveList,repeatMoveList,oppAttackSite); 177 | chessMove.genNopMoveList(play); 178 | } 179 | private void setMoveType(int moveType){ 180 | // if (moveType == EATMOVE) { 181 | // 182 | // 183 | // } else if (moveType == OTHERALLMOVE) { 184 | // 185 | // } 186 | /*if(moveType==EATMOVE){ 187 | if(!isChecked){ //û�н��� 188 | generalMoveList=new MoveNodeList(100); 189 | goodMoveList=new MoveNodeList(30); 190 | chessMove.setMoveNodeList(generalMoveList,goodMoveList); 191 | chessMove.genEatMoveList(play); 192 | }else{ //���� 193 | goodMoveList=new MoveNodeList(50); 194 | chessMove.setMoveNodeList(goodMoveList,goodMoveList); 195 | //�⽫������ŷ� 196 | chessMove.genFristMoveListCheckMate(play); 197 | } 198 | }else if(moveType==OTHERALLMOVE){ 199 | if(!isChecked){ //û�н��� 200 | chessMove.setMoveNodeList(generalMoveList, goodMoveList); 201 | chessMove.genNopMoveList(play); 202 | }else{ 203 | generalMoveList=new MoveNodeList(80); 204 | chessMove.setMoveNodeList(generalMoveList,generalMoveList); 205 | //�⽫�������ŷ� 206 | chessMove.genSecondlyMoveListCheckMate(play); 207 | } 208 | }*/ 209 | this.moveType=moveType; 210 | this.index = 0; 211 | } 212 | /* 213 | * ����ȡ����ǰ����ŷ� 214 | */ 215 | public MoveNode getSortAfterBestMove(MoveNodeList AllmoveNode){ 216 | int replaceIndex=index; 217 | for(int i=index+1;iAllmoveNode.get(replaceIndex).score){ 219 | replaceIndex=i; 220 | } 221 | } 222 | if(replaceIndex!=index){ 223 | MoveNode t=AllmoveNode.get(index); 224 | AllmoveNode.set(index, AllmoveNode.get(replaceIndex)); 225 | AllmoveNode.set(replaceIndex, t); 226 | } 227 | return AllmoveNode.get(index); 228 | } 229 | 230 | } 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | -------------------------------------------------------------------------------- /com/pj/chess/chessparam/ChessParam.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengjiu/ChineseChess/df27f41cf80712b0cbf4420eaff84b0f4bf49321/com/pj/chess/chessparam/ChessParam.java -------------------------------------------------------------------------------- /com/pj/chess/evaluate/EvaluateCompute.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengjiu/ChineseChess/df27f41cf80712b0cbf4420eaff84b0f4bf49321/com/pj/chess/evaluate/EvaluateCompute.java -------------------------------------------------------------------------------- /com/pj/chess/evaluate/EvaluateComputeEndGame.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengjiu/ChineseChess/df27f41cf80712b0cbf4420eaff84b0f4bf49321/com/pj/chess/evaluate/EvaluateComputeEndGame.java -------------------------------------------------------------------------------- /com/pj/chess/evaluate/EvaluateComputeMiddle.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengjiu/ChineseChess/df27f41cf80712b0cbf4420eaff84b0f4bf49321/com/pj/chess/evaluate/EvaluateComputeMiddle.java -------------------------------------------------------------------------------- /com/pj/chess/evaluate/EvaluateComputeMiddleGame.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengjiu/ChineseChess/df27f41cf80712b0cbf4420eaff84b0f4bf49321/com/pj/chess/evaluate/EvaluateComputeMiddleGame.java -------------------------------------------------------------------------------- /com/pj/chess/evaluate/EvaluateComputeOther.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengjiu/ChineseChess/df27f41cf80712b0cbf4420eaff84b0f4bf49321/com/pj/chess/evaluate/EvaluateComputeOther.java -------------------------------------------------------------------------------- /com/pj/chess/history/CHistoryHeuritic.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengjiu/ChineseChess/df27f41cf80712b0cbf4420eaff84b0f4bf49321/com/pj/chess/history/CHistoryHeuritic.java -------------------------------------------------------------------------------- /com/pj/chess/movelist/MoveNodeList.java: -------------------------------------------------------------------------------- 1 | package com.pj.chess.movelist; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | import com.pj.chess.chessmove.MoveNode; 7 | 8 | public class MoveNodeList{ 9 | public MoveNode[] tables=null; 10 | public int size=0; 11 | public MoveNodeList(int length){ 12 | if(tables==null){ 13 | tables=new MoveNode[length]; 14 | } 15 | size=0; 16 | } 17 | public MoveNodeList(MoveNodeList copy){ 18 | // if(copy!=null){ 19 | // tables=new MoveNode[copy.size]; 20 | // } 21 | } 22 | public void clear(){ 23 | size=0; 24 | } 25 | public void set(int index,MoveNode moveNode){ 26 | tables[index]=moveNode; 27 | } 28 | public void add(MoveNode moveNode){ 29 | if(moveNode!=null){ 30 | tables[size++]=moveNode; 31 | } 32 | } 33 | public MoveNode get(int index){ 34 | if(index0){ 41 | System.arraycopy(moveNodeList.tables,0, tables, size,moveNodeList.size); 42 | size+=moveNodeList.size; 43 | } 44 | } 45 | public static void main(String[] args) { 46 | /*int[] k=new int[]{1,2,3,4,5,0,0,0,0,0,0}; 47 | int[] k2=new int[]{8,9,1,1}; 48 | System.arraycopy(k2, 0, k, 5, k2.length-1); 49 | 50 | for(int vv:k){ 51 | System.out.println(vv); 52 | }*/ 53 | 54 | 55 | MoveNodeList mn=new MoveNodeList(20); 56 | MoveNode moveNode=new MoveNode(); 57 | moveNode.destChess=10; 58 | mn.add(moveNode); 59 | moveNode=new MoveNode(); 60 | moveNode.destChess=20; 61 | mn.add(moveNode); 62 | moveNode=new MoveNode(); 63 | moveNode.destChess=30; 64 | mn.add(moveNode); 65 | moveNode=new MoveNode(); 66 | moveNode.destChess=40; 67 | mn.add(moveNode); 68 | 69 | MoveNodeList mnTest=new MoveNodeList(10); 70 | moveNode=new MoveNode(); 71 | moveNode.destChess=70; 72 | mnTest.add(moveNode); 73 | moveNode=new MoveNode(); 74 | moveNode.destChess=100; 75 | mnTest.add(moveNode); 76 | mnTest.add(moveNode); 77 | 78 | mn.addAll(mnTest); 79 | for(int i=0;i