#include "Board.h"
#include <QPainter>
#include <QMouseEvent>
//#include <QDebug>
Board::Board(QWidget *parent) : QWidget(parent)
{
this->_r = 20;
setMinimumSize(_r*18+1,_r*20+1);
init(true);
}
Board::~Board()
{
}
void Board::init(bool bRedSide)
{
for(int i=0;i<32;i++)
{
_s[i].init(i);
}
if(bRedSide)
{
for(int i=0;i<32;i++)
{
_s[i].rotate();
}
}
_selectid = -1;
_bRedTurn = true;
_bSide = bRedSide;
update();
}
void Board::paintEvent(QPaintEvent *)
{
int r = height()/20;
_r = r;
_off = QPoint(r+1,r+1);
QPainter p(this);
p.setRenderHints(QPainter::Antialiasing|QPainter::TextAntialiasing);
//画棋盘
p.save();
drawPlate(p);
p.restore();
//画九宫格
p.save();
drawPlace(p);
p.restore();
//画炮兵起始位置
p.save();
drawInitPosition(p);
p.restore();
//绘制32个棋子
p.save();
drawStone(p);
p.restore();
}
void Board::drawPlate(QPainter &p)
{
//画十条横线
for(int i=0;i<10;i++)
{
if(i==0 || i==9)
{
p.setPen(QPen(Qt::black, 3, Qt::SolidLine));
}
else
{
p.setPen(QPen(Qt::black, 1, Qt::SolidLine));
}
p.drawLine(center(i,0),center(i,8));
}
//画十条竖线
for(int i=0;i<9;i++)
{
if(i==0 || i==8)
{
p.setPen(QPen(Qt::black, 3, Qt::SolidLine));
p.drawLine(center(0,i),center(9,i));
}
else
{
p.setPen(QPen(Qt::black, 1, Qt::SolidLine));
p.drawLine(center(0,i), center(4,i));
p.drawLine(center(5,i), center(9,i));
}
}
}
void Board::drawPlace(QPainter &p)
{
//画九宫格
p.drawLine(center(0,3), center(2,5));
p.drawLine(center(2,3), center(0,5));
p.drawLine(center(9,3), center(7,5));
p.drawLine(center(7,3), center(9,5));
}
void Board::drawInitPosition(QPainter &p)
{
//画兵起始位
drawInitPosition(p, 3, 0);
drawInitPosition(p, 3, 2);
drawInitPosition(p, 3, 4);
drawInitPosition(p, 3, 6);
drawInitPosition(p, 3, 8);
drawInitPosition(p, 6, 0);
drawInitPosition(p, 6, 2);
drawInitPosition(p, 6, 4);
drawInitPosition(p, 6, 6);
drawInitPosition(p, 6, 8);
//画炮起始位
drawInitPosition(p, 2, 1);
drawInitPosition(p, 2, 7);
drawInitPosition(p, 7, 1);
drawInitPosition(p, 7, 7);
}
void Board::drawInitPosition(QPainter &p, int row, int col)
{
QPoint pt = center(row,col);
QPoint off = QPoint(_r/6,_r/6);
int len = _r/3;
QPoint ptStart;
QPoint ptEnd;
if(col!=0)
{
//左上角
ptStart = QPoint(pt.x()-off.x(),pt.y()-off.y());
ptEnd = ptStart + QPoint(-len,0);
p.drawLine(ptStart,ptEnd);
ptEnd = ptStart + QPoint(0,-len);
p.drawLine(ptStart,ptEnd);
//左下角
ptStart = QPoint(pt.x()-off.x(),pt.y()+off.y());
ptEnd = ptStart + QPoint(-len,0);
p.drawLine(ptStart,ptEnd);
ptEnd = ptStart + QPoint(0,+len);
p.drawLine(ptStart,ptEnd);
}
if(col!=8)
{
//右上角
ptStart = QPoint(pt.x()+off.x(),pt.y()-off.y());
ptEnd = ptStart + QPoint(+len,0);
p.drawLine(ptStart,ptEnd);
ptEnd = ptStart + QPoint(0,-len);
p.drawLine(ptStart,ptEnd);
//右下角
ptStart = QPoint(pt.x()+off.x(),pt.y()+off.y());
ptEnd = ptStart + QPoint(+len,0);
p.drawLine(ptStart,ptEnd);
ptEnd = ptStart + QPoint(0,+len);
p.drawLine(ptStart,ptEnd);
}
}
void Board::drawStone(QPainter &p)
{
for(int i=0;i<32;i++)
{
drawStone(p,i);
}
}
//判断棋子是否存活
bool Board::isDead(int id)
{
if(id == -1)
{
return true;
}
return _s[id]._dead;
}
void Board::drawStone(QPainter &p,int id)
{
if(isDead(id))
{
return;
}
QColor color;
if(red(id))
{
color = Qt::red;
}
else
{
color = Qt::black;
}
p.setPen(QPen(QBrush(color),2));
//选中为灰色
if(id==_selectid)
{
p.setBrush(QBrush(Qt::gray));
}
else
{
p.setBrush(QBrush(Qt::yellow));
}
p.drawEllipse(cell(id));
p.setFont(QFont("system",_r*0.9,700));
p.drawText(cell(id),name(id),QTextOption(Qt::AlignCenter));
}
QString Board::name(int id)
{
return _s[id].name();
}
bool Board::red(int id)
{
return _s[id]._red;
}
bool Board::sameColor(int id1, int id2)
{
if(id1 == -1 || id2 == -1)
{
return false;
}
return red(id1)==red(id2);
}
int Board::getStoneId(int row, int col)
{
for(int i=0; i<32;i++)
{
if(_s[i]._row == row && _s[i]._col == col && !isDead(i))
{
return i;
}
}
return -1;
}
void Board::killStone(int id)
{
if(id == -1)
{
return;
}
_s[id]._dead = true;
}
void Board::reliveStone(int id)
{
if(id == -1)
{
return;
}
_s[id]._dead = false;
}
void Board::moveStone(int moveid, int row, int col)
{
_s[moveid]._row = row;
_s[moveid]._col = col;
_bRedTurn = !_bRedTurn;
}
QPoint Board::center(int row, int col)
{
QPoint pt(_r*2*col, _r*2*row);
return pt + _off;
}
QPoint Board::center(int id)
{
return center(_s[id]._row,_s[id]._col);
}
QPoint Board::topLeft(int row, int col)
{
return center(row,col)-QPoint(_r,_r);
}
QPoint Board::topLeft(int id)
{
return center(id)-QPoint(_r,_r);
}
QRect Board::cell(int row, int col)
{
return QRect(topLeft(row,col),QSize(_r*2-1,_r*2-1));
}
QRect Board::cell(int id)
{
return QRect(topLeft(id),QSize(_r*2-1,_r*2-1));
}
//效率不高,需要改进
bool Board::getClickRowCol(QPoint pt, int &row, int &col)
{
for(row=0;row<=9;row++)
{
for(col=0;col<=8;col++)
{
QPoint distance=center(row,col)-pt;
if(distance.x()*distance.x() + distance.y()*distance.y() < _r*_r)
return true;
}
}
return false;
}
int Board::relation(int row1, int col1, int row, int col)
{
return qAbs(row1-row)*10+qAbs(col1-col);
}
//JIANG
bool Board::canMoveJiang(int moveid,int row,int col, int)
{
/*
* 1.首先目标位置在九宫格内
* 2.移动的步长是一个格子
*/
if(_s[moveid]._red)
{
if(row>2)return false;
}
else
{
if(row<7)return false;
}
if(col<3)return false;
if(col>5)return false;
int dr=_s[moveid]._row-row;
int dc=_s[moveid]._col-col;
int d=abs(dr)*10+abs(dc);
if(d==1 || d==10)
{
return true;
}
return false;
}
//SHI
bool Board::canMove2(int moveid,int row,int col, int killid)
{
if(_s[moveid]._red)
{
if(row>2)return false;
}
else
{
if(row<7)return false;
}
if(col<3)return false;
if(col>5)return false;
int dr=_s[moveid]._row-row;
int dc=_s[moveid]._col-col;
int d=abs(dr)*10+abs(dc);
if(d==11)
{
return true;
}
return false;
}
//XIANG
bool Board::canMove3(int moveid,int row,int col, int killid)
{
return true;
}
//CHE
bool Board::canMove4(int moveid,int row,int col, int killid)
{
return true;
}
//MA
bool Board::canMove5(int moveid,int row,int col, int killid)
{
return true;
}
//PAO
bool Board::canMove6(int moveid,int row,int col, int killid)
{
return true;
}
//BING
bool Board::canMove7(int moveid,int ro