#include "mainwindow.h"
#include <windows.h>
#include <QTextEdit>
#include <QTimer>
#include <QTime>
#include <math.h>
typedef struct _stoneposition
{
int x;
int y;
}STONEPOS;
typedef struct _stonemove
{
STONEPOS StonePos1, StonePos2;
int Score;
}STONEMOVE;
BYTE cb[GRID_NUM][GRID_NUM];//棋盘
BYTE cb1[GRID_NUM][GRID_NUM];//棋盘缓存
STONEMOVE m_TargetBuff[10000];
int m_nSearchDepth=3; // 最大搜索深度
int m_nMaxDepth=3;
int ScoreOfRoad[7] = { 0, 17, 78, 141, 788, 1030, 100000 };
//int ScoreOfRoad[7] = { 0, 20, 80, 150, 800, 1000, 100000 };
int NumberOfMyRoad[7];
int NumberOfEnemyRoad[7];
int m_nMoveCount = 0;
STONEMOVE m_MoveList[7][20000];
int rx, ry;
int step=0; //步数
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
memset(cb, 0, sizeof(char)* GRID_NUM * GRID_NUM);
//计时区域
/* QPalette p=palette(); //设置背景
p.setColor(QPalette::Window,Qt::black);
setPalette(p);
setWindowFlags(Qt::FramelessWindowHint);
setWindowOpacity(0.5);
QTimer *timer =new QTimer(this);
connect(timer,SIGNAL(timeout()),this,SLOT(showTime()));
timer->start(1000);
showTime();
resize(150,60);
showColon =true;
*/
USER1 =new QLabel(tr("玩家1"));
USER2 =new QLabel(tr("玩家2"));
TimeLayout =new QVBoxLayout;
timer =new QTimer(this);
lcd1 =new QLCDNumber;
lcd2 =new QLCDNumber;
lcd1->setDigitCount(10); //设置LCD显示的位数
lcd2->setDigitCount(10);
//lcd1->setMode(QLCDNumber::Dec); //设置显示模式为10进制
//lcd2->setMode(QLCDNumber::Dec); //设置显示模式为10进制
//lcd1->setSegmentStyle(QLCDNumber::Flat); //设置显示方式
//lcd2->setSegmentStyle(QLCDNumber::Flat);
hour1=0,hour2=0,minute1=0,minute2=0,second1=0,second2=0;
timer->setInterval(1000); //设置定时器多少毫秒发送一个timeout信号
//timer->start();
lcd1->display("00:00:00");
lcd2->display("00:00:00");
TimeLayout->addWidget(USER1,0);
TimeLayout->addWidget(lcd1,1);
TimeLayout->addWidget(USER2,2);
TimeLayout->addWidget(lcd2,3);
//总控制区域
CtrlLayout =new QGridLayout;
StopBtn =new QPushButton(tr("暂停")); //初始化按钮
GoBtn =new QPushButton(tr("Star"));
EndBtn =new QPushButton(tr("终止"));
OutBtn =new QPushButton(tr("悔棋"));
First =new QPushButton(tr("先手"));
Second =new QPushButton(tr("后手"));
CtrlLayout->addWidget(StopBtn,0,1); //向区域内添加部件
CtrlLayout->addWidget(GoBtn,0,0);
CtrlLayout->addWidget(OutBtn,1,1);
CtrlLayout->addWidget(EndBtn,1,0);
//信息控制区域
InforLayout =new QGridLayout;
DifficultyBtn =new QButtonGroup(this);
FirstBtn =new QRadioButton(tr("后手"));
SecondBtn =new QRadioButton(tr("先手"));
DifficultyBtn->addButton(FirstBtn);
DifficultyBtn->addButton(SecondBtn);
DifficultyBtn->setId(FirstBtn,0);
DifficultyBtn->setId(SecondBtn,1);
InforLayout->addWidget(FirstBtn,0,0);
InforLayout->addWidget(SecondBtn,0,1);
//FirstBtn->setChecked(true);
//棋盘区域
ChessLayout =new QGridLayout;
ChessBD =new QLabel;
painter =new QPainter;
//QPixmap pixmap("ChessBoard.png");
//QPixmap pixmap2("Chessb.png");
// ChessBD->setPixmap(pixmap);
/*painter->begin(this);
for(int i=0;i<GRID_NUM;i++)
for(int j=0;j<GRID_NUM;j++)
{
if(chessboard[i][j]==1)
{
//ChessBD->drawFrame(painter->drawPixmap(i*40,j*40,30,30,pixmap2));
}
if(chessboard[i][j]==2)
{
painter->drawPixmap(i*40,j*40,30,30,pixmap2);
}
}
painter->end();
*/
ChessBD->setFixedSize(750,750);
ChessBD->update();
ChessLayout->addWidget(ChessBD);
QVBoxLayout *ImformationLayout =new QVBoxLayout;
ImformationLayout->addLayout(TimeLayout,0);
ImformationLayout->addLayout(InforLayout,2);
ImformationLayout->addLayout(CtrlLayout,1);
QGridLayout *mainLayout =new QGridLayout;
mainLayout->addLayout(ChessLayout,0,0);
mainLayout->addLayout(ImformationLayout,0,1);
QWidget *widget = new QWidget(this);
widget->setLayout(mainLayout);
/* QPixmap pixmap1("BlackGround.png");
QPalette palette();
palette.setBrush(QPalette::Background,QBrush(pixmap1));
widget->setPalette(palette);
*/
this->setCentralWidget(widget);
// Sleep(1000); //休眠等待程序启动画面
connect(StopBtn,SIGNAL(clicked()),this,SLOT(StopBtnClick()));
connect(EndBtn,SIGNAL(clicked()),this,SLOT(EndBtnClick()));
connect(OutBtn,SIGNAL(clicked()),this,SLOT(OutBtnCliked()));
connect(GoBtn,SIGNAL(clicked()),this,SLOT(GoBtnCliked()));
connect(timer,SIGNAL(timeout()),this,SLOT(showTime()));
connect(FirstBtn,SIGNAL(clicked()),this,SLOT(FirstSecond()));
connect(SecondBtn,SIGNAL(clicked()),this,SLOT(FirstSecond()));
}
MainWindow::~MainWindow()
{
}
//**************************************************************************************************************************
int MakeMove(STONEMOVE move, int type)
{
cb[move.StonePos1.y][move.StonePos1.x] = type;
cb[move.StonePos2.y][move.StonePos2.x] = type;
return 0;
}
void SetSearchDepth(int nDepth) { m_nSearchDepth = nDepth; }
STONEMOVE m_cmBestMove;
int CheckCHess()
{
int i=0;
for (int i = 0; i < 19; i++)
{
for (int j = 0; j<19; j++)
{
if(cb[i][j]!=0) i++;
}
}
return i;
}
void AnalysisHorizon(BYTE position[][GRID_NUM], int Type)
{
for (int i = 0; i < 19; i++)
{
for (int j = 0; j<14; j++)
{
int number = position[i][j] + position[i][j + 1] + position[i][j + 2] +
position[i][j + 3] + position[i][j + 4] + position[i][j + 5];
if (number == 0 || (number>6 && number % 7 != 0))
continue;
if (Type == BLACK)
{
if (number<7)
NumberOfMyRoad[number]++;
else
NumberOfEnemyRoad[number / 7]++;
}
else
{
if (number>6)
NumberOfMyRoad[number / 7]++;
else
NumberOfEnemyRoad[number]++;
}
}
}
}
void AnalysisVertical(BYTE position[][GRID_NUM], int Type)
{
for (int j = 0; j<19; j++)
{
for (int i = 0; i<14; i++)
{
int number = position[i][j] + position[i + 1][j] + position[i + 2][j] +
position[i + 3][j] + position[i + 4][j] + position[i + 5][j];
if (number == 0 || (number>6 && number % 7 != 0))
continue;
if (Type == BLACK)
{
if (number<7)
NumberOfMyRoad[number]++;
else
NumberOfEnemyRoad[number / 7]++;
}
else
{
if (number>6)
NumberOfMyRoad[number / 7]++;
else
NumberOfEnemyRoad[number]++;
}
}
}
}
void AnalysisLeft(BYTE position[][GRID_NUM], int Type)
{
for (int i = 5; i<19; i++)
{
for (int j = 5; j<19; j++)
{
int number = position[i][j] + position[i - 1][j - 1] + position[i - 2][j - 2] +
position[i - 3][j - 3] + position[i - 4][j - 4] + position[i - 5][j - 5];
if (number == 0 || (number>6 && number % 7 != 0))