上一节我们用图片棋盘美化,这一节我们开始绘制棋盘,以及设计棋子类,并且可以用绘图和图片两种方式显示棋盘和棋子,代码效果如下:
图片模式下效果:
绘图模式下效果:
#ifndef BOARD_H
#define BOARD_H
#include <QMainWindow>
#include <QPainter>
#include "chess.h"
class Board : public QMainWindow
{
Q_OBJECT
public:
//chess m_chess;
enum MODE{IMAGE,DRAW};
public:
Board(QWidget *parent = 0);
~Board();
MODE m_mode; //设置显示模式
int m_chesssize; //棋子大小
int m_firstpoint;//第一点坐标
chess m_chess[4][8];
public:
void paintEvent(QPaintEvent *);
void InitBoard(QPainter &painter);//初始化绘制棋盘
void SetBackGroud();//设置背景
void DrawAllChess(QPainter &painter);//初始化棋子
void DrawChess(QPainter &painter,chess &chess,int &i,int &j);
void ImageChess(QPainter &painter,chess &chess,int &i,int &j);
QPoint Center(int row,int col); //计算坐标
};
#endif // BOARD_H
#include "board.h"
Board::Board(QWidget *parent)
: QMainWindow(parent)
{
this->m_mode=Board::DRAW; //切换显示方式
this->m_chesssize=120;
this->m_firstpoint=40;
}
Board::~Board()
{
}
void Board::paintEvent(QPaintEvent *)
{
画棋盘 开始///
QPainter painter(this);
this->SetBackGroud();
this->InitBoard(painter);
this->DrawAllChess(painter);
}
//背景
void Board::SetBackGroud(){
int &firstpoint=this->m_firstpoint; //设置第一点边距
int &chesssize=this->m_chesssize; //设置棋子大小
//固定窗口大小
this->setMaximumSize(2*firstpoint+8*chesssize,2*firstpoint+4*chesssize); //设置窗口大小
this->setMinimumSize(2*firstpoint+8*chesssize,2*firstpoint+4*chesssize); //设置窗口大小
QPixmap bg(":/image/bg.jpg");
QPalette pal;
switch (this->m_mode) {
case IMAGE:
//设置背景图片
pal.setBrush(QPalette::Window,QBrush(bg));
this->setPalette(pal);
break;
case DRAW:
/
//设置背景颜色
pal.setColor(QPalette::Background,QColor(255,255,255));
this->setPalette(pal);
break;
default:
break;
}
}
//棋盘
void Board::InitBoard(QPainter &painter){
画棋盘 开始///
QPen pen;
pen.setWidth(3);
painter.setPen(pen);
//init
int &firstpoint=this->m_firstpoint; //设置第一点边距
int &chesssize=this->m_chesssize; //设置棋子大小
//绘制棋盘
for(int i=0;i<5;i++) //画5条横线
{
painter.drawLine(QPoint(firstpoint,firstpoint+i*chesssize)
,QPoint(firstpoint+chesssize*8,firstpoint+chesssize*i));
}
for(int i=0;i<9;i++) //画9条竖线
{
painter.drawLine(QPoint(firstpoint+chesssize*i,firstpoint)
,QPoint(firstpoint+i*chesssize,firstpoint+chesssize*4));
}
画棋盘 结束///
}
//棋子
void Board::DrawAllChess(QPainter &painter){
画棋子 开始///
chess chess[4][8]=this->m_chess;
for(int i=0;i<4;i++){
for(int j=0;j<8;j++)
{
switch (this->m_mode){
case DRAW:
this->DrawChess(painter,chess[i][j],i,j);
break;
case IMAGE:
this->ImageChess(painter,chess[i][j],i,j);
break;
default:
break;
}
}
}
}
//图片棋子
void Board::ImageChess(QPainter &painter,chess &chess,int &i,int &j){
/
switch (chess.GetState()) {
case chess::DOWN:
{
QImage image(":/image/chessbg.png");
QPoint point=this->Center(i,j);
QRect rect(point,QSize(120,120));
painter.drawImage(rect,image);
break;
}
case chess::LIVE:
{
QImage image(chess.GetImageName());
QPoint point=this->Center(i,j);
QRect rect(point,QSize(120,120));
painter.drawImage(rect,image);
break;
}
default:
break;
}
}
//绘图棋子
void Board::DrawChess(QPainter &painter,chess &chess,int &i,int &j)
{
switch (chess.GetState()){
case chess::DOWN:
{
QPoint point=this->Center(i,j);
QRect rect(point,QSize(120,120));
QBrush brush;
brush.setColor(QColor(244,244,181));
brush.setStyle(Qt::SolidPattern);
painter.setBrush(brush);
painter.drawEllipse(rect);
break;
}
case chess::LIVE:
{
if(chess.GetColor()==chess::RED){
painter.setPen(Qt::red);
}else{
painter.setPen(Qt::black);
}
QPoint point=this->Center(i,j);
QRect rect(point,QSize(120,120));
QBrush brush;
brush.setColor(QColor(244,244,181));
brush.setStyle(Qt::SolidPattern);
painter.setBrush(brush);
painter.drawEllipse(rect);
int size=this->m_chesssize;
int x=point.x();
int y=point.y();
painter.setFont(QFont("楷体", size/2, size)); //字体
QRect textrect(x,y,size,size);
painter.drawText(textrect,chess.GetTextName(),QTextOption(Qt::AlignCenter));
break;
}
default:
break;
}
}
QPoint Board::Center(int row,int col)
{
int &firstpoint=this->m_firstpoint;
int &chesssize=this->m_chesssize;
QPoint point(0,0);
point.setX(firstpoint+chesssize*col);
point.setY(firstpoint+chesssize*row);
return point;
}
#ifndef CHESS_H
#define CHESS_H
#include <QString>
#include <QPoint>
class chess
{
public:
enum NAME {BING=1,PAO,CHE,MA,XIANG,SHI,SHUAI };
enum STATE{LIVE=1,DEAD,DOWN};
enum COLOR{RED=1,BLACK};
//状态
NAME m_name;
STATE m_state;
COLOR m_color;
//QPoint m_rcpoint;
public:
chess(){
this->m_name =BING;
this->m_state=LIVE;
this->m_color=RED;
}
void SetName(NAME name)
{
this->m_name=name;
}
NAME GetName(){
return this->m_name;
}
void SetState(STATE states)
{
this->m_state=states;
}
STATE GetState(){
return this->m_state;
}
void SetColor(COLOR color){
this->m_color=color;
}
COLOR GetColor(){
return this->m_color;
}
QString GetImageName()
{
if(this->m_color==RED){
switch (this->m_name) {
case CHE:
return ":/image/che_red.png";
case MA:
return ":/image/ma_red.png";
case PAO:
return ":/image/pao_red.png";
case BING:
return ":/image/bing_red.png";
case SHUAI:
return ":/image/shuai_red.png";
case SHI:
return ":/image/shi_red.png";
case XIANG:
return ":/image/xiang_red.png";
default:
return ":/image/bg.jpg";
}
}else{
switch(this->m_name)
{
case CHE:
return ":/image/che_black.png";
case MA:
return ":/image/ma_black.png";
case PAO:
return ":/image/pao_black.png";
case BING:
return ":/image/bing_black.png";
case SHUAI:
return ":/image/shuai_black.png";
case SHI:
return ":/image/shi_black.png";
case XIANG:
return ":/image/xiang_black.png";
default:
return ":/image/bg.jpg";
}
}
}
QString GetTextName()
{
if(this->m_color==RED){
switch (this->m_name) {
case CHE:
return "俥";
case MA:
return "傌";
case PAO:
return "炮";
case BING:
return "兵";
case SHUAI:
return "帥";
case SHI:
return "仕";
case XIANG:
return "相";
default:
return "错误";
}
}else{
switch(this->m_name)
{
case CHE:
return "車";
case MA:
return "馬";
case PAO:
return "砲";
case BING:
return "卒";
case SHUAI:
return "將";
case SHI:
return "士";
case XIANG:
return "象";
default:
return "错误";
}
}
}
};
#endif // CHESS_H