#include "frame.h"
#include "ui_frame.h"
#include "Data.h"
#include <QPainter>
#include <cmath>
#include <QTextItem>
#include <QMessageBox>
#include <QPaintEvent>
#include <ctime>
#include <QMouseEvent>
#include <iostream>
#include <QImage>
using namespace std;
Frame::Frame(QWidget *parent) :
QFrame(parent),
ui(new Ui::Frame)
{
ui->setupUi(this);
com=false;
this->setMouseTracking(true);
d=new Data[400];
DnX=0;
DnY=0;
begin=false;
MoveX=0;
y=0;
c=0;
MoveY=0;
turn=0;
mDn=false;
row=0;
col=0;
this->setCursor(Qt::CrossCursor);
im=new QImage(":new/prefix1/Woods.jpg");
}
Frame::~Frame()
{
delete ui;
}
void Frame::paintEvent(QPaintEvent *e)
{
QImage img(this->width(),this->height(),QImage::Format_ARGB32);
QPainter p(&img);
QPainter p1(this);
p.setRenderHint(QPainter::Antialiasing,true);
//p1.setRenderHint(QPainter::Antialiasing,true);
char ary[5]={0};
this->map();
p.drawImage(0,0,*im);
p.setPen(QPen(Qt::black,1,Qt::SolidLine));
p.setPen(QPen(Qt::black,2,Qt::SolidLine));
for (int i=30;i<=this->width()-30;i+=40)
{
p.drawLine(i,30,i,this->height()-30);
for (int j=30;j<=this->height()-30;j+=40)
{
p.drawLine(30,j,this->width()-30,j);
}
}
p.setBrush(QBrush(Qt::black));
p.drawRect(d[26].x-3,d[26].y-3,6,6);
p.drawRect(d[110].x-3,d[110].y-3,6,6);
p.drawRect(d[33].x-3,d[33].y-3,6,6);
p.drawRect(d[117].x-3,d[117].y-3,6,6);
int n=0;
for (int i=30;i<=this->height()-30;i+=40)
{
itoa(n,ary,10);
QString str(ary);
p.setPen(QPen(Qt::black,2,Qt::SolidLine));
p.drawText(15,i,str);
p.drawText(i,15,str);
n++;
}
p1.drawImage(0,0,img);
p.setPen(QPen(Qt::NoPen));
if (begin)
{
for (int i=0;i<row*col;i++)
{
if (d[i].color==1) //white
{
QRadialGradient radialGradient(d[i].x-20,d[i].y-20,40);
radialGradient.setColorAt(0.2, Qt::white);
radialGradient.setColorAt(1.0, Qt::gray);
p.setBrush(radialGradient);
p.drawEllipse(d[i].x-20,d[i].y-20,40,40);
}
else if (d[i].color==2) //black
{
QRadialGradient radialGradient(d[i].x-20,d[i].y-20,40);
radialGradient.setColorAt(0.1, Qt::gray);
radialGradient.setColorAt(1.0, Qt::black);
p.setBrush(radialGradient);
p.drawEllipse(d[i].x-20,d[i].y-20,40,40);
}
else if (abs(MoveX-d[i].x)<=15&&abs(MoveY-d[i].y)<=15&&d[i].color==0)
{
if (turn==1)
{
QRadialGradient radialGradient(d[i].x-20,d[i].y-20,40);
radialGradient.setColorAt(0.2, Qt::white);
radialGradient.setColorAt(1.0, Qt::gray);
p.setBrush(radialGradient);
}
else
{
QRadialGradient radialGradient(d[i].x-20,d[i].y-20,40);
radialGradient.setColorAt(0.1, Qt::gray);
radialGradient.setColorAt(1.0, Qt::black);
p.setBrush(radialGradient);
}
p.drawEllipse(d[i].x-20,d[i].y-20,40,40);
}
QString str(itoa(i,ary,10));
//p.drawText(d[i].x,d[i].y,str);
}
}
p1.drawImage(0,0,img);
if (this->judge())
{
for (int i=0;i<row*col;i++)
{
d[i].color=0;
}
begin=false;
if (win==2)
{
QMessageBox::about(NULL,"Game Over","Black Win");
if (!com)
QMessageBox::about(NULL,"Game Over","Too Weak");
c++;
}
else if (win==1)
{
QMessageBox::about(NULL,"Game Over","White Win");
y++;
}
emit winner(y*10+c);
win=0;
}
}
void Frame::map()
{
int k=0;
col=0;
for (int i=30;i<=this->width()-30;i+=40)
{
col++;
row=0;
for (int j=30;j<=this->height()-30;j+=40)
{
d[k].x=i;
d[k].y=j;
k++;
row++;
}
}
}
void Frame::mouseMoveEvent(QMouseEvent *e)
{
MoveX=e->x();
MoveY=e->y();
this->update();
}
void Frame::mouseDoubleClickEvent(QMouseEvent *e)
{
DnX=e->x();
DnY=e->y();
for (int i=0;i<row*col;i++)
{
if (abs(DnX-d[i].x)<=10&&abs(DnY-d[i].y)<=10)
{
if (d[i].color==0)
{
d[i].color=turn;
if (turn==1)
{
emit chessDown(i+2000);
turn=2;
}
else if (turn==2)
{
emit chessDown(i+1000);
turn=1;
}
if (com)
this->computer();
}
}
}
this->update();
}
int Frame::getTurn()
{
return turn;
}
bool Frame::check(Data *dt,int i)
{
int td=0,tdr=0,tr=0,tur=0,k=0;
for (int j=i;j<i+5;j++)
{
if (d[i].color==d[j].color)
{
td++;
}
if (d[i].color==d[i+row*k].color)
{
tr++;
}
if (d[i].color==d[i+k+row*k].color)
{
tdr++;
}
if (d[i].color==d[i-k+row*k].color)
{
tur++;
}
k++;
}
if (td==5||tdr==5||tr==5||tur==5)
return true;
return false;
}
bool Frame::judge()
{
for (int i=0;i<row*col;i++)
{
if (check(d,i)&&d[i].color!=0)
{
win=d[i].color;
return true;
}
}
return false;
}
void Frame::computer()
{
int c=0,co;
char a[10]={0};
for (int i=0;i<row*col;i++)
{
cout<<i<<" "<<this->computerchoose(i)<<endl;
if (this->computerchoose(i)>=c)
{
c=this->computerchoose(i);
co=i;
}
}
itoa(c,a,10);
d[co].color=turn;
emit chessDown(co+1000);
if (turn==1)
turn=2;
else if (turn==2)
turn=1;
}
int Frame::computerchoose(int i)
{
int ans=0;
if (d[i].color==0)
{
if (d[i-4].color==d[i-3].color&&d[i-3].color==d[i-2].color&&d[i-2].color==d[i-1].color&&d[i-1].color==turn&&i>=4)
{
if (ans<=8)
ans=8;
}
else if (d[i-4].color==d[i-3].color&&d[i-3].color==d[i-2].color&&d[i-2].color==d[i-1].color&&d[i-1].color!=turn&&d[i-1].color!=0&&i>=4)
{
if (ans<=7)
ans=7;
}
else if (d[i-4].color==0&&d[i-3].color==d[i-2].color&&d[i-2].color==d[i-1].color&&d[i-1].color!=turn&&d[i-1].color!=0&&i>=4)
{
if (ans<=6)
ans=6;
}
else if (d[i-4].color==0&&d[i-3].color==d[i-2].color&&d[i-2].color==d[i-1].color&&d[i-1].color==turn&&i>=3)
{
if (ans<=5)
ans=5;
}
else if (d[i-3].color==0&&d[i-2].color==d[i-1].color&&d[i-1].color!=turn&&d[i-1].color!=0&&i>=4)
{
if (ans<=4)
ans=4;
}
else if (d[i-3].color==0&&d[i-2].color==d[i-1].color&&d[i-1].color==turn&&i>=4)
{
if (ans<=3)
ans=3;
}
else if (d[i-2].color==0&&d[i-1].color!=turn&&d[i-1].color!=0&&i>=4)
{
if (ans<=2)
ans=2;
}
else if (d[