#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "qpainter.h"
#include "qevent.h"
#include "qpoint.h"
#include "qmessagebox.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->mainToolBar->hide();
ui->menuBar->hide();
resize((CHESS_COLUMES + 1)*RECT_WIDTH ,(CHESS_ROWS + 1)*RECT_HEIGHT);
mBlack = true;
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::paintEvent(QPaintEvent *e)
{
DrawChessboard(); //画棋盘
DrawItems(); //画棋子
DrawItemWithMouse(); //画鼠标(当前方的棋子形状)
update();
}
void MainWindow::DrawChessboard()
{
QPainter painter(this);
painter.setRenderHint(QPainter::HighQualityAntialiasing, true);
painter.setBrush(Qt::darkYellow);
painter.setPen(QPen(QColor(Qt::black),2));
for(int i = 0;i
{
for (int j = 0; j
{
painter.drawRect( (i+0.5)*RECT_WIDTH,(j+0.5)*RECT_HEIGHT,RECT_WIDTH,RECT_HEIGHT);
}
}
}
void MainWindow::DrawItems()
{
QPainter painter(this);
painter.setPen(QPen(QColor(Qt::transparent)));
for (int i = 0; i
{
Item item = mItems[i];
if (item.mBlack)
{
painter.setBrush(Qt::black);
}
else
{
painter.setBrush(Qt::white);
}
DrawChessAtPoint(painter,item.mPt);
}
}
void MainWindow::DrawChessAtPoint(QPainter& painter,QPoint& pt)
{
QPoint ptCenter((pt.x()+0.5)*RECT_WIDTH,(pt.y()+0.5)*RECT_HEIGHT);
painter.drawEllipse(ptCenter,RECT_WIDTH / 2,RECT_HEIGHT / 2);
}
void MainWindow::DrawItemWithMouse()
{
QPainter painter(this);
painter.setPen(QPen(QColor(Qt::transparent)));
if (mBlack)
{
painter.setBrush(Qt::black);
}
else
{
painter.setBrush(Qt::white);
}
painter.drawEllipse(mapFromGlobal(QCursor::pos()),RECT_WIDTH / 2,RECT_HEIGHT / 2);
}
void MainWindow::mousePressEvent(QMouseEvent * e)
{
//求鼠标点击处的棋子点pt
QPoint pt;
pt.setX( (e->pos().x() ) / RECT_WIDTH);
pt.setY( (e->pos().y() ) / RECT_HEIGHT);
//如果已存在棋子,就什么也不做
for (int i = 0; i
{
Item item = mItems[i];
if (item.mPt == pt)
{
//已有棋子
return;
}
}
//不存在棋子,就下一个
Item item(pt,mBlack);
mItems.append(item);
//统计4个方向是否五子连
int nLeft = CountNearItem(item,QPoint(-1,0));
int nLeftUp = CountNearItem(item,QPoint(-1,-1));
int nUp = CountNearItem(item,QPoint(0,-1));
int nRightUp = CountNearItem(item,QPoint(1,-1));
int nRight = CountNearItem(item,QPoint(1,0));
int nRightDown = CountNearItem(item,QPoint(1,1));
int nDown = CountNearItem(item,QPoint(0,1));
int nLeftDown = CountNearItem(item,QPoint(-1,1));
if ( (nLeft + nRight) >= 4 ||
(nLeftUp + nRightDown) >= 4 ||
(nUp + nDown) >= 4 ||
(nRightUp + nLeftDown) >= 4 )
{
QString str = mBlack? QStringLiteral("黑棋胜利!") : QStringLiteral("白棋胜利!");
QMessageBox::information(NULL, QStringLiteral("游戏结束"),str, QMessageBox::Ok , QMessageBox::Ok);
mItems.clear();
//NewGame();
return;
}
//该另一方下棋了
mBlack = !mBlack;
}
int MainWindow::CountNearItem(Item item,QPoint ptDirection)
{
int nCount = 0;
item.mPt += ptDirection;
while (mItems.contains(item))
{
nCount++;
item.mPt += ptDirection;
}
return nCount;
}