《中国象棋开发》QT

QT使用QApplication 抽象了QT的应用程序;QWidgt抽象窗口;exec()函数 进入消息循环,等待用户输入;QPainter绘图部分:void MyWidge::paintEvent(QPaintEvent *){ //绘制类,参数:绘制对象 //绘制打印机、绘制图画、拷屏 QPainter painter(this);//this代指这个...
摘要由CSDN通过智能技术生成

QT使用学习

QApplication 抽象了QT的应用程序;
QWidgt抽象窗口;
exec()函数 进入消息循环,等待用户输入;

QPainter绘图部分:

void MyWidge::paintEvent(QPaintEvent *)
{
   
    //绘制类,参数:绘制对象
    //绘制打印机、绘制图画、拷屏
    QPainter painter(this);//this代指这个类

    painter.setPen(QColor(255,0,0));//设置线条的颜色,外延

    painter.setBrush(QBrush(QColor(255,0,255)));//设置填涂的颜色,封闭图形

    painter.drawLine(QPoint(0,0),QPoint(100,100));//在某两点之间画直线

    painter.drawText(200,200,"Hello");//在某位置输入文本

    painter.drawEllipse(QPoint(200,300),50,50);//在某位置画椭圆,需要输入两个方向的半径
}

鼠标事件(需要和绘图结合)

void MyWidge::paintEvent(QPaintEvent *)
{
   
    //绘制类,参数:绘制对象
    //绘制打印机、绘制图画、拷屏
    QPainter painter(this);//this代指这个类
# if 0
    painter.setPen(QColor(255,0,0));

    painter.setBrush(QBrush(QColor(255,0,255)));

    painter.drawLine(QPoint(0,0),QPoint(100,100));

    painter.drawText(200,200,"Hello");

    painter.drawEllipse(QPoint(200,300),50,50);
# endif
    painter.drawEllipse(_ptClick,30,30);//点击的位置效果
}
void MyWidge::mousePressEvent(QMouseEvent *ev)//前置声明
{
   
    //得到鼠标点击的地方
    _ptClick = ev -> pos();
    update();//强制程序重新绘制界面


}

按钮设置

MyWidge::MyWidge(QWidget *parent) : QWidget(parent)
{
   
    _button = new QPushButton("button",this);//名字和this指针
    //_button -> show();可省
}

象棋程序

ChessBY.pro

HEADERS += \
    Board.h \
    Stone.h \
    MainWnd.h \
    CtrlPanel.h \
    Step.h \
    ChooseDlg.h \
    SingleGame.h \
    MultiGame.h \
    NetGame.h

SOURCES += \
    Board.cpp \
    main.cpp \
    Stone.cpp \
    MainWnd.cpp \
    CtrlPanel.cpp \
    Step.cpp \
    ChooseDlg.cpp \
    SingleGame.cpp \
    MultiGame.cpp \
    NetGame.cpp

QT += widgets gui network  //QT图形界面

main.cpp

#include <QApplication>
#include "ChooseDlg.h"
#include "MainWnd.h"
#include <QTime>
int main(int argc, char* argv[])
{
   
    QApplication app(argc, argv);

    QTime t = QTime::currentTime();
    qsrand(t.msec()+t.second()*1000);

    ChooseDlg dlg; //选择框
    if(dlg.exec() != QDialog::Accepted)
        return 0;

    MainWnd wnd(dlg._selected);//根据选择框的选择创建主窗体
    wnd.show();




    return app.exec();
}

(之后,函数定义在cpp文件中,类成员变量 和类成员函数声明在h文件中)

选择框部分

chooseDlg.cpp

创建四个按钮并根据选择进入哪个窗口;

#include "ChooseDlg.h"
#include <QVBoxLayout>

ChooseDlg::ChooseDlg(QWidget *parent) : QDialog(parent)
{
   
    QVBoxLayout* lay = new QVBoxLayout(this);
    lay->addWidget(_buttons[0] = new QPushButton("人机对战"));
    lay->addWidget(_buttons[1] = new QPushButton("人人对战"));
    lay->addWidget(_buttons[2] = new QPushButton("网络对战(服务端)"));
    lay->addWidget(_buttons[3] = new QPushButton("网络对战(客户端)"));

    for(int i=0; i<4; ++i)
    {
   
        connect(_buttons[i], SIGNAL(clicked()), this, SLOT(slotClicked()));
    }
}

void ChooseDlg::slotClicked()
{
   
    QObject* s = sender();
    for(int i=0; i<4; ++i)
    {
   
        if(_buttons[i] == s)
        {
   
            this->_selected = i;
            break;
        }
    }
    accept();
}

ChooseDlg::~ChooseDlg()
{
   

}


ChooseDig.h

#ifndef ChooseDlg_H
#define ChooseDlg_H

#include <QDialog>
#include <QPushButton>

class ChooseDlg : public QDialog
{
   
    Q_OBJECT
public:
    explicit ChooseDlg(QWidget *parent = 0);
    ~ChooseDlg();

    QPushButton* _buttons[4];
    int _selected;//成员变量,决定是哪个选择
signals:

public slots:
    void slotClicked();
};

#endif // ChooseDlg_H

主窗体部分

MainWind.cpp

#include "MainWnd.h"
#include <QHBoxLayout>
#include "SingleGame.h"
#include "MultiGame.h"
#include "NetGame.h"

MainWnd::MainWnd(int gameType, QWidget *parent) : QWidget(parent)
{
   
    _gameType = gameType;

    if(_gameType == 0)//人机对战
    {
   
        SingleGame* game = new SingleGame;
        CtrlPanel* panel = new CtrlPanel;

        QHBoxLayout* hLay = new QHBoxLayout(this);
        hLay->addWidget(game, 1);
        hLay->addWidget(panel);
        connect(panel, SIGNAL(sigBack()), game, SLOT(slotBack()));
    }
    else if(_gameType == 1)//人人对战
    {
   
        MultiGame* game = new MultiGame;
        CtrlPanel* panel = new CtrlPanel;

        QHBoxLayout* hLay = new QHBoxLayout(this);
        hLay->addWidget(game, 1);
        hLay->addWidget(panel);
        connect(panel, SIGNAL(sigBack()), game, SLOT(slotBack()));
    }
    else if(_gameType == 2)//网络对战(服务端)
    {
   
        NetGame* game = new NetGame(true);
        CtrlPanel* panel = new CtrlPanel;

        QHBoxLayout* hLay = new QHBoxLayout(this);
        hLay->addWidget(game, 1);
        hLay->addWidget(panel);
        connect(panel, SIGNAL(sigBack()), game, SLOT(slotBack()));
    }
    else if(_gameType == 3)//网络对战(客户端)
    {
   
        NetGame* game = new NetGame(false);
        CtrlPanel* panel = new CtrlPanel;

        QHBoxLayout* hLay = new QHBoxLayout(this);
        hLay->addWidget(game, 1);
        hLay->addWidget(panel);
        connect(panel, SIGNAL(sigBack()), game, SLOT(slotBack()));
    }
}

MainWnd::~MainWnd()
{
   

}


MainWind.h

#ifndef MAINWND_H
#define MAINWND_H

#include <QWidget>
#include "Board.h"
#include "CtrlPanel.h"

class MainWnd : public QWidget
{
   
    Q_OBJECT
public:
    explicit MainWnd(int gameType, QWidget *parent = 0);//gameType就是_selected
    ~MainWnd();

    int _gameType;

signals:

public slots:
};

#endif // MAINWND_H

棋盘(核心)

Board.cpp

#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) : QFrame(parent)
{
   
    this->_r = 20; //棋子半径长度为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; //被选中的棋子id,默认为-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); //定义painter对象
    
    p.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);

    p.save();
    drawPlate(p); //绘制棋盘线
    p.restore();

    p.save();
    drawPlace(p);
    p.restore();

    p.save();
    drawInitPosition(p);
    p.restore();

    p.save();
    drawStone(p);//绘制棋子
    p.restore();
}

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;
}
绘制棋子,参数有绘画对象(引用,因为要改变这个对象的值,不能用引用)以及棋子对应的id
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(Qt::gray);//被选中则灰色
    else p.setBrush(Qt::yellow); //否则是黄色

    p.drawEllipse(cell(id));//圆心就是该id的行和列
	
	//设置字体
    p.setFont(QFont("system", _r*1.2, 700));//设置大小和粗度
    p.drawText(cell(id), name(id), QTextOption(Qt::AlignCenter)); //name是stone里的名字函数,第三个参数对齐方式是中间对齐u
}

