1#include "FrmChineseChess.h"
2#include "ui_FrmChineseChess.h"
3#include "DlgAbout/DlgAbout.h"
4#include "RabbitCommonDir.h"
5#include "RabbitCommonTools.h"
11#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
12 #include <QSoundEffect>
18CFrmChineseChess::CFrmChineseChess(QWidget *parent) :
22 m_QiPangColor(0, 0, 0),
23 m_TiShiBoxColor(0, 255, 0)
27 m_QiPangStartX = m_QiPangStartY = 0;
30 m_QiPangPicture.load(
":/image/QIPANG");
31 SetTransparentImage(m_QiPangPicture);
32 m_RedShuai.load(
":/image/RSHUAI");
34 m_RedShi.load(
":/image/RSHI");
36 m_RedXiang.load(
":/image/RXIANG");
38 m_RedMa.load(
":/image/RMA");
40 m_RedChe.load(
":/image/RCHE");
42 m_RedBing.load(
":/image/RBING");
44 m_RedPao.load(
":/image/RPAO");
46 m_BlackShuai.load(
":/image/BSHUAI");
48 m_BlackShi.load(
":/image/BSHI");
50 m_BlackXiang.load(
":/image/BXIANG");
52 m_BlackMa.load(
":/image/BMA");
54 m_BlackChe.load(
":/image/BCHE");
56 m_BlackBing.load(
":/image/BZU");
58 m_BlackPao.load(
":/image/BPAO");
61 m_Chu.load(
":/image/CHU");
62 SetTransparentImage(m_Chu);
63 m_He.load(
":/image/HE");
64 SetTransparentImage(m_He);
65 m_Han.load(
":/image/HAN");
66 SetTransparentImage(m_Han);
67 m_Jie.load(
":/image/JIE");
68 SetTransparentImage(m_Jie);
69 m_KL.load(
":/image/KL");
72CFrmChineseChess::~CFrmChineseChess()
77static QSharedPointer<QTranslator> g_Translator;
80 Q_INIT_RESOURCE(ResourceChineseChess);
81#if (defined(DEBUG) || defined(_DEBUG)) && !defined (BUILD_SHARED_LIBS)
82 Q_INIT_RESOURCE(translations_ChineseChessQt);
84 g_Translator = RabbitCommon::CTools::Instance()->InstallTranslator(
86 RabbitCommon::CTools::TranslationType::Library,
96 RabbitCommon::CTools::Instance()->RemoveTranslator(g_Translator);
98#if (defined(DEBUG) || defined(_DEBUG)) && !defined (BUILD_SHARED_LIBS)
99 Q_CLEANUP_RESOURCE(translations_ChineseChessQt);
101 Q_CLEANUP_RESOURCE(ResourceChineseChess);
105void CFrmChineseChess::mouseReleaseEvent(QMouseEvent *event)
109 QPoint p =
event->pos();
112 ConvertCoordinate(&x, &y, &i, &j);
119void CFrmChineseChess::paintEvent(QPaintEvent *event)
121 QPainter painter(
this);
124 painter.setRenderHint(QPainter::SmoothPixmapTransform);
126 DrawQiPang(&painter, rect());
129void CFrmChineseChess::resizeEvent(QResizeEvent *event)
131 QSize s =
event->size();
132 SetQiPang(s.width(), s.height());
135int CFrmChineseChess::onPromptSound(PROMPT_SOUND sound)
141 szFile =
":/sound/CHECK";
144 szFile =
":/sound/EAT";
147 szFile =
":/sound/GO";
150 szFile =
":/sound/DEAD";
153 szFile =
":/sound/SELECT";
158#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
160 effect.setSource(QUrl::fromLocalFile(szFile));
165 QSound::play(szFile);
172 QMessageBox msg(
this);
175 case CGoRule::BEIJIANGJUN:
176 msg.setText(tr(
"This step cannot be taken, otherwise you will lose"));
177 msg.setWindowTitle(tr(
"checked"));
179 case CGoRule::JIANGDUIMIAN:
180 msg.setText(tr(
"This step cannot be taken, otherwise you will lose"));
181 msg.setWindowTitle(tr(
"Opposite"));
210 emit sigGoChess(i, j, chess);
214void CFrmChineseChess::AboutBox()
216 CDlgAbout about(
this);
217 about.m_szAppName = tr(
"Chinese chess control");
218 about.m_szHomePage =
"https://github.com/KangLin/ChineseChessControl";
219 about.m_szCopyrightTime =
"1994 - " + QString::number(QDate::currentDate().year());
223QDateTime CFrmChineseChess::GetStartTime()
225 time_t t = CChineseChess::GetStartTime();
227 time.setMSecsSinceEpoch(t);
231int CFrmChineseChess::SetStartTime(
const QDateTime &t)
233 return CChineseChess::SetStartTime(t.toMSecsSinceEpoch());
236QDateTime CFrmChineseChess::GetEndTime()
239 t.setMSecsSinceEpoch(CChineseChess::GetEndTime());
243int CFrmChineseChess::SetEndTime(
const QDateTime &t)
245 return CChineseChess::SetEndTime(t.toMSecsSinceEpoch());
248QString CFrmChineseChess::GetRedName()
250 return CChineseChess::GetRedName().c_str();
253int CFrmChineseChess::SetRedName(
const QString &name)
255 return CChineseChess::SetRedName(name.toStdString().c_str());
258QString CFrmChineseChess::GetBlackName()
260 return CChineseChess::GetBlackName().c_str();
263int CFrmChineseChess::SetBlackName(
const QString &name)
265 return CChineseChess::SetBlackName(name.toStdString().c_str());
285bool CFrmChineseChess::ConvertCoordinate(
long *x,
long *y,
int *i,
int *j, ENUM_ConvertCoordinate eCC)
290 *i = (*x - m_QiPangStartX + m_QiPangDistance / 2) / m_QiPangDistance;
291 *j = (*y - m_QiPangStartY + m_QiPangDistance / 2) / m_QiPangDistance;
294 *x = m_QiPangStartX + *i * m_QiPangDistance;
295 *y = m_QiPangStartY + *j * m_QiPangDistance;
313bool CFrmChineseChess::SetQiPang(
int width,
int height)
317 m_QiPangDistance = height / 11;
318 m_QiPangStartX = (width - m_QiPangDistance * 10) / 2 + m_QiPangDistance;
319 m_QiPangStartY = m_QiPangDistance;
323 m_QiPangDistance = width / 10;
324 m_QiPangStartX = m_QiPangDistance;
325 m_QiPangStartY = (height - m_QiPangDistance * 11) / 2 + m_QiPangDistance;
342void CFrmChineseChess::DrawQiPang(QPainter *pPainter, QRect rect)
344 if(
nullptr == pPainter)
349 DrawImage(pPainter, rect, m_QiPangPicture);
352 for (i = 0; i < 9; i++)
354 if (i == 0 || i == 8)
357 pen.setColor(m_QiPangColor);
359 pPainter->setPen(pen);
360 pPainter->drawLine(m_QiPangStartX + i * m_QiPangDistance,
362 m_QiPangStartX + i * m_QiPangDistance,
363 m_QiPangStartY + 9 * m_QiPangDistance);
367 QPen pen(QBrush(m_QiPangColor), 1);
368 pPainter->setPen(pen);
369 pPainter->drawLine(m_QiPangStartX + i * m_QiPangDistance,
371 m_QiPangStartX + i * m_QiPangDistance,
372 m_QiPangStartY + 4 * m_QiPangDistance);
373 pPainter->drawLine(m_QiPangStartX + i * m_QiPangDistance,
374 m_QiPangStartY + 5 * m_QiPangDistance,
375 m_QiPangStartX + i * m_QiPangDistance,
376 m_QiPangStartY + 9 * m_QiPangDistance);
380 for (i = 0; i < 10; i++)
383 pen.setColor(m_QiPangColor);
384 if (i == 0 || i == 9)
393 pPainter->setPen(pen);
395 pPainter->drawLine(m_QiPangStartX,
396 m_QiPangStartY + i * m_QiPangDistance,
397 m_QiPangStartX + 8 * m_QiPangDistance,
398 m_QiPangStartY + i * m_QiPangDistance);
404 pen.setColor(m_QiPangColor);
406 pPainter->setPen(pen);
407 pPainter->drawLine(m_QiPangStartX + 3 * m_QiPangDistance,
409 m_QiPangStartX + 5 * m_QiPangDistance,
410 m_QiPangStartY + 2 * m_QiPangDistance);
412 pPainter->drawLine(m_QiPangStartX + 5 * m_QiPangDistance,
414 m_QiPangStartX + 3 * m_QiPangDistance,
415 m_QiPangStartY + 2 * m_QiPangDistance);
417 pPainter->drawLine(m_QiPangStartX + 3 * m_QiPangDistance,
418 m_QiPangStartY + 7 * m_QiPangDistance,
419 m_QiPangStartX + 5 * m_QiPangDistance,
420 m_QiPangStartY + 9 * m_QiPangDistance);
422 pPainter->drawLine(m_QiPangStartX + 5 * m_QiPangDistance,
423 m_QiPangStartY + 7 * m_QiPangDistance,
424 m_QiPangStartX + 3 * m_QiPangDistance,
425 m_QiPangStartY + 9 * m_QiPangDistance);
429 DrawXinWei(pPainter, 1, 2);
430 DrawXinWei(pPainter, 7, 2);
431 DrawXinWei(pPainter, 1, 7);
432 DrawXinWei(pPainter, 7, 7);
433 DrawXinWei(pPainter, 0, 3, Right_XinWei);
434 DrawXinWei(pPainter, 2, 3);
435 DrawXinWei(pPainter, 4, 3);
436 DrawXinWei(pPainter, 6, 3);
437 DrawXinWei(pPainter, 8, 3, Left_XinWei);
438 DrawXinWei(pPainter, 0, 6, Right_XinWei);
439 DrawXinWei(pPainter, 2, 6);
440 DrawXinWei(pPainter, 4, 6);
441 DrawXinWei(pPainter, 6, 6);
442 DrawXinWei(pPainter, 8, 6, Left_XinWei);
446 DrawPicture(pPainter, 7, 4, m_Chu,
true);
448 DrawPicture(pPainter, 6, 4, m_He,
true);
450 DrawPicture(pPainter, 1, 4, m_Han,
true);
452 DrawPicture(pPainter, 2, 4, m_Jie,
true);
454 DrawPicture(pPainter, 4, 4, m_KL,
true);
457 for (i = 0; i < 9; i++)
458 for (j = 0; j < 10; j++)
464 if (IsValidPosition(m_PreviouPositionX, m_PreviouPositionY))
465 DrawTiShiBox(pPainter, m_PreviouPositionX, m_PreviouPositionY);
466 if (IsValidPosition(m_CurrentPositionX, m_CurrentPositionY))
467 DrawTiShiBox(pPainter, m_CurrentPositionX, m_CurrentPositionY);
489void CFrmChineseChess::DrawXinWei(QPainter *pPainter,
int i,
int j, ENUM_XINWEI xinwei)
494 d = m_QiPangDistance * 4 / 10;
495 ds = m_QiPangDistance * 2 / 10;
497 ConvertCoordinate(&x, &y, &i, &j, IJToXY);
500 pen.setColor(m_QiPangColor);
502 pPainter->setPen(pen);
504 if (xinwei != Left_XinWei)
506 pPainter->drawLine(x + ds, y + ds, x + d, y + ds);
507 pPainter->drawLine(x + ds, y - ds, x + d, y - ds);
509 pPainter->drawLine(x + ds, y + ds, x + ds, y + d);
511 pPainter->drawLine(x + ds, y - ds, x + ds, y - d);
514 if (xinwei != Right_XinWei)
516 pPainter->drawLine(x - ds, y - ds, x - ds, y - d);
518 pPainter->drawLine(x - ds, y + ds, x - ds, y + d);
520 pPainter->drawLine(x - ds, y + ds, x - d, y + ds);
522 pPainter->drawLine(x - ds, y - ds, x - d, y - ds);
538bool CFrmChineseChess::DrawTiShiBox(QPainter *pPainter,
int i,
int j)
542 long m_X, m_Y, m_L = m_QiPangDistance / 2;
545 pen.setColor(m_TiShiBoxColor);
547 pPainter->setPen(pen);
549 ConvertCoordinate(&m_X, &m_Y, &i, &j, IJToXY);
550 pPainter->drawLine(m_X - m_L, m_Y - m_L, m_X - m_L, m_Y - m_L / 2);
552 pPainter->drawLine(m_X - m_L, m_Y - m_L, m_X - m_L / 2, m_Y - m_L);
554 pPainter->drawLine(m_X + m_L, m_Y + m_L, m_X + m_L, m_Y + m_L / 2);
556 pPainter->drawLine(m_X + m_L, m_Y + m_L, m_X + m_L / 2, m_Y + m_L);
558 pPainter->drawLine(m_X - m_L, m_Y + m_L, m_X - m_L, m_Y + m_L / 2);
560 pPainter->drawLine(m_X - m_L, m_Y + m_L, m_X - m_L / 2, m_Y + m_L);
562 pPainter->drawLine(m_X + m_L, m_Y - m_L, m_X + m_L, m_Y - m_L / 2);
564 pPainter->drawLine(m_X + m_L, m_Y - m_L, m_X + m_L / 2, m_Y - m_L);
582int CFrmChineseChess::DrawQiZi(QPainter *pPainter,
int i,
int j, CPiece::ENUM_QiZi eQiZi)
586#pragma warning( disable : 4806 )
636#pragma warning( default : 4806 )
639 return DrawPicture(pPainter, i, j, qz);
660int CFrmChineseChess::DrawPicture(QPainter *pPainter,
int i,
int j, QImage image,
bool CHHJKL)
664 ConvertCoordinate(&m_X, &m_Y, &i, &j, IJToXY);
667 m_X -= m_QiPangDistance / 2;
671 m_X -= m_QiPangDistance / 2;
672 m_Y -= m_QiPangDistance / 2;
675 QRect r(m_X, m_Y, m_QiPangDistance, m_QiPangDistance);
676 return DrawImage(pPainter, r, image);
686int CFrmChineseChess::DrawImage(QPainter *pPainter, QRect rect, QImage image)
688 pPainter->drawImage(rect, image);
706int CFrmChineseChess::SetTransparentImage(QImage &image,
const QColor &col)
709 QImage mask = image.createMaskFromColor(col.rgb(), Qt::MaskOutColor);
710 image.setAlphaChannel(mask);
720int CFrmChineseChess::SetTransparentPixmap(QPixmap &pixmap,
const QColor &col)
722 QBitmap bmp = pixmap.createMaskFromColor(col, Qt::MaskOutColor);
CPiece::ENUM_QiZi m_ChessBoard[9][10]
棋盘描述
bool GoChess(int i, int j, bool bNext=false)
走棋
virtual int onDrawPrompt(int i, int j) override
画提示框
virtual int onGoChess(int i, int j, CPiece::ENUM_QiZi chess) override
走棋事件
virtual int onPromptMessage(CGoRule::ENUM_ReturnValue val) override
提示错误消息
static int CleanResource()
清理资源,仅在程序结束时调用一次
virtual int onCleanPrompt(int i, int j) override
清除提示框
static int InitResource(const QString szLanguage)
初始化资源,仅在程序开始时调用一次