QT实现五子棋游戏
本文实例为大家分享了QT实现五子棋游戏的具体代码,供大家参考,具体内容如下
有点bug但是能运行
每次点击右边会出现提示图标,表示是黑方落子还是白方并计时,不过不知道为什么点的次数多了就不出现提示了然后过一会又有了![Alt]
代码片:
#include"widget.h" #include"ui_widget.h" #include#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include Widget::Widget(QWidget*parent) :QWidget(parent) ,ui(newUi::Widget) { ui->setupUi(this); ui->label_2->hide(); //resize(640,640); memset(a,0,15*15*sizeof(int)); player=0; ui->lcdNumber->setSegmentStyle(QLCDNumber::Flat); ui->lcdNumber->display(QDateTime::currentDateTime().toString("000")); ui->lcdNumber_2->setSegmentStyle(QLCDNumber::Flat); ui->lcdNumber_2->display(QDateTime::currentDateTime().toString("000")); timer1=newQTimer(this); connect(timer1,&QTimer::timeout,this,&Widget::handle_timeout); timer1->start(1000); timer2=newQTimer(this); connect(timer2,&QTimer::timeout,this,&Widget::handle_timeout); timer2->start(1000); } Widget::~Widget() { deleteui; } voidWidget::handle_timeout() { if(flag%2==0){ for(sec=numb1;sec>0;sec--) { ui->lcdNumber->display(QDateTime::currentDateTime().toString(QString::number(sec))); Delay_MSec(1000); if(flag%2==1){ numb1=sec; break; } if(sec<=0) QMessageBox::information(this,"Win","WhiteWin",QMessageBox::Ok); } //timer1->stop(); } elseif(flag%2==1) { for(sec=numb2;sec>0;sec--) { ui->lcdNumber_2->display(QDateTime::currentDateTime().toString(QString::number(sec))); Delay_MSec(1000); if(flag%2==0){ numb2=sec; break;} if(sec<=0) QMessageBox::information(this,"Win","BlackWin",QMessageBox::Ok); } //timer2->stop(); } } voidWidget::Delay_MSec(unsignedintmsec) { QTime_Timer=QTime::currentTime().addMSecs(msec); while(QTime::currentTime()<_Timer) { QCoreApplication::processEvents(QEventLoop::AllEvents,100); } } voidWidget::paintEvent(QPaintEvent*) { gridW=width()/19;//窗口宽度分18份 gridH=height()/19;//窗口高度分18份 //棋盘起点坐标 startX=gridW; startY=gridH; QPainterp(this); //背景图 p.drawPixmap(0,0,width(),height(),QPixmap(":/new/prefix1/C:/tupian/image/board1.jpg")); p.setRenderHint(QPainter::Antialiasing,true); inti,j; for(i=0;i<16;i++) { p.drawLine(startX,startY+i*gridH,startX+15*gridW,startY+i*gridH); p.drawLine(startX+i*gridW,startY,startX+i*gridW,startY+15*gridH); } QBrushbrush; brush.setStyle(Qt::SolidPattern); for(i=0;i<15;i++) { for(j=0;j<15;j++) { if(a[i][j]==1) { p.drawPixmap(startX+i*gridW,startY+j*gridH, gridW,gridH, QPixmap(":/new/prefix1/C:/tupian/image/white.png") ); ui->label->hide(); ui->label_2->show(); /*brush.setColor(Qt::black); p.setBrush(brush); p.drawEllipse(QPoint((i+1)*40,(j+1)*40),15,15);*/ } elseif(a[i][j]==2) { p.drawPixmap(startX+i*gridW,startY+j*gridH, gridW,gridH, QPixmap(":/new/prefix1/C:/tupian/image/black.png") ); ui->label->show(); ui->label_2->hide(); /*brush.setColor(Qt::white); p.setBrush(brush); p.drawEllipse(QPoint((i+1)*40,(j+1)*40),15,15);*/ } } } } voidWidget::mouseReleaseEvent(QMouseEvent*e) { intx,y; flag++; if(e->x()>=startX&&e->x() y()>=startY&&e->y() x()-startX)/gridW; y=(e->y()-startY)/gridH; if(!a[x][y]) { a[x][y]=player++%2+1; } if(iswin(x,y)) { update(); setEnabled(false); if(flag%2==1) QMessageBox::information(this,"Win","BlackWin",QMessageBox::Ok); else QMessageBox::information(this,"Win","WhiteWin",QMessageBox::Ok); } } update(); } intWidget::iswin(intx,inty) { returnf1(x,y)||f2(x,y)||f3(x,y)||f4(x,y); } intWidget::f1(intx,inty) { inti; for(i=0;i<5;i++) { if(y-i>=0&& y+4-i<=0xF&& a[x][y-i]==a[x][y+1-i]&& a[x][y-i]==a[x][y+2-i]&& a[x][y-i]==a[x][y+3-i]&& a[x][y-i]==a[x][y+4-i]) return1; } return0; } intWidget::f2(intx,inty) { inti; for(i=0;i<5;i++) { if(x-i>=0&& x+4-i<=0xF&& a[x-i][y]==a[x+1-i][y]&& a[x-i][y]==a[x+2-i][y]&& a[x-i][y]==a[x+3-i][y]&& a[x-i][y]==a[x+4-i][y]) return1; } return0; } intWidget::f3(intx,inty) { inti; for(i=0;i<5;i++) { if(x-i>=0&& y-i>=0&& x+4-i<=0xF&& y+4-i<=0xF&& a[x-i][y-i]==a[x+1-i][y+1-i]&& a[x-i][y-i]==a[x+2-i][y+2-i]&& a[x-i][y-i]==a[x+3-i][y+3-i]&& a[x-i][y-i]==a[x+4-i][y+4-i]) return1; } return0; } intWidget::f4(intx,inty) { inti; for(i=0;i<5;i++) { if(x+i<=0xF&& y-i>=0&& x-4+i>=0&& y+4-i<=0xF&& a[x+i][y-i]==a[x-1+i][y+1-i]&& a[x+i][y-i]==a[x-2+i][y+2-i]&& a[x+i][y-i]==a[x-3+i][y+3-i]&& a[x+i][y-i]==a[x-4+i][y+4-i]) return1; } return0; } voidWidget::on_pushButtonOver_clicked() { this->close(); } /*-------main.cpp----------------------------*/ #include intmain(intargc,char*argv[]) { QApplicationa(argc,argv); Widgetw; w.show(); returna.exec(); } /*---------widget.h-----------*/ #ifndefWIDGET_H #defineWIDGET_H #include QT_BEGIN_NAMESPACE namespaceUi{classWidget;} QT_END_NAMESPACE classWidget:publicQWidget { Q_OBJECT public: Widget(QWidget*parent=nullptr); ~Widget(); voidpaintEvent(QPaintEvent*event); voidmouseReleaseEvent(QMouseEvent*event); QTimer*timer1,*timer2; voidhandle_timeout(void); voidDelay_MSec(unsignedintmsec); intflag=3; intsec=0; intnumb1=900; intnumb2=900; intplayer; privateslots: voidon_pushButtonOver_clicked(); private: Ui::Widget*ui; inta[15][15]; intiswin(int,int); intf1(int,int); intf2(int,int); intf3(int,int); intf4(int,int); intgridW;//棋盘水平方向一个格子的宽度 intgridH;//棋盘水平方向一个格子的高度 intstartX;//棋盘起点x坐标 intstartY;//棋盘起点y坐标 intchessX=-1,chessY=-1;//棋盘下标 }; #endif//WIDGET_H
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。