6CChineseChess::CChineseChess()
9 m_bPromptMessage =
true;
10 SetBoardLayout(TopBlackAndBottomRed);
13CChineseChess::~CChineseChess()
16int CChineseChess::Initial()
18 m_WalkState = RedReadly;
19 m_PreviouPositionX = m_PreviouPositionX = -1;
20 m_CurrentPositionX = m_CurrentPositionY = -1;
30int CChineseChess::SetBoardLayout(ENUM_BoardLayout layout)
33 m_BoardLayout = layout;
38 for (i = 0; i < 9; i++)
39 for (j = 0; j < 10; j++)
42 board[i][j] = CPiece::NoQiZi;
45 if(m_Game.m_StartGame.size())
47 std::vector<CChessGame::strStartGame>::iterator it;
48 for(it = m_Game.m_StartGame.begin(); it != m_Game.m_StartGame.end(); it++)
51 || (CPiece::IsBlackQiZi(it->qz) && (m_BoardLayout & OnlyTopBlack)))
52 board[it->i][it->j] = it->qz;
57 for(i = 0; i < 9; i++)
58 for(j = 0; j < 10; j++)
60 if(CPiece::IsExistQiZi(board[i][j]))
63 ConvertQiPang(i, j, x, y);
70 if (m_BoardLayout & OnlyTopBlack)
72 if (m_BoardLayout & SwapRedBetweenBlack)
93 if (m_BoardLayout & OnlyBottomRed)
95 if (m_BoardLayout & SwapRedBetweenBlack)
120bool CChineseChess::IsValidPosition(
int i,
int j)
122 if (i < 0 || i > (9 - 1) || j < 0 || j > (10 - 1))
129int CChineseChess::EnablePromptSound(
bool sound)
131 m_bPromptSound = sound;
135bool CChineseChess::getEnablePromptSound()
137 return m_bPromptSound;
140int CChineseChess::EnablePromptMessage(
bool bMsg)
142 m_bPromptMessage = bMsg;
146bool CChineseChess::getEnablePromptMessage()
148 return m_bPromptMessage;
164 if (-1 == i || -1 == j)
197 ConvertQiPang(i, j, x, y);
205 if (m_bPromptSound) onPromptSound(Select);
207 CleanPrompt(m_PreviouPositionX, m_PreviouPositionY);
208 CleanPrompt(m_CurrentPositionX, m_CurrentPositionY);
210 m_PreviouPositionX = i;
211 m_PreviouPositionY = j;
215 m_WalkState = RedWalked;
218 m_CurrentPositionX = i;
219 m_CurrentPositionY = j;
222 m_ChessBoard[m_PreviouPositionX][m_PreviouPositionY] = CPiece::NoQiZi;
227 m_WalkState = BlackReadly;
230 if (m_bPromptSound) onPromptSound(Select);
232 CleanPrompt(m_PreviouPositionX, m_PreviouPositionY);
233 CleanPrompt(m_CurrentPositionX, m_CurrentPositionY);
235 m_PreviouPositionX = i;
236 m_PreviouPositionY = j;
239 m_WalkState = BlackWalked;
242 m_CurrentPositionX = i;
243 m_CurrentPositionY = j;
246 m_ChessBoard[m_PreviouPositionX][m_PreviouPositionY] = CPiece::NoQiZi;
251 m_WalkState = RedReadly;
258 if (m_bPromptSound) onPromptSound();
276bool CChineseChess::IsGoChess(
int i,
int j)
278 if(!IsValidPosition(i, j))
292 m_WalkState = RedReadly;
299 if(m_bPromptSound) onPromptSound(JiangJun);
304 m_ChessBoard[i][j] ? onPromptSound(Eat) : onPromptSound(Go);
313 case CGoRule::RETURNFALSE:
319 return CPiece::IsBlackQiZi(
m_ChessBoard[i][j]) ? true :
false;
325 m_WalkState = BlackReadly;
332 if (m_bPromptSound) onPromptSound(JiangJun);
337 m_ChessBoard[i][j] ? onPromptSound(Eat) : onPromptSound(Go);
346 case CGoRule::RETURNFALSE:
372 if (m_bPromptSound) onPromptSound();
376 ConvertQiPang(i, j, x, y);
402 CleanPrompt(m_PreviouPositionX, m_PreviouPositionY);
403 CleanPrompt(m_CurrentPositionX, m_CurrentPositionY);
406 if (m_bPromptSound) onPromptSound();
410 CleanPrompt(m_PreviouPositionX, m_PreviouPositionY);
411 CleanPrompt(m_CurrentPositionX, m_CurrentPositionY);
415 if (m_bPromptSound) onPromptSound();
420 ConvertQiPang(i, j, x, y);
422 m_CurrentPositionX = x;
423 m_CurrentPositionY = y;
424 CleanPrompt(m_CurrentPositionX, m_CurrentPositionY);
428 if (m_bPromptSound) onPromptSound();
431 ConvertQiPang(i, j, x, y);
433 m_PreviouPositionX = x;
434 m_PreviouPositionY = y;
436 if (IsValidPosition(m_PreviouPositionX, m_PreviouPositionY))
443 m_WalkState = BlackReadly;
447 m_WalkState = RedReadly;
457 std::string szFile(pszFile);
458 size_t pos = szFile.rfind(
'.');
459 if(szFile.npos != pos)
461 std::string szExt = szFile.substr(pos + 1);
462 std::transform(szExt.begin(), szExt.end(), szExt.begin(), ::tolower);
464 return m_Game.SaveChessGamePgn(pszFile);
473 std::string szFile(pszFile);
474 size_t pos = szFile.rfind(
'.');
475 if(szFile.npos != pos)
477 std::string szExt = szFile.substr(pos + 1);
478 std::transform(szExt.begin(), szExt.end(), szExt.begin(), ::tolower);
480 return m_Game.LoadChessGamePgn(pszFile);
483 nRet = m_Game.LoadChessGame(pszFile);
484 if (nRet)
return nRet;
489 nRet = m_Game.LoadChessGame(pszFile);
490 if (nRet)
return nRet;
493 SetBoardLayout(m_BoardLayout);
497int CChineseChess::SetRedName(
const char* pszName)
499 return m_Game.SetRedName(pszName);
502std::string CChineseChess::GetRedName()
504 return m_Game.GetRedName();
507int CChineseChess::SetBlackName(
const char* pszName)
509 return m_Game.SetBlackName(pszName);
512std::string CChineseChess::GetBlackName()
514 return m_Game.GetBlackName();
517int CChineseChess::SetStartTime(
const time_t& tm)
519 return m_Game.SetStartTime(tm);
522time_t CChineseChess::GetStartTime()
524 return m_Game.GetStartTime();
527int CChineseChess::SetEndTime(
const time_t& tm)
529 return m_Game.SetEndTime(tm);
532time_t CChineseChess::GetEndTime()
534 return m_Game.GetEndTime();
537std::string CChineseChess::GetGameTag(
const std::string &tag)
539 return m_Game.GetTag(tag);
542int CChineseChess::AddGameTag(
const std::string &tag,
const std::string &val)
544 return m_Game.AddTag(tag, val);
547int CChineseChess::ConvertQiPang(
const int &i,
const int &j,
int &x,
int &y)
549 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....
enum CPiece::_ENUM_QiZi ENUM_QiZi
棋子枚举值 四个位表示棋子,最左1位表示颜色