QT象棋暗棋游戏(一)

学习目标:

程序使用C/S架构
(1)MFC/Qt编程实现server程序象棋界面;
(2)编程实现server端暗棋的初始化随机排布。(32个棋子正面往下排布在象棋的上一半);
(3)编程实现server本地端的鼠标点击依次实现黑红棋子的翻明、移动、吃子,实现双人手动下棋;
(4)编程实现自动判别走棋的合法性;
60分起评
(5)编程实现自动判别盘面输赢或者和棋;
70分起评
(6)编程实现server端的agent,实现本地人机、机机下棋;
80分起评
(7)编程实现client程序(console程序),与server端实时通信获取当前棋面信息,发送走下一步棋的棋面信息。(数据量不大,直接发送全部棋面数据,邻接矩阵)
(8)编程实现server端的异步交互机制和下棋先后手的顺序机制;
(9)在client中添加agent,实现两个agent同时连接对抗下棋,或者1个agent连接与server端的agent进行对抗。


学习内容:

提示:这里可以添加要学的内容
例如:
1、 搭建 Java 开发环境
2、 掌握 Java 基本语法
3、 掌握条件语句
4、 掌握循环语句


学习时间:

2020 09 02-2020 09 06

学习产出:

1.完成棋盘的制作 2.完成棋子的初始化以及随机排布

**

代码部分

chessQT,pro文件

HEADERS += \				
    Stone.h \
    Board.h


SOURCES += \
    Board.cpp \
    main.cpp

QT += widgets gui


Board.h文件

#ifndef BOARD_H
#define BOARD_H

#include <QWidget>
#include"Stone.h"

class Board : public QWidget
{
    Q_OBJECT
public:
    explicit Board(QWidget *parent = 0);

    Stone _s[32];
    int _r;//棋子半径

    //返回棋盘对应的窗口坐标
    QPoint center(int row,int col);
    QPoint center(int id);

    void drawStone(QPainter &painter,int id);   //给棋子上色
    void paintEvent(QPaintEvent *);             //画棋盘

signals:

public slots:
};

#endif // BOARD_H

Stone.h文件

#ifndef STONE_H
#define STONE_H
#include<QString>
#include<ctime>
#include<cstdlib>

class Stone
{
public:
    Stone(){}
    ~Stone(){}

    enum TYPE {JIANG,CHE,MA,PAO,SHI,BING,XIANG};

    int _row;
    int _col;
    int _id;
    int test[32];
    int i=0;
    bool _dead;//存活是false,死亡是true
    bool _red;
    bool _side;
    TYPE _type;//正面是false,背面是true

    void init(int id)
    {
        for(int i0=0;i0<32;i0++)
        {test[i0]=100;}

        srand((int)time(0));
        for(;i<32;i++)
        {
           test[i]=(rand()%4*10+rand()%8);
            for(int i2=0;i2<i;i2++)
                if(test[i]==test[i2])
                {
                    i--;
                    break;
                }

        }

        struct {
            int row, col;
            Stone::TYPE type;
        } pos[32] = {
        {test[0]/10,test[0]%10, Stone::CHE},
        {test[1]/10,test[1]%10, Stone::MA},
        {test[2]/10,test[2]%10, Stone::XIANG},
        {test[3]/10,test[3]%10, Stone::SHI},
        {test[4]/10,test[4]%10, Stone::JIANG},
        {test[5]/10,test[5]%10, Stone::SHI},
        {test[6]/10,test[6]%10, Stone::XIANG},
        {test[7]/10,test[7]%10, Stone::MA},
        {test[8]/10,test[8]%10, Stone::CHE},
        {test[9]/10,test[9]%10, Stone::PAO},
        {test[10]/10,test[10]%10, Stone::PAO},
        {test[11]/10,test[11]%10, Stone::BING},
        {test[12]/10,test[12]%10, Stone::BING},
        {test[13]/10,test[13]%10, Stone::BING},
        {test[14]/10,test[14]%10, Stone::BING},
        {test[15]/10,test[15]%10, Stone::BING},
        {test[16]/10,test[16]%10, Stone::CHE},
        {test[17]/10,test[17]%10, Stone::MA},
        {test[18]/10,test[18]%10, Stone::XIANG},
        {test[19]/10,test[19]%10, Stone::SHI},
        {test[20]/10,test[20]%10, Stone::JIANG},
        {test[21]/10,test[21]%10, Stone::SHI},
        {test[22]/10,test[22]%10, Stone::XIANG},
        {test[23]/10,test[23]%10, Stone::MA},
        {test[24]/10,test[24]%10, Stone::CHE},
        {test[25]/10,test[25]%10, Stone::PAO},
        {test[26]/10,test[26]%10, Stone::PAO},
        {test[27]/10,test[27]%10, Stone::BING},
        {test[28]/10,test[28]%10, Stone::BING},
        {test[29]/10,test[29]%10, Stone::BING},
        {test[30]/10,test[30]%10, Stone::BING},
        {test[31]/10,test[31]%10, Stone::BING},
        };


            _row=pos[id].row;
            _col=pos[id].col;
            _type=pos[id].type;


        _id=id;
        _dead=false;
        _red=id<16;
        _side=false;


    }

