7CChineseChess::CChineseChess()
10 m_bPromptMessage =
true;
11 SetBoardLayout(TopBlackAndBottomRed);
14CChineseChess::~CChineseChess()
17int CChineseChess::Initial()
19 m_WalkState = RedReadly;
20 m_PreviouPositionX = m_PreviouPositionX = -1;
21 m_CurrentPositionX = m_CurrentPositionY = -1;
31int CChineseChess::SetBoardLayout(ENUM_BoardLayout layout)
34 m_BoardLayout = layout;
36 CPiece::ENUM_QiZi board[9][10];
39 for (i = 0; i < 9; i++)
40 for (j = 0; j < 10; j++)
43 board[i][j] = CPiece::NoQiZi;
46 if(m_Game.m_StartGame.size())
48 std::vector<CChessGame::strStartGame>::iterator it;
49 for(it = m_Game.m_StartGame.begin(); it != m_Game.m_StartGame.end(); it++)
52 || (CPiece::IsBlackQiZi(it->qz) && (m_BoardLayout & OnlyTopBlack)))
53 board[it->i][it->j] = it->qz;
58 for(i = 0; i < 9; i++)
59 for(j = 0; j < 10; j++)
61 if(CPiece::IsExistQiZi(board[i][j]))
64 ConvertQiPang(i, j, x, y);
71 if (m_BoardLayout & OnlyTopBlack)
73 if (m_BoardLayout & SwapRedBetweenBlack)
94 if (m_BoardLayout & OnlyBottomRed)
96 if (m_BoardLayout & SwapRedBetweenBlack)
121bool CChineseChess::IsValidPosition(
int i,
int j)
123 if (i < 0 || i > 9 - 1 || j < 0 || j > 10 - 1)
130int CChineseChess::EnablePromptSound(
bool sound)
132 m_bPromptSound = sound;
136bool CChineseChess::getEnablePromptSound()
138 return m_bPromptSound;
141int CChineseChess::EnablePromptMessage(
bool bMsg)
143 m_bPromptMessage = bMsg;
147bool CChineseChess::getEnablePromptMessage()
149 return m_bPromptMessage;
165 if (-1 == i || -1 == j)
198 ConvertQiPang(i, j, x, y);
206 if (m_bPromptSound) onPromptSound(Select);
208 CleanPrompt(m_PreviouPositionX, m_PreviouPositionY);
209 CleanPrompt(m_CurrentPositionX, m_CurrentPositionY);
211 m_PreviouPositionX = i;
212 m_PreviouPositionY = j;
216 m_WalkState = RedWalked;
219 m_CurrentPositionX = i;
220 m_CurrentPositionY = j;
223 m_ChessBoard[m_PreviouPositionX][m_PreviouPositionY] = CPiece::NoQiZi;
228 m_WalkState = BlackReadly;
231 if (m_bPromptSound) onPromptSound(Select);
233 CleanPrompt(m_PreviouPositionX, m_PreviouPositionY);
234 CleanPrompt(m_CurrentPositionX, m_CurrentPositionY);
236 m_PreviouPositionX = i;
237 m_PreviouPositionY = j;
240 m_WalkState = BlackWalked;
243 m_CurrentPositionX = i;
244 m_CurrentPositionY = j;
247 m_ChessBoard[m_PreviouPositionX][m_PreviouPositionY] = CPiece::NoQiZi;
252 m_WalkState = RedReadly;
259 if (m_bPromptSound) onPromptSound();
277bool CChineseChess::IsGoChess(
int i,
int j)
279 if(!IsValidPosition(i, j))
293 m_WalkState = RedReadly;
299 case CGoRule::JIANGJUN:
300 if(m_bPromptSound) onPromptSound(JiangJun);
302 case CGoRule::RETURNTRUE:
305 m_ChessBoard[i][j] ? onPromptSound(Eat) : onPromptSound(Go);
308 case CGoRule::BEIJIANGJUN:
311 case CGoRule::JIANGDUIMIAN:
314 case CGoRule::RETURNFALSE:
320 return CPiece::IsBlackQiZi(
m_ChessBoard[i][j]) ? true :
false;
326 m_WalkState = BlackReadly;
332 case CGoRule::JIANGJUN:
333 if (m_bPromptSound) onPromptSound(JiangJun);
335 case CGoRule::RETURNTRUE:
338 m_ChessBoard[i][j] ? onPromptSound(Eat) : onPromptSound(Go);
341 case CGoRule::BEIJIANGJUN:
344 case CGoRule::JIANGDUIMIAN:
347 case CGoRule::RETURNFALSE:
370 CPiece::ENUM_QiZi qz;
373 if (m_bPromptSound) onPromptSound();
377 ConvertQiPang(i, j, x, y);
397 CPiece::ENUM_QiZi qz;
403 CleanPrompt(m_PreviouPositionX, m_PreviouPositionY);
404 CleanPrompt(m_CurrentPositionX, m_CurrentPositionY);
407 if (m_bPromptSound) onPromptSound();
411 CleanPrompt(m_PreviouPositionX, m_PreviouPositionY);
412 CleanPrompt(m_CurrentPositionX, m_CurrentPositionY);
416 if (m_bPromptSound) onPromptSound();
421 ConvertQiPang(i, j, x, y);
423 m_CurrentPositionX = x;
424 m_CurrentPositionY = y;
425 CleanPrompt(m_CurrentPositionX, m_CurrentPositionY);
429 if (m_bPromptSound) onPromptSound();
432 ConvertQiPang(i, j, x, y);
434 m_PreviouPositionX = x;
435 m_PreviouPositionY = y;
437 if (IsValidPosition(m_PreviouPositionX, m_PreviouPositionY))
444 m_WalkState = BlackReadly;
448 m_WalkState = RedReadly;
458 std::string szFile(pszFile);
459 size_t pos = szFile.rfind(
'.');
460 if(szFile.npos != pos)
462 std::string szExt = szFile.substr(pos + 1);
463 std::transform(szExt.begin(), szExt.end(), szExt.begin(), ::tolower);
465 return m_Game.SaveChessGamePgn(pszFile);
474 std::string szFile(pszFile);
475 size_t pos = szFile.rfind(
'.');
476 if(szFile.npos != pos)
478 std::string szExt = szFile.substr(pos + 1);
479 std::transform(szExt.begin(), szExt.end(), szExt.begin(), ::tolower);
481 return m_Game.LoadChessGamePgn(pszFile);
484 nRet = m_Game.LoadChessGame(pszFile);
485 if (nRet)
return nRet;
490 nRet = m_Game.LoadChessGame(pszFile);
491 if (nRet)
return nRet;
494 SetBoardLayout(m_BoardLayout);
498int CChineseChess::SetRedName(
const char* pszName)
500 return m_Game.SetRedName(pszName);
503std::string CChineseChess::GetRedName()
505 return m_Game.GetRedName();
508int CChineseChess::SetBlackName(
const char* pszName)
510 return m_Game.SetBlackName(pszName);
513std::string CChineseChess::GetBlackName()
515 return m_Game.GetBlackName();
518int CChineseChess::SetStartTime(
const time_t& tm)
520 return m_Game.SetStartTime(tm);
523time_t CChineseChess::GetStartTime()
525 return m_Game.GetStartTime();
528int CChineseChess::SetEndTime(
const time_t& tm)
530 return m_Game.SetEndTime(tm);
533time_t CChineseChess::GetEndTime()
535 return m_Game.GetEndTime();
538std::string CChineseChess::GetGameTag(
const std::string &tag)
540 return m_Game.GetTag(tag);
543int CChineseChess::AddGameTag(
const std::string &tag,
const std::string &val)
545 return m_Game.AddTag(tag, val);
548int CChineseChess::ConvertQiPang(
const int &i,
const int &j,
int &x,
int &y)
550 if(m_BoardLayout & SwapRedBetweenBlack)
int GetPreviouStep(int &i, int &j, CPiece::ENUM_QiZi &qz)
函数名:GetPreviouStep 功 能:上步棋 参 数:无 返回值:走棋步数 作 者:康 林 版 本:1.0.0.1 日 期:2004-10-5 时 间:10:19:51
int SaveChessGame(const char *pFileName)
Saves the chess game
int SaveStep(int i, int j, CPiece::ENUM_QiZi qz, const char *pDescript=nullptr, time_t tm=time(nullptr))
保存一步
int GetNextStep(int &i, int &j, CPiece::ENUM_QiZi &qz)
Gets the next step
static int CheckGame(const CPiece::ENUM_QiZi board[][10])
检测布局是否合法, 使用标准棋盘布局,红下黑上
int CleanPrompt(int &i, int &j)
清理提示,并把提示框位置设置成无效值
CPiece::ENUM_QiZi m_ChessBoard[9][10]
棋盘描述
virtual int onPromptMessage(CGoRule::ENUM_ReturnValue val)=0
提示错误消息
virtual int onGoChess(int i, int j, CPiece::ENUM_QiZi chess)=0
走棋事件
enum CChineseChess::_ENUM_BoardLayout ENUM_BoardLayout
标准棋盘布局:详见《象棋竞赛规则(2011)》第一章 第1条。红棋在下,黑棋在上。 界面可以支持非标准棋盘布局(红在上,黑在下)
int PreviouStep()
函数名:PreviouStep 功 能:上步棋 参 数:无 返回值:走棋步数 作 者:康 林 版 本:1.0.0.1 日 期:2004-10-5 时 间:10:19:51
virtual int onDrawPrompt(int i, int j)=0
画提示框
virtual int LoadChessGame(const char *pszFile)
加载棋局。 根据文件扩展名来解析文件的格式。 当前支持自定义格式、PGN格式
virtual int onCleanPrompt(int i, int j)=0
清除提示框
int NextStep()
函数名:NextStep 功 能:下步棋 参 数:无 返回值:走棋步数 作 者:康 林 版 本:1.0.0.1 日 期:2004-10-5 时 间:10:19:33
bool GoChess(int i, int j, bool bNext=false)
走棋
virtual int SaveChessGame(const char *pszFile)
保存棋局。 根据文件扩展名来保存为相应的格式。 当前支持自定义格式、PGN格式
ENUM_ReturnValue GoChess(int ito, int jto, int ifrom, int jfrom, CPiece::ENUM_QiZi ChessBoard[][10])
函数名:GoChess 功 能:判断能否从点(ifrom, jfrom)到点(ito, jto)走棋 参 数: int ito:目标点横坐标[0-8] int jto:目标点纵坐标[0-9] int i...
static bool IsRedQiZi(ENUM_QiZi qz)
函数名:GetQiZiSide 功 能:得到棋子是红棋,还是黑棋 参 数: ENUM_QiZi qz:要专断的棋子 返回值:返回红棋还是黑棋或无棋 作 者:康 林 版 本:1....