123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- #include "mainwindow.h"
- #include "ui_mainwindow.h"
- #include<QtDebug>
- 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()<<event->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);
- }
- }
|