一、图片及棋盘分析

1:在上文中已经对单张图片的显示进行了测试,从中可以知道一张图片需要一个QPixmap对象对其进行加载。棋盘图片共有23张,也就需要23个QPixmap的对象。同时要求对象名与图片名一致,避免对象过多造成混乱。图片的命名是根据该图片在整个棋盘中的位置对其进行命名。例如下图是棋盘的左下角,故此命名为“leftDown”;其中又有一些特殊位置,比如炮,兵的位置,该位置存在特殊标记,故其图片命名为“SIGN”

2:棋盘由十条横线和九条竖线组成(中间的竖线是不相连的,但在同一直线上,上下看作一条线),共九十个交点,使用一个十行九列的int类型数组chessmap[10][9]与之对应。因为10,9就是常量,直接新建一个.h文件,在里面使用define定义即可(后面使用的常量也在此定义)。要使用这些常量,直接包含头文件就可使用。
3:数组chessmap是int类型,棋盘图片共有23张,分别表示棋盘上的不同位置。就用0-22在chessmap中来表示这些图片。例如chessmap[i][j]=0;那(i,j)位置上就放置0所代表的图片。0-22这些常量使用枚举的方式定义。

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  兵卒边缘标记
};

4:先定义23个QPixmap类型的变量来表示图片(在mywidget.h中定义),下面就需要考虑如何将23张图片与这些常量关联起来。图片是QPixmap类型,常量是int型。使用关联容器QHash<int ,QPixmap>来将图片和常量关联起来,形成一一影射。
QPixmap变量

    //mapQPixmap sign;//炮兵标记QPixmap lSign;//左兵/卒标记QPixmap rSign;// 右兵/卒标记QPixmap upRiverBank;//上河岸QPixmap downRiverBank;//下河岸QPixmap upEdge;//上边缘QPixmap downEdge;//下边缘QPixmap leftEdge;//左边缘QPixmap rightEdge;//右边缘QPixmap cross;//十字格QPixmap mi;//米字格QPixmap leftUp;//左上角QPixmap rightUp;//右上角QPixmap leftDown;//左下角QPixmap rightDown;//右下角QPixmap upjglu;//上九宫左上QPixmap upjgru;//上九宫右上QPixmap upjgld;//上九宫左下QPixmap upjgrd;//上九宫右下QPixmap downjglu;//下九宫左上QPixmap downjgru;//下九宫右上QPixmap downjgld;//下九宫左下QPixmap downjgrd;//下九宫右下

棋盘图片值映射对组在mywidget.h中定义,再定义一个对应的函数,在其中完成键值一一对应的操作

QHash<int, QPixmap> chessboardPairs;
void valueMappingPic();//键映射图片

valueMappingPic函数(注:这里键值的映射不可出错)

//键映射图片
void myWidget::valueMappingPic()
{//棋盘值映射图片chessboardPairs.insert(in,cross);chessboardPairs.insert(up,upEdge);chessboardPairs.insert(down,downEdge);chessboardPairs.insert(mleft,leftEdge);chessboardPairs.insert(mright,rightEdge);chessboardPairs.insert(up_left,leftUp);chessboardPairs.insert(up_right,rightUp);chessboardPairs.insert(down_left,leftDown);chessboardPairs.insert(down_right,rightDown);chessboardPairs.insert(mark,sign);chessboardPairs.insert(sign_left,lSign);chessboardPairs.insert(sign_right,rSign);chessboardPairs.insert(inu,upRiverBank);chessboardPairs.insert(ind,downRiverBank);chessboardPairs.insert(s,mi);chessboardPairs.insert(sdru,downjgru);chessboardPairs.insert(sdlu,downjglu);chessboardPairs.insert(sdld,downjgld);chessboardPairs.insert(sdrd,downjgrd);chessboardPairs.insert(surd,upjgrd);chessboardPairs.insert(suld,upjgld);chessboardPairs.insert(suru,upjgru);chessboardPairs.insert(sulu,upjglu);
}

二、棋盘的实现

1:棋盘的实现要先对图片进行加载,定义一个函数来完成棋盘图片加载工作。

