├── 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