    QString getText()
    {
        switch(this->_type)
        {
        case CHE:
            return "车";
        case MA:
            return "马";
        case PAO:
            return "炮";
        case BING:
            return "兵";
        case JIANG:
            return "将";
        case SHI:
            return "士";
        case XIANG:
            return "相";
        }
        return "错误";
    }

};

#endif // STONE_H

Board.cpp文件

#include "Board.h"
#include<QPainter>

Board::Board(QWidget *parent) : QWidget(parent)   //Board构造函数
{
    for(int i=0;i<32;i++)
    {
        _s[i].init(i);//对每个棋子进行位置、颜色、死亡、是否翻面的初始化
    }
}
void Board::paintEvent(QPaintEvent*)      //画棋盘和棋子
{
    QPainter painter(this);

    int d=40;  //棋子直径
    _r=d/2;

    for(int i=1;i<=10;i++)  //画十条横线
    {
        painter.drawLine(QPoint(d,i*d),QPoint(9*d,i*d));
    }

    for(int i=1;i<=9;i++)   //画九条竖线
    {
        if(i==1||i==9)
            painter.drawLine(QPoint(d*i,d),QPoint(i*d,10*d));
        else
        {
            painter.drawLine(QPoint(d*i,d),QPoint(i*d,5*d));
            painter.drawLine(QPoint(d*i,6*d),QPoint(i*d,10*d));
        }
    }

    painter.drawLine(QPoint(d*4,d),QPoint(6*d,3*d));    //画九宫格
    painter.drawLine(QPoint(d*6,d),QPoint(4*d,3*d));
    painter.drawLine(QPoint(d*4,10*d),QPoint(6*d,8*d));
    painter.drawLine(QPoint(d*6,10*d),QPoint(4*d,8*d));


    for(int i=0;i<32;i++)   //画32个棋子
    {
        drawStone(painter,i);
    }
}

QPoint Board::center(int row,int col)
{
    QPoint ret;
    ret.rx()=(col+1.5)*(_r)*2;
    ret.ry()=(row+1.5)*(_r)*2;
    return ret;
}
QPoint Board::center(int id)
{
    return center(_s[id]._row,_s[id]._col);
}

void Board::drawStone(QPainter &painter,int id)     //给每个棋子写字上色
{
    QPoint c=center(id);
    QRect rect=QRect(c.rx()-(_r),c.ry()-(_r),(_r)*2,(_r)*2);

    painter.setBrush(QBrush(QColor(255,255,0)));   //棋子背景颜色
    painter.setPen(Qt::black);  //画黑色矩形框以承载字体

    if(_s[id]._red)
        painter.setPen(Qt::red);  //将黑色矩形框换为红色矩形框

    painter.setFont(QFont("system", _r, 700));  //字体

    painter.drawEllipse(center(id),_r,_r);
    painter.drawText(rect,_s[id].getText(),QTextOption(Qt::AlignCenter));
}

main文件

#include <QApplication>
#include"Board.h"

int main(int argc, char* argv[])
{
    QApplication app(argc,argv);
    Board board;
    board.show();
    return app.exec();
}

猜你喜欢

转载自blog.csdn.net/RobinWitch/article/details/108428596