一、棋子图片的简要介绍

上图就是所要使用到的棋子图片,以“r”开头命名的均为红棋,以“b”开头命名的是黑棋;其中带有红色边框的棋子表示将要被移动的棋子(被选中的效果图片)。同样将这些棋子图片放入之前运行后生成的文件夹之中。

二、棋子绘制实现
1:有了之前棋盘绘制的经验,棋子的绘制就简单多啦。首先定义QPixmap变量

    //qizi//(红棋)QPixmap rBing;QPixmap rPao;QPixmap rJu;QPixmap rMa;QPixmap rXiang;QPixmap rShi;QPixmap rShuai;//qiziEffect(红棋点击效果图)QPixmap rBing2;QPixmap rPao2;QPixmap rJu2;QPixmap rMa2;QPixmap rXiang2;QPixmap rShi2;QPixmap rShuai2;//qizi(黑棋)QPixmap bZu;QPixmap bPao;QPixmap bJu;QPixmap bMa;QPixmap bXiang;QPixmap bShi;QPixmap bJiang;//qiziEffect(黑棋点击效果图)QPixmap bZu2;QPixmap bPao2;QPixmap bJu2;QPixmap bMa2;QPixmap bXiang2;QPixmap bShi2;QPixmap bJiang2;

2:使用数字来在chessmap数组中表示这些棋子,在之前枚举后面接上所要代表棋子的值即可。

enum
{in, up, down, mleft, mright, mark,//0地图中心块  1上、2下、3左、4右、5炮标记up_right, up_left, down_right, down_left,//6右上角、7左上角、8右下角、9左下角s, suru, sulu, sdru, sdlu, inu, ind,//10士活动区、11上右、12上左、13下右、14下左、15上河岸、16下河岸surd, suld, sdrd, sdld,//士活动区外墙特殊17、18、19、20sign_right, sign_left,//21、22  边缘标记bing = 31, Rpao, Rju, Rma, Rxiang, Rshi, Rshuai,//红棋zhu = 41, Bpao, Bju, Bma, Bxiang, Bshi, Bjiang,//黑棋bing2 = 51, Rpao2, Rju2, Rma2, Rxiang2, Rshi2, Rshuai2,//红棋效果图zhu2 = 61, Bpao2, Bju2, Bma2, Bxiang2, Bshi2, Bjiang2,//黑棋效果图
};

3:值与棋子图片的映射,先定义一个棋子值图片映射对组QHash<int, QPixmap> chessmanPairs;再在void myWidget::valueMappingPic()函数中写入以下代码。

 //棋子值映射图片chessmanPairs.insert(bing,rBing);chessmanPairs.insert(Rpao,rPao);chessmanPairs.insert(Rju,rJu);chessmanPairs.insert(Rma,rMa);chessmanPairs.insert(Rxiang,rXiang);chessmanPairs.insert(Rshi,rShi);chessmanPairs.insert(Rshuai,rShuai);chessmanPairs.insert(zhu,bZu);chessmanPairs.insert(Bpao,bPao);chessmanPairs.insert(Bju,bJu);chessmanPairs.insert(Bma,bMa);chessmanPairs.insert(Bxiang,bXiang);chessmanPairs.insert(Bshi,bShi);chessmanPairs.insert(Bjiang,bJiang);chessmanPairs.insert(bing2,rBing2);chessmanPairs.insert(Rpao2,rPao2);chessmanPairs.insert(Rju2,rJu2);chessmanPairs.insert(Rma2,rMa2);chessmanPairs.insert(Rxiang2,rXiang2);chessmanPairs.insert(Rshi2,rShi2);chessmanPairs.insert(Rshuai2,rShuai2);chessmanPairs.insert(zhu2,bZu2);chessmanPairs.insert(Bpao2,bPao2);chessmanPairs.insert(Bju2,bJu2);chessmanPairs.insert(Bma2,bMa2);chessmanPairs.insert(Bxiang2,bXiang2);chessmanPairs.insert(Bshi2,bShi2);chessmanPairs.insert(Bjiang2,bJiang2);

4:棋子图片的加载,在之前定义的void myWidget::pictureload()函数中加入棋子图片加载代码即可。