void pictureload();//图片加载//图片加载
void myWidget::pictureload()
{//棋盘图片加载sign.load("map/SIGN.gif");//炮、兵、卒标记lSign.load("map/LEFTSIGN.gif");//左兵、卒标记rSign.load("map/RightSIGN.gif");//右兵、卒标记upRiverBank.load("map/upRiverBank.gif");//上河岸downRiverBank.load("map/downRiverBank.gif");//下河岸upEdge.load("map/upEdge.gif");//上边缘downEdge.load("map/downEdge.gif");//下边缘leftEdge.load("map/leftEdge.gif");//左边缘rightEdge.load("map/rightEdge.gif");//右边缘cross.load("map/Sizige.gif");//十字格mi.load("map/X.gif");//米字格leftUp.load("map/leftUp.gif");//左上角rightUp.load("map/rightUp.gif");//右上角leftDown.load("map/leftDown.gif");//左下角rightDown.load("map/rightDown.gif");//右下角upjglu.load("map/X_up_leftUp.gif");//上九宫左上upjgru.load("map/X_up_rightUp.gif");//上九宫右上upjgld.load("map/X_up_leftDown.gif");//上九宫左下upjgrd.load("map/X_up_rightDown.gif");//上九宫右下downjglu.load("map/X_down_leftUp.gif");//下九宫左上downjgru.load("map/X_down_rightUp.gif");//下九宫右上downjgld.load("map/X_down_leftDown.gif");//下九宫左下downjgrd.load("map/X_down_rightDown.gif");//下九宫右下}

2:下面就可以为chessmap数组进行赋值

myWidget::mapInit()void myWidget::mapInit()
{//棋盘棋子数组值初始恢复(全为0)for(int j=0;j<col;j++){for(int i=0;i<row;i++)chessmap[i][j]=0;//十字格(下面chessmap赋值完成后,剩余的地方全是十字格图片)}//四角chessmap[0][0]=up_left;chessmap[0][8]=up_right;chessmap[9][0]=down_left;chessmap[9][8]=down_right;for(int i=1;i<col-1;i++){chessmap[0][i]=up;//上边缘chessmap[9][i]=down;//下边缘chessmap[4][i]=inu;//上河岸chessmap[5][i]=ind;//下河岸}for(int i=1;i<row-1;i++){chessmap[i][0]=mleft;//左边缘chessmap[i][8]=mright;//右边缘}//中间兵卒标记点for(int i=2;i<col-1;i=i+2){chessmap[3][i]=mark;chessmap[6][i]=mark;}//边缘兵卒标记点chessmap[3][0]=sign_left;chessmap[6][0]=sign_left;//左标记chessmap[3][8]=sign_right;chessmap[6][8]=sign_right;//右标记//炮标记点chessmap[2][1]=mark;chessmap[2][7]=mark;chessmap[7][1]=mark;chessmap[7][7]=mark;//九宫格chessmap[7][3] = sdlu;//下方士活动区左上chessmap[0][3] = sulu;//上方士活动区左上chessmap[0][5] = suru;//下方士活动区右上chessmap[7][5] = sdru;//上方士活动区左上chessmap[1][4] = chessmap[8][4] = s;//米字格chessmap[2][3] = suld;//上方士活动区左下chessmap[9][3] = sdld;//下方士活动区左下chessmap[2][5] = surd;//上方士活动区右下chessmap[9][5] = sdrd;//下方士活动区右下
}

3:现在棋盘绘制的准备工作全部完成啦,接下来进行实现。要完成图片绘制,图片的加载和常量与图片的键值对的映射是要首先完成的,因此将pictureload函数与valueMappingPic函数放在myWidge的构造函数中。

myWidget::myWidget(QWidget *parent) : QWidget(parent)
{pictureload();//棋盘棋子图片加载valueMappingPic();//值映射图片的映射
}

4:接下来就是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);//画棋盘
}

运行效果图

到这里我们的棋盘绘制就完成了,若有不清楚的地方欢迎各位留言谈论。

