QT5.9学习笔记之中国象棋暗棋游戏(三)

上一节我们用图片棋盘美化,这一节我们开始绘制棋盘,以及设计棋子类,并且可以用绘图和图片两种方式显示棋盘和棋子,代码效果如下:
图片模式下效果:
在这里插入图片描述
绘图模式下效果:
在这里插入图片描述

#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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酒与花生米

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值