#include "mainwindow.h" #include "ui_mainwindow.h" #include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); InitUI(); } MainWindow::~MainWindow() { delete ui; } void MainWindow::InitUI() { //定义期盼的大小 this->resize((::CHESS_C + 1) * ::MAX_X, (::CHESS_R + 1) * ::MAX_Y); //锁定边框大小 this->setMaximumSize((::CHESS_C + 1) * ::MAX_X, (::CHESS_R + 1) * ::MAX_Y); this->setMinimumSize((::CHESS_C + 1) * ::MAX_X, (::CHESS_R + 1) * ::MAX_Y); this->setWindowTitle("五子棋小游戏-逝水无痕"); b_black = false; } void MainWindow::paintEvent(QPaintEvent *event) { DraChessBoard(); DrawHandChess(); DrawChessItem(); //强制更新界面 update(); } //画棋盘 void MainWindow::DraChessBoard() { //绘图工具 QPainter painter(this); //防止棋盘变形 painter.setRenderHint(QPainter::Antialiasing,true); //给边框线颜色和大小 painter.setPen(QPen(QColor(Qt::black),2)); //给棋盘格子颜色 painter.setBrush(Qt::yellow); //便利回执期盼的所有的格子 for (int i=0;i<::CHESS_C; i++ ) { for (int j=0;j<::CHESS_R; j++ ) { //绘制矩形(棋盘的格子) painter.drawRect((i+0.5) * ::MAX_X,(j+0.5)* ::MAX_Y,::MAX_X,::MAX_Y); } } } //画鼠标上的棋子 void MainWindow::DrawHandChess() { QPainter painter(this); //给棋子边框绘制透明 painter.setPen(QPen(QColor(Qt::transparent))); if(b_black) { painter.setBrush(Qt::black); }else { painter.setBrush(Qt::white); } //绘制 painter.drawEllipse(mapFromGlobal(QCursor::pos()),::MAX_X/2,MAX_Y/2); } //处理棋子位置 void MainWindow::DrawChessAtPoint(QPainter &painter,QPoint &point) { //获取棋子的摆放位置 QPoint ptCenter((point.x()+0.5)*::MAX_X,(point.y()+0.5)*::MAX_Y); painter.drawEllipse(ptCenter,::MAX_X/2,::MAX_Y/2); } //判断五子是否连接 int MainWindow::CountNearItem(ChessItem item,QPoint pt) { int nCount = 0; item._pt+=pt; bool flag = true; while(flag) { int m = nCount; for (int i =0;i < p_ChessItem.size() ;i++ ) { if(p_ChessItem[i] == item){ nCount++; item._pt += pt; } } if(m == nCount){ flag = false; } } return nCount; } //点击事件 void MainWindow::mousePressEvent(QMouseEvent *event) { //获取鼠标点击的位置d qDebug()<pos()<<"\n"; //定义点位 QPoint pt; pt.setX((event->pos().x())/::MAX_X); pt.setY((event->pos().y())/::MAX_Y); //判断棋子是否存在 for (int i =0;i < p_ChessItem.size() ;i++ ) { //获取当前棋子样式赋值 ChessItem item = p_ChessItem[i]; if(item._pt == pt){ return; } } //不存在则绘制并判断五子是否连接 ChessItem item(pt,b_black); p_ChessItem.append(item); //统计四个点位是否连接 int nLeft = CountNearItem(item,QPoint(-1,0)); int nLeftUp = CountNearItem(item,QPoint(-1,-1)); int nLeftDown = CountNearItem(item,QPoint(-1,1)); int nUp = CountNearItem(item,QPoint(0,-1)); int nDown = CountNearItem(item,QPoint(0,1)); int nRight = CountNearItem(item,QPoint(1,0)); int nRightUp = CountNearItem(item,QPoint(1,-1)); int nRightDown = CountNearItem(item,QPoint(1,1)); if(nLeft+nRight >= 4 || nLeftUp + nRightDown >= 4 || nUp +nDown >= 4 || nRightUp + nLeftDown >= 4) { QString str = b_black?"Black win":"Wihte win"; QMessageBox::information(NULL,"GAME OVER",str,QMessageBox::Yes); p_ChessItem.clear(); return; } //设置颜色取反 b_black = !b_black; } void MainWindow::DrawChessItem() { QPainter painter(this); //给棋子边框绘制透明 painter.setPen(QPen(QColor(Qt::transparent))); // painter.setBrush(Qt::black); // //绘制 // painter.drawEllipse(65,65,::MAX_X,::MAX_Y); for (int i =0;i < p_ChessItem.size() ;i++ ) { //获取当前棋子样式赋值 ChessItem item = p_ChessItem[i]; if(item._black) { painter.setBrush(Qt::black); }else { painter.setBrush(Qt::white); } DrawChessAtPoint(painter,item._pt); } }