QT5
CSDN下载链接:https://download.csdn.net/download/qq_35479392/10508443
百度云链接:https://pan.baidu.com/s/1pDL3p-BWcrE1uHnlk9-pJw 密码:7gyk
一 象棋棋子 如何走棋呢?
鼠标点击时有效 void
mousePressEvent
(QMouseEvent *)
鼠标点击释放 ... void
mouseReleaseEvent
(QMouseEvent *)
bool
Board::
getRowCol(
QPoint
pt,
int
&
row,
int
&
col)//pt鼠标点击的位置 输出棋盘行与列
{
for(
row
=
0;
row
<=
9;
row++)
{
for(
col
=
0;
col
<=
8;
col++)
{
QPoint
c
=
center(
row,
col);
int
dx
=
c.
x()
-
pt.
x();
int
dy
=
c.
y()
-
pt.
y();
int
dist
=
dx
*
dx
+
dy
*
dy;
if(
dist
<
(
_r
*
_r))
return
true;
}
}
return
false;
}
选择 鼠标第一次点击到棋子上是棋子选择 此时 _selectid = -1 clickid = i
移动 已经选择好了棋子 再次点击格点将要移动 此时 selectid = clickid
吃掉 已经选择好了棋子 再次点击格点,其上有棋子则吃掉 无棋子则移动
己方棋子移动且对方棋子死亡dead = true
棋子没移动一次就要update()棋盘一次
算法:
//鼠标事件两步一重置
:
第一次点击
-
选择棋子(红方先走
默认鼠标第一次点击红方棋子有效)
第二次点击
-
移动or吃掉
--->
重置
--->
红方结束,黑方开始
--->
...
void
Board::
mouseReleaseEvent(QMouseEvent
*
ev)
{
QPoint
pt
=
ev->pos();
/*
两步:将pt转换成象棋的行列值;判断这个行列值上有没有棋子;
*/
int
row,
col;
bool
bRet
=
getRowCol(
pt,
row,
col);
//1
确定鼠标点击的格点行列值//确定鼠标点击的棋盘格点 位置,即行列位置(注:不是像素位置),正确点击格点像素位置的范围则返回true
if(
bRet
==
false)
//点在棋盘外
return;
int
i;
int
clickid
=
-
1;
//鼠标点一下棋子就会出现这个clickid
=
-1
for(
i
=
0;
i
<
32;
++
i)
//2
确定鼠标点击的格点是否为棋子//遍历整个棋盘的格点
确认
鼠标点击的是不是棋子
{
if(
_s[
i]._row
==
row
&&
_s[
i]._col
==
col
&&
_s[
i]._dead
==
false)
{
break;
}
}
if(
i
<
32)
{
clickid
=
i;
}
//3
至此确定鼠标点击的棋子是哪一个
if(
_selectid
==
-
1)
{
//_selectid
=
-1出现在默认构造函数中
clickid
=
-1
出现在mouseReleaseEvent(QMouseEvent
*ev)函数中
if(
clickid
!=
-
1)
//4
棋子选择可以是红方黑方
但象棋规定红方先走,所以鼠标第一次点击的黑棋子无效
必须是红方棋子才能算完成棋子选择
{
//象棋默认红方棋子先走
这里先选择红方棋子先走
if(
_bRedTurn
==
_s[
clickid]._red)
{
_selectid
=
clickid;
update();
}
}
}
else
{
if(
canMove(
_selectid,
row,
col,
clickid))
{
/*走棋*/
//5
红or黑
移动or吃掉
_s[
_selectid]._row
=
row;
_s[
_selectid]._col
=
col;
if(
clickid
!=
-
1)
{
_s[
clickid]._dead
=
true;
}
//6
重置
_selectid
=
-
1;
//为黑方开始走棋做准备//重新选择双方阵营的棋子
如
这里是红方先走,所以下面是黑方走
//不重新给selectid赋原来的初值的话,将会是红方棋子一直走或者红方棋子选择后再一直走,黑方棋子不能被选中
_bRedTurn
=
!
_bRedTurn;
//红方棋子走动部署结束
轮到黑方选择棋子
移动或者吃掉红方棋子
update();
}
}
}
二 错误
1 加上域名解析符
switch(
_s[
moveid].
_type)
{
case
CHE:
return
canMove1(
moveid,
row,
col,
killid);
break;
case
Stone::
MA:
return
canMove2(
moveid,
row,
col,
killid);
break;
case
Stone::
XIANG:
return
canMove3(
moveid,
row,
col,
killid);
break;
case
Stone::
SHI:
return
canMove4(
moveid,
row,
col,
killid);
break;
case
Stone::
JIANG:
return
canMove5(
moveid,
row,
col,
killid);
break;
case
Stone::
BING:
return
canMove6(
moveid,
row,
col,
killid);
break;
case
Stone::
PAO:
return
canMove7(
moveid,
row,
col,
killid);
break;
default:
break;
}