//棋子图片加载rBing.load("qi/rBing.gif");rPao.load("qi/rPao.gif");rJu.load("qi/rJu.gif");rMa.load("qi/rMa.gif");rXiang.load("qi/rXiang.gif");rShi.load("qi/rShi.gif");rShuai.load("qi/rShuai.gif");rBing2.load("qi/rBing2.gif");rPao2.load("qi/rPao2.gif");rJu2.load("qi/rJu2.gif");rMa2.load("qi/rMa2.gif");rXiang2.load("qi/rXiang2.gif");rShi2.load("qi/rShi2.gif");rShuai2.load("qi/rShuai2.gif");bZu.load("qi/bZu.gif");bPao.load("qi/bPao.gif");bJu.load("qi/bJu.gif");bMa.load("qi/bMa.gif");bXiang.load("qi/bXiang.gif");bShi.load("qi/bShi.gif");bJiang.load("qi/bJiang.gif");bZu2.load("qi/bZu2.gif");bPao2.load("qi/bPao2.gif");bJu2.load("qi/bJu2.gif");bMa2.load("qi/bMa2.gif");bXiang2.load("qi/bXiang2.gif");bShi2.load("qi/bShi2.gif");bJiang2.load("qi/bJiang2.gif");

5:准备开局时棋子在chessmap中的赋值(注:下面的ChessPiecesInit()函数必须在图片初始函数之后使用,因为是要先呈现棋盘图片,再呈现棋子图片。不然棋子图片会被棋盘图片所覆盖)

void ChessPiecesInit();//棋子图片标记
void myWidget::ChessPiecesInit()
{//炮兵标记格chessmap[3][2] = chessmap[3][4] = chessmap[3][6] = zhu;chessmap[3][0] = chessmap[3][8] = zhu;chessmap[2][7] = chessmap[2][1] = Bpao;chessmap[6][2] = chessmap[6][4] = chessmap[6][6] = bing;chessmap[6][0] = chessmap[6][8] = bing;chessmap[7][7] = chessmap[7][1] = Rpao;//其它棋子chessmap[0][0] = chessmap[0][8] = Bju; chessmap[0][1] = chessmap[0][7] = Bma; chessmap[0][2] = chessmap[0][6] = Bxiang; chessmap[0][3] = chessmap[0][5] = Bshi; chessmap[0][4] = Bjiang;chessmap[9][0] = chessmap[9][8] = Rju; chessmap[9][1] = chessmap[9][7] = Rma; chessmap[9][2] = chessmap[9][6] = Rxiang; chessmap[9][3] = chessmap[9][5] = Rshi; chessmap[9][4] = Rshuai;
}

6:棋子绘制函数

//绘制棋子
void myWidget::drawChessPieces(QPainter &painter, int w, int h)
{for(int i=0;i<row;i++){for(int j=0;j<col;j++){painter.drawPixmap(j*w,i*h,w,h,chessmanPairs[chessmap[i][j]]);}}
}

7:最终paintEvent中的操作

void myWidget::paintEvent(QPaintEvent *event)
{mapInit();//棋盘值QPainter painter(this);int h=this->height()/row;//单张图片的高度(对应y轴)int w=this->width()/col;//单张图片的宽度(对应x轴)drawChessboard(painter,w,h);//绘制棋盘ChessPiecesInit();//棋子初始化drawChessPieces(painter,w,h);//绘制棋子
}

8:在这里我们的棋子已经绘制完成。来看一下运行后效果展示

当前项目链接:https://pan.baidu.com/s/1sRitrw5b0hbA6UVZ35g5Qg
提取码:11tr

Qt实现中国象棋
(五)棋子移动测试

