一、输赢判定的分析
1:当有将/帅被吃掉时输赢就确定了,输赢棋手肉眼可见,但计算机是不知道的。因此需要在完成每一次落子后都进行判定,来查看是否有将/帅被吃。
2:对于判定后出现的情况要有足够了解。没有出现将/帅被吃时就继续进行游戏;出现后必须告知是哪一方胜利,随后再进行下一步,可以与棋手进行一个交互,让棋手选择下一步的操作(进行下一局或退出游戏),根据棋手选择做出相应的回应。
3:在一局棋局结束若棋手选择再来一局,就必须对棋盘进行重绘,使其恢复至开局状态;同时需要删除上一局保存的下棋步骤,所有的变量都必须恢复到开局时的数据。若棋手选择退出游戏,就关闭整个窗口。可因为widget属于子窗口,子窗口关闭后主窗口并不会受到影响。要想关闭主窗口,就需要在棋手选择退出游戏时发射一个游戏结束的信号,主窗口接收信号后再执行关闭操作。
二、输赢判定实现
1:删除保存的下棋步骤(在棋手选择再来一局后调用)
void myWidget::clearSteps()
{
while(chessSteps.size())
{
chessSteps.pop();
}
}
2:游戏结束信号(在棋手选择退出游戏时发射)
signals:
void gameover();//游戏结束,关闭窗口
3:输赢判定函数
//判断输赢
bool myWidget::isWinning()
{
bool ans=true;
if(player)
{
for(int i=0;i<3;i++)
{
for(int j=3;j<6;j++)
if(chessmap[i][j]==Bjiang)
ans=false;//将军仍然在棋局当中,ans改为false表示并未胜利,继续游戏
}
if(ans)
{
messageBoxFun();//消息框
}
}
else
{
for(int i=7;i<10;i++)
{
for(int j=3;j<6;j++)
if(chessmap[i][j]==Rshuai)
ans=false;
}
if(ans)
{
messageBoxFun();//消息框
}
}
return ans;
}
//messageBox响应函数
void myWidget::messageBoxFun()
{
QString win;
if(player)
win=QString::fromLocal8Bit("红方胜利!");
else
win=QString::fromLocal8Bit("黑方胜利!");
QMessageBox message(QMessageBox::Information,"Information",win,QMessageBox::Yes|QMessageBox::No,NULL);
message.setButtonText(QMessageBox::Yes,QString::fromLocal8Bit("再来一局"));
message.setButtonText(QMessageBox::No,QString::fromLocal8Bit("退出游戏"));
if(message.exec()==QMessageBox::Yes)
{//模态方式显示(必须关闭此对话框才可以返回主窗口操作)
qDebug()<<"clicked yes\n";
gameBegin=false;
player=true;//开局红棋先手
clearSteps();//清空下棋步骤
update();//重绘
}
else
{
/*整个棋局是在名为“widget”的子窗口中进行的,要想通过mywidget中的QMessageBox的按钮来关闭游戏,
* 需要发射一个表示游戏结束的信号,主窗口接收信号后来做出关闭窗口的操作。*/
emit gameover();
qDebug()<<"clicked no\n";
}
}
4:isWinning函数的调用,在mousePressEvent中第二次点击目的位置后且棋子可以到达该位置时,完成chessmap中值的交换后进行该函数的调用。
if(game_moveRule(fromX,fromY,X,Y))
{
start.setX(fromX);start.setY(fromY);
drop.setX(X);drop.setY(Y);
saveSteps(chessmap[fromY][fromX],start,drop);
test();//测试
chessmap[Y][X]=chessmap[fromY][fromX];//将目标位置的值改为被移动棋子的值
chessmap[fromY][fromX]=chessboardVaule[fromY][fromX];//将棋子初始位置换位棋盘的值
if(!isWinning())//输赢判定
player=!player;//转换角色
}
5:运行效果
下图是红方胜利后出现信息交互框,由棋手进行选择
下图为选择“再来一局”后的测试效果,可以看到上一局的下棋步骤已被完全清空,棋局可恢复至开局状态可以进行下一局。
至此双人中国象棋游戏基本完成,可以进行简单的双人象棋游戏,不过在功能方面不是特别完善,有许多不足之处。若发现有错误之处,希望留言指出,大家共同进步。