Qt实现中国象棋
(四)棋子绘制的实现

Qt实现中国象棋:(三)棋盘绘制的详细分析及实现相关推荐

  1. Qt实现中国象棋:(四)棋子绘制的实现

    一.棋子图片的简要介绍 上图就是所要使用到的棋子图片,以"r"开头命名的均为红棋,以"b"开头命名的是黑棋:其中带有红色边框的棋子表示将要被移动的棋子(被选中的 ...

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

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

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

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

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

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

  5. 使用QT简单制作中国象棋之棋盘

    最近在网上看了一些QT的教学视频,就想着将学习的知识运用一下,学到绘图后就想着制作一个简易的中国象棋.目前只做出了棋盘,大概有点样子了. 本例使用的QWidget作为父类创建的加了UI的项目,但目前U ...

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

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

  7. Qt版本中国象棋开发(二)

    实现功能:棋盘绘制 核心函数: void paintEvent(QPaintEvent *); //QWidget自带的虚函数,重写后使用 QPainter 类来绘制图形 QPainter paint ...

  8. 手把手教学!利用C++制作中国象棋,界面MFC内含详细源码!

    VC++中国象棋源码附毕业设计文档资料,源程序编译于VC++6.0或者VS2003版本,二者任选其一都可以,项目文件完整. 总项目展示: 制作过程截图: 代码展示: 效果展示: 这是我要和大家分享的基 ...

  9. qt pcl设置镜头初始位置_Qt中国象棋二——棋盘与棋子的绘制

    上次和大家分享了Qt的2D绘图基础知识,这样可以更好地理解象棋中一些关于绘图的程序.这次要和大家分享的则是棋盘与棋子的绘制,也可以说是Qt 2D绘图的一些具体应用. 源程序是我在网上找的,而且是下载了 ...

最新文章

  1. 博为峰Java技术文章 ——JavaSE Swing FlowLayout布局管理器I
  2. iphone开发基础:loadView/viewDidLoad/initWithNibName/awakeFromNib/initWithCoder的用法
  3. 块状元素、内联元素和内联块状元素
  4. [IDEA中SSM整合,前端页面jsp] tomcat一开始访问jsp页面就报404错误
  5. uvm 形式验证_uvm面试题
  6. 负载均衡SLB新功能介绍
  7. 【NLP基础】手把手带你fastText文本分类(附代码)
  8. 用windows2008服务器安装sccm2012 (安装sccm2012)
  9. 容器技术Docker K8s 2 云原生容器技术概述
  10. 光机电一体化实训考核装置
  11. Oracle EBS Workflow简介和客制之后的感想
  12. 牛客多校9 B. Two Frogs (概率dp+前缀和优化)
  13. 感谢所有的幸运与不幸 --- 致我的2016
  14. RPL(7):RFC6550翻译(7)---Upward Routes
  15. 《富爸爸,穷爸爸》书摘一
  16. 蚂蚁区块链-CONFIDE-ACM SIGMOD 20
  17. 【考研数学】概率论 - 随机事件和概率
  18. ajax传递数组到后台时为空,ajax传递数组,后台接收为null解决方法
  19. scala groupby用法
  20. 为什么自学Python学着学着就放弃了?

热门文章

  1. Hybrid APP混合模式应用开发的经验和总结
  2. 自增主键用完了怎么办?
  3. 【软件安装故障排除】安装完PyCharm,启动时弹出“Failed to load JVM DLL\bin\server\jvm.dll“解决方案
  4. 我的上半年“手相”-----“奔跑中的2015”
  5. Python 爬虫入门(二)—— IP代理使用 - 不剃头的一休哥 - 博客园
  6. 计算机c盘用户爆满,电脑c盘突然爆满是为什么!?
  7. js/Jquery通过MutationObserver实现监听dom元素的属性变化 用div简单实例
  8. 立足中国,聚焦欧洲,蔚来汽车的如意算盘真会打?
  9. 第三篇:动态 8位数码管显示---亚龙236电路
  10. js的重点3:轮播图(实现多个图无缝连接播放)、使用Swiper轮播图效果