学习目标:
程序使用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进行对抗。
学习时间:
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();
}