QString Board::name(int id
  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业设计是高等教育阶段学生在完成学业前所进行的一项重要学术任务,旨在检验学生通过学习所获得的知识、技能以及对特定领域的深刻理解能力。这项任务通常要求学生运用所学专业知识,通过独立研究和创新,完成一个实际问题的解决方案或者开展一项有价值的项目。 首先,毕业设计的选择通常由学生根据个人兴趣、专业方向以及实际需求来确定。学生需要在导师的指导下明确研究目标、问题陈述,确立研究的范围和深度。毕业设计可以包括文献综述、需求分析、方案设计、实施与测试等多个阶段,以确保整个过程的科学性和系统性。 其次,毕业设计的完成通常需要学生具备一定的独立思考和解决问题的能力。在研究过程中,学生可能需要采用各种研究方法,如实验、调查、案例分析等,以获取必要的数据和信息。通过这些活动,学生能够培养扎实的专业技能,提升解决实际问题的实际能力。 第三,毕业设计的撰写是整个过程的重要组成部分。学生需要将研究过程、方法、结果以及结论等详细记录在毕业论文中,以展示其研究的全貌和成果。同时,撰写毕业设计还有助于提高学生的学术写作水平,培养清晰、逻辑的表达能力。 最后,毕业设计的评价通常由导师和相关专业人士进行。评价标准包括研究的创新性、实用性、方法的科学性以及论文的质量等方面。学生在毕业设计中获得的成绩也将直接影响其最终的学业成绩和学位授予。 总的来说,毕业设计是高等教育中的一项重要环节,通过此过程,学生不仅能够巩固所学知识,还能培养独立思考和解决问题的能力,为将来的职业发展奠定坚实的基础。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值