1#include "FrmChineseChess.h"
2#include "ui_FrmChineseChess.h"
3#include "DlgAbout/DlgAbout.h"
4#include "RabbitCommonTools.h"
10#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
11 #include <QSoundEffect>
17CFrmChineseChess::CFrmChineseChess(QWidget *parent) :
21 m_QiPangColor(0, 0, 0),
22 m_TiShiBoxColor(0, 255, 0)
26 m_QiPangStartX = m_QiPangStartY = 0;
29 m_QiPangPicture.load(
":/image/QIPANG");
30 SetTransparentImage(m_QiPangPicture);
31 m_RedShuai.load(
":/image/RSHUAI");
33 m_RedShi.load(
":/image/RSHI");
35 m_RedXiang.load(
":/image/RXIANG");
37 m_RedMa.load(
":/image/RMA");
39 m_RedChe.load(
":/image/RCHE");
41 m_RedBing.load(
":/image/RBING");
43 m_RedPao.load(
":/image/RPAO");
45 m_BlackShuai.load(
":/image/BSHUAI");
47 m_BlackShi.load(
":/image/BSHI");
49 m_BlackXiang.load(
":/image/BXIANG");
51 m_BlackMa.load(
":/image/BMA");
53 m_BlackChe.load(
":/image/BCHE");
55 m_BlackBing.load(
":/image/BZU");
57 m_BlackPao.load(
":/image/BPAO");
60 m_Chu.load(
":/image/CHU");
61 SetTransparentImage(m_Chu);
62 m_He.load(
":/image/HE");
63 SetTransparentImage(m_He);
64 m_Han.load(
":/image/HAN");
65 SetTransparentImage(m_Han);
66 m_Jie.load(
":/image/JIE");
67 SetTransparentImage(m_Jie);
68 m_KL.load(
":/image/KL");
71CFrmChineseChess::~CFrmChineseChess()
76static QSharedPointer<QTranslator> g_Translator;
79 Q_INIT_RESOURCE(ResourceChineseChess);
80#if (defined(DEBUG) || defined(_DEBUG)) && !defined (BUILD_SHARED_LIBS)
81 Q_INIT_RESOURCE(translations_ChineseChessQt);
83 g_Translator = RabbitCommon::CTools::Instance()->InstallTranslator(
85 RabbitCommon::CTools::TranslationType::Library,
95 RabbitCommon::CTools::Instance()->RemoveTranslator(g_Translator);
97#if (defined(DEBUG) || defined(_DEBUG)) && !defined (BUILD_SHARED_LIBS)
98 Q_CLEANUP_RESOURCE(translations_ChineseChessQt);
100 Q_CLEANUP_RESOURCE(ResourceChineseChess);
104void CFrmChineseChess::mouseReleaseEvent(QMouseEvent *event)
108 QPoint p =
event->pos();
111 ConvertCoordinate(&x, &y, &i, &j);
118void CFrmChineseChess::paintEvent(QPaintEvent *event)
120 QPainter painter(
this);
123 painter.setRenderHint(QPainter::SmoothPixmapTransform);
125 DrawQiPang(&painter, rect());
128void CFrmChineseChess::resizeEvent(QResizeEvent *event)
130 QSize s =
event->size();
131 SetQiPang(s.width(), s.height());
134int CFrmChineseChess::onPromptSound(PROMPT_SOUND sound)
140 szFile =
":/sound/CHECK";
143 szFile =
":/sound/EAT";
146 szFile =
":/sound/GO";
149 szFile =
":/sound/DEAD";
152 szFile =
":/sound/SELECT";
157#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
158 static QSoundEffect effect;
159 effect.setSource(QUrl::fromLocalFile(szFile));
162 if(effect.isPlaying())
166 QSound::play(szFile);
173 QMessageBox msg(
this);
177 msg.setText(tr(
"This step cannot be taken, otherwise you will lose"));
178 msg.setWindowTitle(tr(
"checked"));
181 msg.setText(tr(
"This step cannot be taken, otherwise you will lose"));
182 msg.setWindowTitle(tr(
"Opposite"));
211 emit sigGoChess(i, j, chess);
215void CFrmChineseChess::AboutBox()
217 CDlgAbout about(
this);
218 about.m_szAppName = tr(
"Chinese chess control");
219 about.m_szHomePage =
"https://github.com/KangLin/ChineseChessControl";
220 about.m_szCopyrightTime =
"1994 - " + QString::number(QDate::currentDate().year());
224QDateTime CFrmChineseChess::GetStartTime()
226 time_t t = CChineseChess::GetStartTime();
228 time.setMSecsSinceEpoch(t);
232int CFrmChineseChess::SetStartTime(
const QDateTime &t)
234 return CChineseChess::SetStartTime(t.toMSecsSinceEpoch());
237QDateTime CFrmChineseChess::GetEndTime()
240 t.setMSecsSinceEpoch(CChineseChess::GetEndTime());
244int CFrmChineseChess::SetEndTime(
const QDateTime &t)
246 return CChineseChess::SetEndTime(t.toMSecsSinceEpoch());
249QString CFrmChineseChess::GetRedName()
251 return CChineseChess::GetRedName().c_str();
254int CFrmChineseChess::SetRedName(
const QString &name)
256 return CChineseChess::SetRedName(name.toStdString().c_str());
259QString CFrmChineseChess::GetBlackName()
261 return CChineseChess::GetBlackName().c_str();
264int CFrmChineseChess::SetBlackName(
const QString &name)
266 return CChineseChess::SetBlackName(name.toStdString().c_str());
286bool CFrmChineseChess::ConvertCoordinate(
long *x,
long *y,
int *i,
int *j, ENUM_ConvertCoordinate eCC)
291 *i = (*x - m_QiPangStartX + m_QiPangDistance / 2) / m_QiPangDistance;
292 *j = (*y - m_QiPangStartY + m_QiPangDistance / 2) / m_QiPangDistance;
295 *x = m_QiPangStartX + *i * m_QiPangDistance;
296 *y = m_QiPangStartY + *j * m_QiPangDistance;
314bool CFrmChineseChess::SetQiPang(
int width,
int height)
318 m_QiPangDistance = height / 11;
319 m_QiPangStartX = (width - m_QiPangDistance * 10) / 2 + m_QiPangDistance;
320 m_QiPangStartY = m_QiPangDistance;
324 m_QiPangDistance = width / 10;
325 m_QiPangStartX = m_QiPangDistance;
326 m_QiPangStartY = (height - m_QiPangDistance * 11) / 2 + m_QiPangDistance;
343void CFrmChineseChess::DrawQiPang(QPainter *pPainter, QRect rect)
345 if(
nullptr == pPainter)
350 DrawImage(pPainter, rect, m_QiPangPicture);
353 for (i = 0; i < 9; i++)
355 if (i == 0 || i == 8)
358 pen.setColor(m_QiPangColor);
360 pPainter->setPen(pen);
361 pPainter->drawLine(m_QiPangStartX + i * m_QiPangDistance,
363 m_QiPangStartX + i * m_QiPangDistance,
364 m_QiPangStartY + 9 * m_QiPangDistance);
368 QPen pen(QBrush(m_QiPangColor), 1);
369 pPainter->setPen(pen);
370 pPainter->drawLine(m_QiPangStartX + i * m_QiPangDistance,
372 m_QiPangStartX + i * m_QiPangDistance,
373 m_QiPangStartY + 4 * m_QiPangDistance);
374 pPainter->drawLine(m_QiPangStartX + i * m_QiPangDistance,
375 m_QiPangStartY + 5 * m_QiPangDistance,
376 m_QiPangStartX + i * m_QiPangDistance,
377 m_QiPangStartY + 9 * m_QiPangDistance);
381 for (i = 0; i < 10; i++)
384 pen.setColor(m_QiPangColor);
385 if (i == 0 || i == 9)
394 pPainter->setPen(pen);
396 pPainter->drawLine(m_QiPangStartX,
397 m_QiPangStartY + i * m_QiPangDistance,
398 m_QiPangStartX + 8 * m_QiPangDistance,
399 m_QiPangStartY + i * m_QiPangDistance);
405 pen.setColor(m_QiPangColor);
407 pPainter->setPen(pen);
408 pPainter->drawLine(m_QiPangStartX + 3 * m_QiPangDistance,
410 m_QiPangStartX + 5 * m_QiPangDistance,
411 m_QiPangStartY + 2 * m_QiPangDistance);
413 pPainter->drawLine(m_QiPangStartX + 5 * m_QiPangDistance,
415 m_QiPangStartX + 3 * m_QiPangDistance,
416 m_QiPangStartY + 2 * m_QiPangDistance);
418 pPainter->drawLine(m_QiPangStartX + 3 * m_QiPangDistance,
419 m_QiPangStartY + 7 * m_QiPangDistance,
420 m_QiPangStartX + 5 * m_QiPangDistance,
421 m_QiPangStartY + 9 * m_QiPangDistance);
423 pPainter->drawLine(m_QiPangStartX + 5 * m_QiPangDistance,
424 m_QiPangStartY + 7 * m_QiPangDistance,
425 m_QiPangStartX + 3 * m_QiPangDistance,
426 m_QiPangStartY + 9 * m_QiPangDistance);
430 DrawXinWei(pPainter, 1, 2);
431 DrawXinWei(pPainter, 7, 2);
432 DrawXinWei(pPainter, 1, 7);
433 DrawXinWei(pPainter, 7, 7);
434 DrawXinWei(pPainter, 0, 3, Right_XinWei);
435 DrawXinWei(pPainter, 2, 3);
436 DrawXinWei(pPainter, 4, 3);
437 DrawXinWei(pPainter, 6, 3);
438 DrawXinWei(pPainter, 8, 3, Left_XinWei);
439 DrawXinWei(pPainter, 0, 6, Right_XinWei);
440 DrawXinWei(pPainter, 2, 6);
441 DrawXinWei(pPainter, 4, 6);
442 DrawXinWei(pPainter, 6, 6);
443 DrawXinWei(pPainter, 8, 6, Left_XinWei);
447 DrawPicture(pPainter, 7, 4, m_Chu,
true);
449 DrawPicture(pPainter, 6, 4, m_He,
true);
451 DrawPicture(pPainter, 1, 4, m_Han,
true);
453 DrawPicture(pPainter, 2, 4, m_Jie,
true);
455 DrawPicture(pPainter, 4, 4, m_KL,
true);
458 for (i = 0; i < 9; i++)
459 for (j = 0; j < 10; j++)
465 if (IsValidPosition(m_PreviouPositionX, m_PreviouPositionY))
466 DrawTiShiBox(pPainter, m_PreviouPositionX, m_PreviouPositionY);
467 if (IsValidPosition(m_CurrentPositionX, m_CurrentPositionY))
468 DrawTiShiBox(pPainter, m_CurrentPositionX, m_CurrentPositionY);
490void CFrmChineseChess::DrawXinWei(QPainter *pPainter,
int i,
int j, ENUM_XINWEI xinwei)
495 d = m_QiPangDistance * 4 / 10;
496 ds = m_QiPangDistance * 2 / 10;
498 ConvertCoordinate(&x, &y, &i, &j, IJToXY);
501 pen.setColor(m_QiPangColor);
503 pPainter->setPen(pen);
505 if (xinwei != Left_XinWei)
507 pPainter->drawLine(x + ds, y + ds, x + d, y + ds);
508 pPainter->drawLine(x + ds, y - ds, x + d, y - ds);
510 pPainter->drawLine(x + ds, y + ds, x + ds, y + d);
512 pPainter->drawLine(x + ds, y - ds, x + ds, y - d);
515 if (xinwei != Right_XinWei)
517 pPainter->drawLine(x - ds, y - ds, x - ds, y - d);
519 pPainter->drawLine(x - ds, y + ds, x - ds, y + d);
521 pPainter->drawLine(x - ds, y + ds, x - d, y + ds);
523 pPainter->drawLine(x - ds, y - ds, x - d, y - ds);
539bool CFrmChineseChess::DrawTiShiBox(QPainter *pPainter,
int i,
int j)
543 long m_X, m_Y, m_L = m_QiPangDistance / 2;
546 pen.setColor(m_TiShiBoxColor);
548 pPainter->setPen(pen);
550 ConvertCoordinate(&m_X, &m_Y, &i, &j, IJToXY);
551 pPainter->drawLine(m_X - m_L, m_Y - m_L, m_X - m_L, m_Y - m_L / 2);
553 pPainter->drawLine(m_X - m_L, m_Y - m_L, m_X - m_L / 2, m_Y - m_L);
555 pPainter->drawLine(m_X + m_L, m_Y + m_L, m_X + m_L, m_Y + m_L / 2);
557 pPainter->drawLine(m_X + m_L, m_Y + m_L, m_X + m_L / 2, m_Y + m_L);
559 pPainter->drawLine(m_X - m_L, m_Y + m_L, m_X - m_L, m_Y + m_L / 2);
561 pPainter->drawLine(m_X - m_L, m_Y + m_L, m_X - m_L / 2, m_Y + m_L);
563 pPainter->drawLine(m_X + m_L, m_Y - m_L, m_X + m_L, m_Y - m_L / 2);
565 pPainter->drawLine(m_X + m_L, m_Y - m_L, m_X + m_L / 2, m_Y - m_L);
583int CFrmChineseChess::DrawQiZi(QPainter *pPainter,
int i,
int j,
CPiece::ENUM_QiZi eQiZi)
587#pragma warning( disable : 4806 )
637#pragma warning( default : 4806 )
640 return DrawPicture(pPainter, i, j, qz);
661int CFrmChineseChess::DrawPicture(QPainter *pPainter,
int i,
int j, QImage image,
bool CHHJKL)
665 ConvertCoordinate(&m_X, &m_Y, &i, &j, IJToXY);
668 m_X -= m_QiPangDistance / 2;
672 m_X -= m_QiPangDistance / 2;
673 m_Y -= m_QiPangDistance / 2;
676 QRect r(m_X, m_Y, m_QiPangDistance, m_QiPangDistance);
677 return DrawImage(pPainter, r, image);
687int CFrmChineseChess::DrawImage(QPainter *pPainter, QRect rect, QImage image)
689 pPainter->drawImage(rect, image);
707int CFrmChineseChess::SetTransparentImage(QImage &image,
const QColor &col)
710 QImage mask = image.createMaskFromColor(col.rgb(), Qt::MaskOutColor);
711 image.setAlphaChannel(mask);
721int CFrmChineseChess::SetTransparentPixmap(QPixmap &pixmap,
const QColor &col)
723 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)
初始化资源,仅在程序开始时调用一次
enum CPiece::_ENUM_QiZi ENUM_QiZi
棋子枚举值 四个位表示棋子,最左1位表示颜色