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

您所在的位置:网站首页 象棋的方位 Qt实现中国象棋:(三)棋盘绘制的详细分析及实现

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

2024-07-12 04:20| 来源: 网络整理| 查看: 265

一、图片及棋盘分析

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、20 sign_right, sign_left,//21、22 兵卒边缘标记 };

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

//map QPixmap 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 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


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3