#include "Board.h"
#include <QPainter>
#include <QMouseEvent>
#include <QDebug>
#define GetRowCol(__row, __col, __id) \
int __row = _s[__id]._row;\
int __col = _s[__id]._col
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);
}
bool Board::isBottomSide(int id)
{
return _bSide == _s[id]._red;
}
//车行子规则
bool Board::canMoveChe(int moveid, int, int row, int col)
{
GetRowCol(row1,col1,moveid);
int ret = getStoneCountAtLine(row1,col1,row,col);
if(ret == 0)
{
return true;
}
return false;
}
//Ma
bool Board::canMoveMa(int moveid, int, int row, int col)
{
GetRowCol(row1,col1,moveid);
int r=relation(row1,col1,row,col);
if(r != 12 && r !=21)
{
return false;
}
//判断是否憋马脚
if(r == 12)
{
if(getStoneId(row1,(col+col1)/2) != -1)
{
return false;
}
}
else
{
if(getStoneId((row+row1)/2,col1) != -1)
{
return false;
}
}
return true;
}
//Pao
bool Board::canMovePao(int moveid, int killid, int row, int col)
{
GetRowCol(row1,col1,moveid);
int ret = getStoneCountAtLine(row,col,row1,col1);
if(killid != -1)
{
if(ret == 1)
{
return true;
}
}
else
{
if(ret == 0)
{
return true;
}
}
return false;
}
//Bing
bool Board::canMoveBing(int moveid, int, int row, int col)
{