中国象棋控件 v2.0.13
载入中...
搜索中...
未找到
ChessStepsChinese.cpp
1// 作者:康林 <kl222@126.com>
2
3#include "ChessStepsChinese.h"
4
5CChessStepsChinese::CChessStepsChinese() : CChessSteps()
6{
7 m_Ping = "平";
8 m_Jin = "进";
9 m_Tui = "退";
10 m_Qian = "前";
11 m_Zhong = "中";
12 m_Hou = "后";
13}
14
15CChessStepsChinese::~CChessStepsChinese()
16{}
17
18//详见《象棋竞赛规则(2011)》第二章 第7条
19std::string CChessStepsChinese::toString()
20{
21 std::string szRet;
22 m_nSteps = 0;
23
24 while (m_nSteps < m_Steps.size()) {
25 strStep curStep = m_Steps[m_nSteps];
26 switch (m_nSteps % 4) {
27 case 0:
28 szRet += std::to_string(m_nSteps / 4 + 1) + ". ";
29 break;
30 case 1:
31 {
32 strStep fromStep = m_Steps[m_nSteps - 1];
33 szRet += StepToString(curStep, fromStep);
34 if(!curStep.szDescript.empty())
35 {
36 szRet += " {";
37 szRet += curStep.szDescript;
38 szRet += "}";
39 }
40
41 m_Board[fromStep.i][fromStep.j] = CPiece::NoQiZi;
42 m_Board[curStep.i][curStep.j] = fromStep.qz;
43 }
44 break;
45 case 2:
46 szRet += " ";
47 break;
48 case 3:
49 {
50 strStep fromStep = m_Steps[m_nSteps - 1];
51 szRet += StepToString(curStep, fromStep);
52 if(!curStep.szDescript.empty())
53 {
54 szRet += " {";
55 szRet += curStep.szDescript;
56 szRet += "}";
57 }
58 szRet += "\n";
59
60 m_Board[fromStep.i][fromStep.j] = CPiece::NoQiZi;
61 m_Board[curStep.i][curStep.j] = fromStep.qz;
62 }
63 break;
64
65 }
66 m_nSteps++;
67 }
68
69 return szRet;
70}
71
72int CChessStepsChinese::GetStep(int &i, int &j, CPiece::ENUM_QiZi &qz, std::string &szDescript)
73{
74 return 0;
75}
76
77std::string CChessStepsChinese::GetQiZi(CPiece::ENUM_QiZi qz)
78{
79 switch (qz) {
80 case CPiece::RShuai:
81 return "帅";
82 case CPiece::RShi:
83 return "仕";
84 case CPiece::RXiang:
85 return "相";
86 case CPiece::RMa:
87 case CPiece::BMa:
88 return "马";
89 case CPiece::RChe:
90 case CPiece::BChe:
91 return "车";
92 case CPiece::RPao:
93 case CPiece::BPao:
94 return "炮";
95 case CPiece::RBing:
96 return "兵";
97 case CPiece::BShuai:
98 return "将";
99 case CPiece::BShi:
100 return "士";
101 case CPiece::BXiang:
102 return "象";
103 case CPiece::BBing:
104 return "卒";
105 }
106 return "";
107}
108
109std::string CChessStepsChinese::StepToString(strStep to, strStep from)
110{
111 std::string szRet;
112
113 CPiece::ENUM_QiZi qz = from.qz;
114 switch (qz) {
115 case CPiece::RShuai:
116 szRet = GetQiZi(qz) + ChineseNumber[9 - from.i];
117 if(from.j == to.j)
118 szRet += m_Ping + ChineseNumber[9 - to.i];
119 else
120 {
121 if(from.j < to.j)
122 szRet += m_Tui;
123 else
124 szRet += m_Jin;
125 szRet += ChineseNumber[1];
126 }
127 break;
128 case CPiece::BShuai:
129 szRet = GetQiZi(qz) + std::to_string(from.i + 1);
130 if(from.j == to.j)
131 szRet += m_Ping + std::to_string(to.i + 1);
132 else
133 {
134 if(from.j > to.j)
135 szRet += m_Tui;
136 else
137 szRet += m_Jin;
138 szRet += "1";
139 }
140 break;
141 case CPiece::RShi:
142 case CPiece::RXiang:
143 szRet = GetQiZi(qz) + ChineseNumber[9 - from.i];
144 if(from.j < to.j)
145 szRet += m_Tui;
146 else
147 szRet += m_Jin;
148 szRet += ChineseNumber[9 - to.i];
149 break;
150 case CPiece::BShi:
151 case CPiece::BXiang:
152 szRet = GetQiZi(qz) + std::to_string(from.i + 1);
153 if(from.j > to.j)
154 szRet += m_Tui;
155 else
156 szRet += m_Jin;
157 szRet += std::to_string(to.i + 1);
158 break;
159
160 case CPiece::RMa:
161 {
162 int nRet = FindSameQiZi(from);
163 if(0 == nRet)
164 {
165 szRet = GetQiZi(qz) + ChineseNumber[9 - from.i];
166 } else if(nRet > 0)
167 {
168 szRet = m_Qian + GetQiZi(qz);
169 } else if(nRet < 0)
170 {
171 szRet = m_Hou + GetQiZi(qz);
172 }
173 if(from.j < to.j)
174 szRet += m_Tui;
175 else
176 szRet += m_Jin;
177 szRet += ChineseNumber[9 - to.i];
178 break;
179 }
180 case CPiece::BMa:
181 {
182 int nRet = FindSameQiZi(from);
183 if(0 == nRet)
184 {
185 szRet = GetQiZi(qz) + std::to_string(from.i + 1);
186 } else if(nRet > 0)
187 {
188 szRet = m_Qian + GetQiZi(qz);
189 } else if(nRet < 0)
190 {
191 szRet = m_Hou + GetQiZi(qz);
192 }
193 if(from.j > to.j)
194 szRet += m_Tui;
195 else
196 szRet += m_Jin;
197 szRet += std::to_string(to.i + 1);
198 break;
199 }
200 case CPiece::RChe:
201 case CPiece::RPao:
202 {
203 int nRet = FindSameQiZi(from);
204 if(0 == nRet)
205 {
206 szRet = GetQiZi(qz) + ChineseNumber[9 - from.i];
207 } else if(nRet > 0)
208 {
209 szRet = m_Qian + GetQiZi(qz);
210 } else if(nRet < 0)
211 {
212 szRet = m_Hou + GetQiZi(qz);
213 }
214 if(from.j == to.j)
215 szRet += m_Ping + ChineseNumber[9 - to.i];
216 else
217 {
218 if(from.j < to.j)
219 szRet += m_Tui;
220 else
221 szRet += m_Jin;
222 szRet += ChineseNumber[std::abs(to.j - from.j)];
223 }
224 break;
225 }
226 case CPiece::BChe:
227 case CPiece::BPao:
228 {
229 int nRet = FindSameQiZi(from);
230 if(0 == nRet)
231 {
232 szRet = GetQiZi(qz) + std::to_string(from.i + 1);
233 } else if(nRet > 0)
234 {
235 szRet = m_Qian + GetQiZi(qz);
236 } else if(nRet < 0)
237 {
238 szRet = m_Hou + GetQiZi(qz);
239 }
240 if(from.j == to.j)
241 szRet += m_Ping + std::to_string(to.i + 1);
242 else
243 {
244 if(from.j < to.j)
245 szRet += m_Jin;
246 else
247 szRet += m_Tui;
248 szRet += std::to_string(std::abs(to.j - from.j));
249 }
250 break;
251 }
252 case CPiece::RBing:
253 {
254 szRet = FindSameColumBing(from);
255 if(szRet.empty())
256 {
257 szRet = GetQiZi(qz) + ChineseNumber[9 - from.i];
258
259 } else {
260 szRet += GetQiZi(qz);
261 }
262
263 if(from.j == to.j)
264 szRet += m_Ping + ChineseNumber[9 - to.i];
265 else
266 szRet += m_Jin + ChineseNumber[std::abs(to.j - from.j)];
267 }
268 break;
269 case CPiece::BBing:
270 {
271 szRet = FindSameColumBing(from);
272 if(szRet.empty())
273 szRet = GetQiZi(qz) + std::to_string(from.i + 1);
274 else
275 szRet += GetQiZi(qz);
276
277 if(from.j == to.j)
278 szRet += m_Ping + std::to_string(to.i + 1);
279 else
280 szRet += m_Jin + std::to_string(std::abs(to.j - from.j));
281 }
282 break;
283 }
284 return szRet;
285}
286
292int CChessStepsChinese::FindSameQiZi(strStep step)
293{
294 int nRet = 0;
295 for(int j = 0; j < 10; j++)
296 {
297 if(j == step.j) continue;
298
299 if(step.qz == m_Board[step.i][j])
300 {
301 if(CPiece::IsRedQiZi(step.qz))
302 {
303 if(j < step.j)
304 nRet--;
305 else
306 nRet++;
307 break;
308 }
309 else
310 {
311 if(j > step.j)
312 nRet--;
313 else
314 nRet++;
315 break;
316 }
317 }
318 }
319 return nRet;
320}
321
322/*
323 * 兵要按情况讨论:
324 * (1) 三个兵在一条纵线上:用“前”、“中”和“后”来区别;
325 * (2) 三个以上兵在一条纵线上:最前面的兵用“一”代替“前”,以后依次是“二”、“三”、“四”和“五”;
326 * (3) 在有两条纵线,每条纵线上都有一个以上的兵:按照“先从左到右,再从前到后”(即先看最左边一列,
327 * 从前到后依次标记为“一”和“二”,可能还有“三”,再看右边一列)的顺序,
328 * 把这些兵的位置标依次标记为“一”、“二”、“三”、“四”和“五”,不在这两条纵线上的兵不参与标记。
329 */
330std::string CChessStepsChinese::FindSameColumBing(strStep step)
331{
332 std::string szRet;
333 int nRet = FindSameQiZi(step);
334 if(0 == nRet)
335 return szRet;
336
337 if(CPiece::IsRedQiZi(step.qz))
338 {
339 //判断第(3)种情况
340 int nTotal = 0;
341 int nFirstCol = -1;
342 int nTowCol = -1;
343 for(int i = 0; i < 9; i++)
344 {
345 int nNum = 0;
346 for(int j = 0; j < 10; j++)
347 {
348 if(m_Board[i][j] == step.qz)
349 nNum++;
350 }
351
352 if(nNum > 1)
353 {
354 if(-1 == nFirstCol)
355 {
356 nTotal = nNum;
357 nFirstCol = i;
358 }
359 else
360 nTowCol = i;
361 }
362 }
363
364 //第(1),(2)种情况
365 if(-1 == nTowCol)
366 {
367 int nNum = 0;
368 for(int j = 0; j < 10; j++)
369 {
370 if(m_Board[step.i][j] == step.qz)
371 nNum++;
372 }
373
374 int curNum = 0;
375 for(int j = 0; j < 10; j++)
376 {
377 if(m_Board[step.i][j] == step.qz)
378 curNum++;
379 if(j == step.j)
380 break;
381 }
382
383 switch (nNum) {
384 case 2:
385 if(1 == curNum)
386 return m_Qian;
387 else
388 return m_Hou;
389 case 3:
390 switch(curNum){
391 case 1:
392 return m_Qian;
393 case 2:
394 return m_Zhong;
395 case 3:
396 return m_Hou;
397 }
398 break;
399 case 4:
400 case 5:
401 return ChineseNumber[curNum];
402 }
403 }
404 //第(3)种情况
405 int curNum = 0;
406 for(int j = 0; j < 10; j++)
407 {
408 if(m_Board[step.i][j] == step.qz)
409 curNum++;
410 if(j == step.j)
411 break;
412 }
413 if(nFirstCol == step.i)
414 return ChineseNumber[curNum];
415 return ChineseNumber[curNum + nTotal];
416
417 } else {
418 //判断第(3)种情况
419 int nTotal = 0;
420 int nFirstCol = -1;
421 int nTowCol = -1;
422 for(int i = 8; i >=0 ; i--)
423 {
424 int nNum = 0;
425 for(int j = 9; j >= 0; j--)
426 {
427 if(m_Board[i][j] == step.qz)
428 nNum++;
429 }
430
431 if(nNum >= 2)
432 {
433 if(-1 == nFirstCol)
434 {
435 nFirstCol = i;
436 nTotal = nNum;
437 }
438 else
439 nTowCol += i;
440 }
441
442 }
443 //第(1),(2)种情况
444 if(-1 == nTowCol)
445 {
446 int nNum = 0;
447 for(int j = 9; j >= 0; j--)
448 {
449 if(m_Board[step.i][j] == step.qz)
450 nNum++;
451 }
452
453 int curNum = 0;
454 for(int j = 9; j >= 0; j--)
455 {
456 if(m_Board[step.i][j] == step.qz)
457 curNum++;
458 if(j == step.j)
459 break;
460 }
461
462 switch (nNum) {
463 case 2:
464 if(1 == curNum)
465 return m_Qian;
466 else
467 return m_Hou;
468 case 3:
469 switch(curNum){
470 case 1:
471 return m_Qian;
472 case 2:
473 return m_Zhong;
474 case 3:
475 return m_Hou;
476 }
477 break;
478 case 4:
479 case 5:
480 return ChineseNumber[curNum];
481 }
482 }
483 //第(3)种情况
484 int curNum = 0;
485 for(int j = 9; j >= 0; j--)
486 {
487 if(m_Board[step.i][j] == step.qz)
488 curNum++;
489 if(j == step.j)
490 break;
491 }
492 if(nFirstCol == step.i)
493 return ChineseNumber[curNum];
494 return ChineseNumber[curNum + nTotal];
495 }
496}
static bool IsRedQiZi(ENUM_QiZi qz)
函数名:GetQiZiSide 功 能:得到棋子是红棋,还是黑棋 参 数: ENUM_QiZi qz:要专断的棋子 返回值:返回红棋还是黑棋或无棋 作 者:康 林 版 本:1....
Definition Piece.cpp:31