|
@@ -0,0 +1,166 @@
|
|
|
+#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);
|
|
|
+ }
|
|
|
+}
|