-
Notifications
You must be signed in to change notification settings - Fork 11
/
Is_True_Cap.cpp
150 lines (125 loc) · 5.43 KB
/
Is_True_Cap.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#include "stdafx.h"
#include "data.h"
#include "chess.h"
#include "Resource.h"
#include "pregen.h"
//是不是构成真的捉
void test_Is_True_Cap(position_t *pos,int from, int to, int ot_from, int ot_to,int which){
int to_id = PIECE_ID(pos->b256[to]);
//---------------------------------------------------------------------------
//1, 是兵或将在吃, 就返回 FALSE ,这儿不用了, 因为前面的已去除了
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//2, 判断这个棋能不能走, 如果不能走,也就不可能去吃对方了
//---------------------------------------------------------------------------
if(Is_Can_Move_To_Eat(pos,from,to) == FALSE){ //捉方的子不能动.
return;
}
//---------------------------------------------------------------------------
//2, 在这儿求得吃的那个子的ORDER?
//---------------------------------------------------------------------------
//int order = 0;
//for(int chess = PieceListStart(pos,pos->b256[to]); chess > 0x32; chess = NextPiece(pos,chess)){
// if(chess == to){
// break;
// }
// order++;
//}
//---------------------------------------------------------------------------
//3, 再判断一下这个捉的棋的价值是不是比被捉的棋的价值小
//---------------------------------------------------------------------------
if(PieceValues[pos->b256[from]] >= PieceValues[pos->b256[to]]){
//---------------------------------------------------------------------------
//4, 如果双方的棋子相同,则要判断 1, 这个棋子能不能走, 2, 这个棋能不能反吃对方(马)
//---------------------------------------------------------------------------
if(PIECE_ID(pos->b256[from]) == to_id){
//===================================================================================================
//
if(Is_Can_Move_To_Eat(pos,to,from) == TRUE ){
if(to_id != MA) return;
//fen 3ak4/4a4/2ncb4/4N4/2p1P1b2/6B2/2P6/1N7/9/3AKAB2 b - - 157 157 这个不是
//fen 3ak4/4a4/2ncb4/4N4/2p3b2/6B2/2P6/1N7/9/3AKAB2 b 这个是常捉
int m = horseLegTab(from - to + 256);
if(pos->b256[to+m] == EMPTY) return; //这个马能不能反吃对方
////如果这个是马,则要看一下这个马能不能吃到对方
}
}
//---------------------------------------------------------------------------
//5, 再看一下这个棋有没有其它的棋子保护着
//---------------------------------------------------------------------------
//a, 更新一下from,to的File,Rank信息,
//-------------------------------------------------------
int cap = pos->b256[to];
int piece = pos->b256[from];
ASSERT(cap != EMPTY);
RemovePiece(pos,to); //暂时不去,是因为去了以后加入的次序不对了.
pos->wBitRanks[StoY(from)] ^= xBitMask(from);
pos->wBitFiles[StoX(from)] ^= yBitMask(from);
MovePiece(pos,from,to);
//board
pos->b256[to] = piece;
pos->b256[from] = EMPTY;
//-------------------------------------------------------
//如果没有吃子,也要更新TO
//b, 再看一下有没有其它的棋子保护着
BOOL isP = isPretectedd(pos,which,to,EMPTY);
//BOOL isP = isPretectedd(pos,which,to,to);
//c, 还原一下from,to的File,Rank信息,
pos->wBitRanks[StoY(from)] ^= xBitMask(from);
pos->wBitFiles[StoX(from)] ^= yBitMask(from);
//P256
pos->b256[from] = piece;
pos->b256[to] = cap;
MovePiece(pos,to,from);
InsertPiece(pos,cap,to);
//-------------------------------------------------------
if(isP == TRUE) return;
//}
}
//与上次的捉进行比对
//再在这儿判断一下是不是捉的同一个棋子-------------========================================================
//这个有二个常捉在, 要二次判断那个捉, 所以这个最复杂.
//fen 3a1kb2/2r6/4ba3/p6Np/9/P3p1RcP/9/4B4/4A4/2BK1A3 b - - 53 53
//fen r2akab2/1c7/2n1b1c2/p1R1p3p/5nr2/9/P3P2NP/1CN1C4/5R3/2BAKAB2 b - - 16 16
//保存本次的捉
int num = pos->cap_num[0][which];
pos->LastCapChess[num][0][which] = to_id; //这个只是捉的棋子,
pos->last_to[num][0][which] = to; //
pos->last_ot_from[num][0][which] = ot_from;
//pos->last_ot_to[num][0][which] = ot_to;
if(num < MAX_REAL_CAP_NUM - 1){ //最多同时判断三个常捉
pos->cap_num[0][which]++;
}
}
//for(int from = PieceListStart(pos,RCHE); from > 0x32; from = NextPiece(pos,from)){
//enum {
// EMPTY=0,
// RKING=1, RSHI=2,RXIANG=3, RMA=4, RCHE=5, RPAO=6, RPAWN=7,
// BKING=8, BSHI=9,BXIANG=10,BMA=11,BCHE=12,BPAO=13,BPAWN=14,
// EMPTY16=16, OUTSIDE=32};
//if(last_id == EMPTY){
// //******只有捉了才能更新哇 start
// board->LastCapChess[which] = to_id;
// board->last_to[which] = to; //这次我们捉对方的棋格
// board->ot_from[which] = ot_from;
// //******只有捉了才能更新哇 end
// return TRUE; //只有返回捉子步,才更新一下上次捉的棋子
//}
//else if(last_id == to_id){ //这儿可能还要判断一下是不是吃的同一个棋子,比如移动的那个
// if(last_ot_from == to || last_to == to){ //对方走那,我们捉那
// //******只有捉了才能更新哇 start
// board->LastCapChess[which] = to_id;
// board->last_to[which] = to; //这次我们捉对方的棋格
// board->ot_from[which] = ot_from;
// //******只有捉了才能更新哇 end
// return TRUE;
// }
// //if(last_to == to){ //这个是炮打
// // //******只有捉了才能更新哇 start
// // board->LastCapChess[which] = to_id;
// // board->last_to[which] = to; //这次我们捉对方的棋格
// // board->ot_from[which] = ot_from;
// // //******只有捉了才能更新哇 end
// // return TRUE;
// //}
//}