Qt实现中国象棋:(四)棋子绘制的实现相关推荐

  1. Qt实现中国象棋:(三)棋盘绘制的详细分析及实现

    一.图片及棋盘分析 1:在上文中已经对单张图片的显示进行了测试,从中可以知道一张图片需要一个QPixmap对象对其进行加载.棋盘图片共有23张,也就需要23个QPixmap的对象.同时要求对象名与图片 ...

  2. Qt实现中国象棋:(六)棋子移动规则

    一.移动规则的制定 关于中国象棋游戏棋子移动规则有马走日,象走田等说法,下面就将各类棋子的移动规则进行说明及实现(开局时默认红棋在下方,黑棋在上方).棋子移动规则中fromX.fromY为起始点坐标, ...

  3. Qt实现中国象棋:(七)悔棋

    一.下棋步骤的保存 在设置保存下棋步骤之前,先定义一个bool类型的变量player用于判定是哪一方下子,设定player=true时是红方下棋,player=false时是黑方下棋. 1:要想保存下 ...

  4. Qt中国象棋四——显示棋子可移动位置/项目完成

    点击上方蓝字可关注公众号,方便下次阅读~ 先看段视频! 经过上次的介绍,剩下的只是一些逻辑的调整.距离基本版的完成已经比较接近了. 在介绍显示棋子可移动区域前,先介绍下棋子  的可移动位置算法. 1. ...

  5. Qt中国象棋之棋子的实现

    一.添加棋子类 添加新文件 -> C++ -> C++ Class,类名ChessPieces 棋子头文件chesspieces.h #ifndef CHESSPIECES_H #defi ...

  6. Qt中国象棋之棋子的移动

    通过鼠标事件实现棋子移动(还没实现每个棋子的移动规则,所以可以随便移动,随便吃棋子,只要轮到走棋的话) 1.判断鼠标左键点击的位置是否为棋盘合法位置 2.只有在棋盘的行.列交叉点为中心的圆圈(刚好是处 ...

  7. 使用QT简单制作中国象棋之棋子的摆放

    1 引子   要制作象棋,棋子是必不可少的,但是在网上找了很久,没有找到满意且配套的棋子,有的还需要VIP下载就很难受.于是自己通过QT的标签写字功能调整大小,然后使用绘图事件(QPaintEvent ...

  8. 使用Qt开发中国象棋(一):概述

    最近看了一些关于中国象棋的实现书籍,里面讲述了如何开发一个完整的中国象棋游戏,看了里面的内容,感觉里面的内容特别巧妙的,比如书中提到了用位棋盘来表示中国象棋的棋盘以及一些精妙的走棋算法.基于这些,自己 ...

  9. 使用Qt开发中国象棋(三):走棋着法列表

    在一个完整的中国象棋游戏中,一般界面上都显示了中文着法,为了简单起见,我开发的这个用了两个着法列表,红方一个,黑方一个,其实用一个就够了,只是感觉那样稍微会麻烦些.着法列表显示了每一步的走棋.下图是着 ...

最新文章

  1. django之ORM介绍与基本用法(一)
  2. Appleman and Tree CodeForces - 461B(树形dp)
  3. python:动态参数*args
  4. boost采取什么驱动电路_当我们只是采取积极的意愿时会发生什么?
  5. 《Python程序设计开发宝典》第一波转发积攒活动中奖名单
  6. Linux 中文文件名乱码解决 FTP文件名乱码
  7. 杭电OJ 1048(C++)
  8. 视频会议系统架构和开源解决系统
  9. wordpress网站地图自动生成
  10. GD32F3x0 官方PWM驱动正频宽偏小(定时不准)的问题
  11. fullscan mysql_[InnoDB系列] -- 实测ibbackup vs mysqldump
  12. Android 基于Zxing二维码扫描的光速实现
  13. vr游戏模型测试软件,Steam VR性能测试工具介绍
  14. (自用)java博客作业3 Java抽象类
  15. cento网络故障:Job for network.service failed because the control process exited with error code. See sy
  16. STM32HAL库微秒延时(μs)
  17. git push origin master报错的解决方法 常见git命令(待更新)
  18. 绝路之后,人人网还有三条去路
  19. 文献下载神器:文献党下载器使用方法
  20. 「leetcode」332.重新安排行程【回溯算法/深搜】详细图解!

热门文章

  1. 【推荐】推荐系统 Embedding 技术实践总结
  2. 一文看懂数据治理,谈谈数字化转型中数据治理的实践经验
  3. 某个对象程序库 stdole32.tlb丢失或损坏。请运行安装程序
  4. ai自由变换工具使用介绍:配合Ctrl、Shift、Alt键使用自由变换工具
  5. labelimg使用简介
  6. 用python做频数分析_Python统计如何进行DNA序列整理
  7. java 序列化 例子_一个简单的Java序列化的例子
  8. Unity3D 数据转换 本地数据存储、Excel表格数据读取与多语言本地化
  9. python怎么去掉换行符_如何在Python中删除尾部换行符?
  10. 微信小程序常见FAQ (17.8.21-17.8.27)