中国象棋控件 v2.0.13
载入中...
搜索中...
未找到
Fen.cpp
1
71#include "Fen.h"
72
78
79int CFen::FenFromBoard(std::string &szFen, CPiece::ENUM_QiZi (*board)[10],
80 char side, int nStep)
81{
82 for(int j = 0; j < 10; j++)
83 {
84 if(j > 0)
85 szFen += "/";
86
87 int nEmpty = 0;
88 for(int i = 0; i < 9; i++)
89 {
90 CPiece::ENUM_QiZi qz = board[i][j];
91 if(CPiece::IsNoQiZi(qz))
92 nEmpty++;
93 else
94 {
95 if(nEmpty > 0)
96 {
97 szFen += std::to_string(nEmpty);
98 nEmpty = 0;
99 }
100 switch (qz) {
101 case CPiece::RChe:
102 szFen += "R";
103 break;
104 case CPiece::RMa:
105 szFen += "N";
106 break;
107 case CPiece::RXiang:
108 szFen += "B";
109 break;
110 case CPiece::RShi:
111 szFen += "A";
112 break;
113 case CPiece::RShuai:
114 szFen += "K";
115 break;
116 case CPiece::RPao:
117 szFen += "C";
118 break;
119 case CPiece::RBing:
120 szFen += "P";
121 break;
122 case CPiece::BChe:
123 szFen += "r";
124 break;
125 case CPiece::BMa:
126 szFen += "n";
127 break;
128 case CPiece::BXiang:
129 szFen += "b";
130 break;
131 case CPiece::BShi:
132 szFen += "a";
133 break;
134 case CPiece::BShuai:
135 szFen += "k";
136 break;
137 case CPiece::BPao:
138 szFen += "c";
139 break;
140 case CPiece::BBing:
141 szFen += "p";
142 break;
143 }
144 }
145 }
146 if(nEmpty > 0)
147 {
148 szFen += std::to_string(nEmpty);
149 nEmpty = 0;
150 }
151 }
152
153 szFen += " ";
154 szFen += side;
155 szFen += " - - - ";
156 szFen += std::to_string(nStep);
157 return 0;
158}
159
160int CFen::FenToBoard(const std::string &szFen, CPiece::ENUM_QiZi (*board)[10],
161 char &side, int &nStep)
162{
163 int i = 0;
164 int j = 0;
165 int nPos = 0;
166 bool bExit = false;
167 while(nPos < szFen.size())
168 {
169 char c = szFen.at(nPos++);
170 switch (c) {
171 case 'R':
172 board[i][j] = CPiece::RChe;
173 i++;
174 break;
175 case 'N':
176 case 'H':
177 board[i][j] = CPiece::RMa;
178 i++;
179 break;
180 case 'B':
181 case 'E':
182 board[i][j] = CPiece::RXiang;
183 i++;
184 break;
185 case 'A':
186 board[i][j] = CPiece::RShi;
187 i++;
188 break;
189 case 'K':
190 board[i][j] = CPiece::RShuai;
191 i++;
192 break;
193 case 'C':
194 board[i][j] = CPiece::RPao;
195 i++;
196 break;
197 case 'P':
198 board[i][j] = CPiece::RBing;
199 i++;
200 break;
201 case 'r':
202 board[i][j] = CPiece::BChe;
203 i++;
204 break;
205 case 'n':
206 case 'h':
207 board[i][j] = CPiece::BMa;
208 i++;
209 break;
210 case 'b':
211 case 'e':
212 board[i][j] = CPiece::BXiang;
213 i++;
214 break;
215 case 'a':
216 board[i][j] = CPiece::BShi;
217 i++;
218 break;
219 case 'k':
220 board[i][j] = CPiece::BShuai;
221 i++;
222 break;
223 case 'c':
224 board[i][j] = CPiece::BPao;
225 i++;
226 break;
227 case 'p':
228 board[i][j] = CPiece::BBing;
229 i++;
230 break;
231 case '/':
232 j++;
233 i = 0;
234 if(j > 10) bExit = true;
235 break;
236 case ' ':
237 bExit = true;
238 break;
239 default:
240 std::string n;
241 n += c;
242 i += atoi(n.c_str());
243 }
244
245 if(bExit) break;
246 }
247
248 char c = szFen.at(nPos);
249 if('b' == c || 'B' == c)
250 side = 'b';
251 else
252 side = 'r';
253 nPos += 8;
254 std::string n;
255 n += szFen.substr(nPos, szFen.size() - nPos);
256 nStep = atoi(n.c_str());
257 return 0;
258}
259
260int CFen::FenFromStartGame(std::string &szFen,
261 std::vector<CChessGame::strStartGame> startGame,
262 char side,
263 int nStep)
264{
265 if(startGame.empty()) return -1;
266
267 CPiece::ENUM_QiZi board[9][10];
268 int i, j;
269 for (i = 0; i < 9; i++)
270 for (j = 0; j < 10; j++)
271 {
272 board[i][j] = CPiece::NoQiZi;
273 }
274
275 for(auto &it: startGame)
276 {
277 board[it.i][it.j] = it.qz;
278 }
279
280 int nRet = CChessGame::CheckGame(board);
281 if(nRet) return nRet;
282 return FenFromBoard(szFen, board, side, nStep);
283}
static int CheckGame(const CPiece::ENUM_QiZi board[][10])
检测布局是否合法, 使用标准棋盘布局,红下黑上
CFen()
作者:康林 kl222@126.com
Definition Fen.cpp:76