Qt实现中国象棋:(八)输赢判定

一、输赢判定的分析

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:运行效果
下图是红方胜利后出现信息交互框,由棋手进行选择
在这里插入图片描述

下图为选择“再来一局”后的测试效果,可以看到上一局的下棋步骤已被完全清空,棋局可恢复至开局状态可以进行下一局。
在这里插入图片描述

至此双人中国象棋游戏基本完成,可以进行简单的双人象棋游戏,不过在功能方面不是特别完善,有许多不足之处。若发现有错误之处,希望留言指出,大家共同进步。

Qt实现中国象棋

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zmq1998

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值