QT五子棋项目详解之二:人人对战
前面完成了界面的绘制,完成人人对战需要解决以下问题
一、时间
使用LCD_NUMBER控件来处理时间
时间处理的逻辑:
1、当时间结束,判负
一开始,建立两个定时器
1、黑白玩家交替执行,当黑棋玩家下完,黑棋的定时器停止,白棋的定时器开始。
void GameWindow::mouseReleaseEvent(QMouseEvent* event)
鼠标释放后
2、调用超时函数,时间处理完成
二、人人对战逻辑:
黑棋下棋后,触发mouseReleaseEvent
得到坐标x,y,判断在棋盘内下棋。并且将player++,player就用来标识是哪个玩家。
最后update()更新界面。
void GameWindow::mouseReleaseEvent(QMouseEvent* event)
{
int x,y;
if(mouseflag) //可以下
{
x=(event->y()-40)/40; //坐标
y=(event->x()-20)/40;//坐标
if(event->x()>=20&&event->x()<=620&&event->y()>=40&&event->y()<=640) //在棋盘内
{
if(game.judge(x,y)) //判断是否可以下
{
game.peoplePutDown2(x,y);//下子,即改变chess[x][y]值
if((game.player-1)%2) //该黑棋走
{
wtimerId->stop(); //白棋的定时器停止
btimerId->start(1000);//黑棋开始
}
else
{
btimerId->stop();
wtimerId->start(1000);
}
currentX=x;
currentY=y;
update();
if(game.ifWin(x,y))
{
if((game.player-1)%2)
QMessageBox::about(this,QStringLiteral("a"),QStringLiteral("a"));
else
QMessageBox::about(this,QStringLiteral("a"),QStringLiteral("a"));
btimerId->stop();
wtimerId->stop();
mouseflag=false;
}
}
else
QMessageBox::information(this,QStringLiteral("注意"),QStringLiteral("已存在棋子,请重下"),QMessageBox::Ok);
}
else
QMessageBox::information(this,QStringLiteral("注意"),QStringLiteral("不在棋盘内,请重下"),QMessageBox::Ok);
update();//重画
}
}