

Qt中国象棋二——棋盘与棋子的绘制
source link: http://mp.weixin.qq.com/s?__biz=MzUxMTk4MzY3MA%3D%3D&%3Bmid=2247484083&%3Bidx=1&%3Bsn=93deedff5a81fffc972de7951d46c864
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

上次和大家分享了Qt的 2D 绘图基础知识,这样可以更好地理解象棋中一些关于绘图的程序。这次要和大家分享的则是棋盘与棋子的绘制,也可以说是 Qt 2D 绘图的一些具体应用。
源程序是我在网上找的,而且是下载了好几个,之后会把这些程序融合下。
一、 绘制棋盘
主窗体是继承MainWidget的,将棋盘设置为背景图片,到这棋盘就绘制好了。惊喜吧~
绘制程序也很少:
//窗口以棋盘图片为大小
QPixmap pixChessBoard(":/image/Resources/image/chessBoard.png");
setFixedSize(pixChessBoard.size());
QPalette palette(this->palette());
palette.setBrush( QPalette::Window,QBrush(pixChessBoard));
this->setPalette(palette);
之后说明下程序中用到的几个宏定义:
#define RECT_WIDTH 55
#define RECT_HEIGHT 56
#define START_X (35 - RECT_WIDTH/2)
#define START_Y (45 - RECT_HEIGHT/2)
① RECT_WIDTH 棋盘图片方格的像素宽度,对应下图中 1 到 2 的像素距离
② RECT_HEIGHT 棋盘图片方格的像素高度,对应下图中 2 到 3 的像素距离
③ 35,45 是棋盘左上角像素坐标,即与 1 对应
④ START_X , START_Y 计算棋子位置的起点像素坐标,如图 4 的像素坐标
二、 绘制棋子
1. 棋子属性类 (Item) 的定义
棋子属性类中主要包括棋子类型,如車、马、相、士、炮、兵、将
棋子颜色 ,红色、黑色
棋子位置 ,QPoint 等
Item::Item(ITEM_TYPE t,ITEM_COLOR c,QPoint pt)
{
m_type = t;
m_color = c;
m_pt = pt;
m_bShow = true;
}
2. 初始化黑色棋子的逻辑属性
主要是初始化棋子的类型与逻辑位置。
void MainWindow::initItems()
{
m_items.clear();
//初始化所有黑方棋子
Item item1(ITEM_JU,COLOR_BLACK,QPoint(0,0));
Item item2(ITEM_MA,COLOR_BLACK,QPoint(1,0));
Item item3(ITEM_XIANG,COLOR_BLACK,QPoint(2,0));
Item item4(ITEM_SHI,COLOR_BLACK,QPoint(3,0));
Item item5(ITEM_SHUAI,COLOR_BLACK,QPoint(4,0));
Item item6(ITEM_SHI,COLOR_BLACK,QPoint(5,0));
Item item7(ITEM_XIANG,COLOR_BLACK,QPoint(6,0));
Item item8(ITEM_MA,COLOR_BLACK,QPoint(7,0));
Item item9(ITEM_JU,COLOR_BLACK,QPoint(8,0));
Item item10(ITEM_PAO,COLOR_BLACK,QPoint(1,2));
Item item11(ITEM_PAO,COLOR_BLACK,QPoint(7,2));
Item item12(ITEM_BING,COLOR_BLACK,QPoint(0,3));
Item item13(ITEM_BING,COLOR_BLACK,QPoint(2,3));
Item item14(ITEM_BING,COLOR_BLACK,QPoint(4,3));
Item item15(ITEM_BING,COLOR_BLACK,QPoint(6,3));
Item item16(ITEM_BING,COLOR_BLACK,QPoint(8,3));
m_items.push_back(item1);
m_items.push_back(item2);
m_items.push_back(item3);
m_items.push_back(item4);
m_items.push_back(item5);
m_items.push_back(item6);
m_items.push_back(item7);
m_items.push_back(item8);
m_items.push_back(item9);
m_items.push_back(item10);
m_items.push_back(item11);
m_items.push_back(item12);
m_items.push_back(item13);
m_items.push_back(item14);
m_items.push_back(item15);
m_items.push_back(item16);
}
3. 绘制棋子
①从图片中切割棋子
资源文件中棋子是这样的,通过 drawPixmap(rcTarget, m_itemImage ,rcSrc) 函数将图片中指定的像素区域切割出来,然后绘制到棋盘上的目标区域,最后就看到棋盘上有棋子的效果了。
这里所有绘制的动作都是在 void paintEvent ( QPaintEvent *) 绘图事件中完成的。
void MainWindow::paintEvent(QPaintEvent *)
{
QPainter painter(this);
for (int i = 0; i<m_items.size(); i++)
{
drawItem(painter,m_items[i]);
}
# if 0 //方便理解棋盘中宏定义的位置
painter.setPen(QPen(Qt::blue,5));
painter.drawPoint(35,45);
painter.drawPoint(90,45);
painter.drawPoint(90,101);
painter.drawPoint(START_X,START_Y);
#endif
// update();
}
② 绘制棋子
OK,接下来看下drawItem()
painter 是事件中传入的,
i tem 是类中定义所有棋子属性的容器, QVector < Item > m_items ;
void MainWindow::drawItem(QPainter &painter, Item item)
{
if (!item.m_bShow)
{
return;
}
//根据顺序切割棋子图片像素位置
QRect rcSrc(m_nItemWidth*item.m_color,m_nItemHeight*item.m_type,
m_nItemWidth,m_nItemHeight);
//将对应棋子的逻辑位置映射为棋盘上的像素位置
QRect rcTarget( START_X + item.m_pt.x()*RECT_WIDTH,
START_Y + item.m_pt.y()*RECT_HEIGHT,
RECT_WIDTH,RECT_HEIGHT);
//在棋盘上绘制m_itemImage中对应的像素棋子
painter.drawPixmap(rcTarget,m_itemImage,rcSrc);
}
最终就是下面这样:
下次和大家分享的则是对棋子的操作,主要通过鼠标事件来完成,这次的则是通过绘图事件来完成的。通过本次的练习结合上次所说的,大家会对Qt的绘图事件有一个整体的概念了。Qt是基于事件驱动的,以后对这句话的理解会越来越深刻的。
对了,如果觉得有帮助,欢迎关注:
Recommend
-
74
阿里腾讯的棋子,思聪吃翔的筹码:共享项目是年度最大谎言?(附2017年死亡全名单)36氪的朋友们·2017-12-13 23:00截至目前,共有19家投身共享经济的企业宣告倒...
-
56
途游中国象棋 - 游中国象棋,支持互联网对弈,自建房间等 - NEXT
-
69
icyChessZero 中国象棋alpha zero 这个项目受到alpha go zero的启发,旨在训练一个中等人类水平或高于中等人类水平的深度神经网络,来完成下中国象棋的任务。目前这个项目仍在积极开发中,并且仍然没有完成全部的开发,欢迎pul...
-
68
文 | 财经无忌 图 | 视觉中国 如此生活三十年直到大厦崩塌——万能青年旅店,《杀死那个石家庄人》 这一次...
-
47
点击上方蓝字可关注公众号,方便下次阅读~ 先看段视频! 经过上次的介绍,剩下的只是一些逻辑的调整。距离基本版的完成已经比较接近了。 在介绍显示棋子可移动区域前,先介绍下棋子 的可移动位置算法。
-
10
象棋也有物理「外挂」,摸摸棋子就看穿局势,堪比阿尔法狗!-极果 象棋也有物理「外挂」,摸摸棋子就看穿局势,堪比阿尔法...
-
12
棋子正在等待棋盘:AirTag深度解析白熊观察员11小时前可能是全网首份苹果AirTag深度报告编者按:本文来自
-
12
中国象棋中,开局阶段本方“炮”可直接吃掉对方“马”是不是一个BUG?1,8814,340,167
-
5
商汤推出专业AI下棋机器人“元萝卜SenseRobot”,已得到中国象棋协会认证2022/08/09 17:55|作者
-
2
五年前,AlphaGo击败世界围棋冠军柯洁和李世石,在当时引起了不小的轰动。五年后,商汤将AlphaGo未尽的“围棋改变世界”梦想寄托在了中国象棋AI机器人“元萝卜”身上。 机械臂与算法融合,“人机大战”一触即发 卡斯帕罗夫在25年前被IBM超级计...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK