第17篇 Qt实现简单五子棋(一)文档说明
作者:互联网
第17篇 Qt实现简单五子棋(一)文档说明
- 1.需求分析
- 2.棋子类Chess设计
- 3.棋盘类ChessBoard设计
- 4.系统(界面)类Interface设计
- 4.1属性
- 4.2.方法
- 4.2.1.初始化界面属性:void initData();
- 4.2.2.界面布局函数: void mySetlayout();
- 4.2.3.初始化棋盘:void initChessboard();
- 4.2.4.画画事件响应: void paintEvent(QPaintEvent*);
- 4.2.5.画棋盘: void drawChessboard();
- 4.2.6.画棋子:void drawChess();
- 4.2.7.鼠标点击响应:void mousePressEvent(QMouseEvent* mevent);
- 4.2.8.处理棋子:void handleChess(int current_x,int current_y);
- 4.2.9.判断是否赢了:bool isWin(int x,int y,int chesscolor);
- 4.2.10.获取电脑落子位置:bool getLocation(int& x,int& y,int chesscolor);
- 4.2.11.拦截:bool centreIntercept(int& x,int& y,int max,int color);
- 4.2.12.破解三角阵:bool breakTriangle(int &x,int &y,int color);
- 4.2.13.九宫格:bool jiuGongge(int& x,int& y,int no_color);
- 4.3.槽函数
- 4.3.1.编辑:void on_button_edit();
- 4.3.2.记录:void on_button_record();
- 4.3.3. 悔棋:on_button_regretchess();
- 4.3.4.开始:void on_button_begin();
- 4.3.5.帮助:void on_button_help();
1.需求分析
实现五子棋基本功能。
1.1.人机对战
能够实现人机对战,人机可以拦截尾部、头部的连子,阻止玩家的胜利,可以自己判断合适的落子位置,如自己五缺一时,就可以加上,而不是盲目落子。
1.2.双人对战
双人对战是最简单的。
1.3.判断输赢
系统可在落子后通过当前棋子的位置,去判断当前选手是否已经胜利。
1.4.获取人机落子位置
划分好获取人机获取位置的优先级,按照一定顺序去检索落子位置,尽量使得人机落子位置最优解。
1.5.破解三角阵
人机能够在一定程度上破解三角阵。
1.6.悔棋功能
能够悔棋,除了玩家悔棋,还可以使电脑悔棋。
1.7.其他说明
使用面向对象方法,棋子为一类、棋盘为一类、还有系统(界面)类。
2.棋子类Chess设计
2.1.属性
位置:int x;int y;
颜色:int color;//白棋为1,黑棋为2
宽度:static int width;
高度:static int height;
2.2.方法
设置属性:void setInfo(int x,int y, int color);
获取属性:QString getInfo();
设置位置:void setLocation(int x,int y);
获取位置:Qpoint getLocation();
设置颜色:void setColor(int color);
获取颜色:int getColor();
设置x:void setX(int x);
获取x:int getX();
设置y:void setY(int y);
获取y:int getY();
3.棋盘类ChessBoard设计
3.1.属性
行:int row;
列:int col;
起点位置:int start_x,int start_y;
棋子存储:Chess chessStore[];
位置记录:int positionRecord[][];
棋子数量:int chessCount;
棋子间距:int lineSpace;
3.2.方法
设置行:void setRow(int row);
设置列:void setCol(int col);
获取行:int getRow();
获取列:int getCol();
设置起点x:void setStart_x(int start_x);
设置起点y:void setStart_y(int start_y);
获取起点x:int getStart_x();
获取起点y:int getStart_y();
添加棋子:void addChess(Chess chess);
删减棋子:Chess subChess();
设置默认位置棋子颜色:void markLocationColor(int color);
设置固定位置棋子颜色:void markLocationColor(int x,int y,int color);
获取默认位置棋子颜色:int getLocationColor();
获取固定位置起点颜色:int getLocationColor(int x,int y);
获取人机目标位置x:int getLocation_x();
获取人机目标位置y:int getLocation_y();
设置棋子个数:void setChessCount(int count);
获取棋子个数:int getChessCount();
设置棋盘线间隔:void setLineSpace(int lineSpace);
获取棋盘线间隔:int getLineSpace();
初始化棋子存储数组:void initChessStore(int length);
初始化棋盘位置表示:void initPositionRecord(int row,int col);
4.系统(界面)类Interface设计
4.1属性
4.1.1.界面属性
五个QLabel:分别为
QLabel* label_headportrait;//头像
QLabel* label_petname;//昵称
QLabel* label_set;//性别
QLabel* label_titlenumber;//称号
QLabel* label_fieldnumber;//场数
QPushButton* button_edit;//编辑
QPushButton* button_record;//记录
QPushButton* button_regretchess;//悔棋
QPushButton* button_begin;//开始
QPushButton* button_help;//帮助
QLabel* label_chessboard;
QLineEdit* edit_contestants;//选手
QGroupBox* group_model;//模式
QRadioButton* radio_manmachine;//人机
QRadioButton* radio_double;//双人
QGroupBox* group_successivehand;//先后手
QRadioButton* radio_offensiveposition;//先手
QRadioButton* radio_defensiveposition;//后手
QGroupBox* group_chesssquare;//棋方
QRadioButton* radio_black;//黑棋
QRadioButton* radio_white;//白棋
4.1.2.功能属性
ChessBoard chessBoard;//棋盘
QPainter painter;//画家
bool isblack;//判断是否为黑棋
bool iswin;//判断是否有一方胜利
bool isplayer;//判断是否为玩家操作
//用于判断是否该拦截
int start_x;
int start_y;
int end_x;
int end_y;
4.2.方法
4.2.1.初始化界面属性:void initData();
分配空间,关联槽函数。
4.2.2.界面布局函数: void mySetlayout();
把按钮放到一定位置。
4.2.3.初始化棋盘:void initChessboard();
设置棋盘的相关属性。
4.2.4.画画事件响应: void paintEvent(QPaintEvent*);
绘制棋子和棋盘,界面背景等。
4.2.5.画棋盘: void drawChessboard();
绘制棋盘横线、竖线。
4.2.6.画棋子:void drawChess();
绘制棋子。
4.2.7.鼠标点击响应:void mousePressEvent(QMouseEvent* mevent);
获取点击位置,计算最近的落子点,判断是否可落子,可落子则落入棋子,否则退出,若为人机模式,且玩家已经落子,则获取人机落子位置,每次落子后判断输赢。
4.2.8.处理棋子:void handleChess(int current_x,int current_y);
把棋子添加到指定数组中,并标记棋盘对应位置为已经落子。
4.2.9.判断是否赢了:bool isWin(int x,int y,int chesscolor);
从四个方向判断是否有五子连串,即以当前位置为出发点,若南-北、东-西、西北-东南、西南-东北,这四个方向有一个或多个存在五子连串,则判为赢。
4.2.10.获取电脑落子位置:bool getLocation(int& x,int& y,int chesscolor);
按优先级获取最佳落子位置。
//优先级1--------五缺一
//优先级2--------对手五缺一
//优先级3--------四缺一
//优先级4--------对手四缺一
//优先级5--------三角阵
//优先级6--------对手三角阵
//优先级7--------三缺一
//优先级8--------九宫格
//优先级9-------随机
4.2.11.拦截:bool centreIntercept(int& x,int& y,int max,int color);
拦截头部或尾部或者中间位置,用于阻止或者进攻。
4.2.11.1.判断是否拦截:bool interceptJudgment(int max);
南北走向检索:bool centreIntercept_SN(int x,int y,int max,int color);
东西走向检索:bool centreIntercept_EW(int x,int y,int max,int color);
西南东北走向检索:bool centreIntercept_WS_EN(int x,int y,int max,int color);
东南西北走向检索:bool centreIntercept_ES_WN(int x,int y,int max,int color);
4.2.12.破解三角阵:bool breakTriangle(int &x,int &y,int color);
南北走向检索:void breakTriangle_SN(int x, int y, int& count, int color);
东西走向检索:void breakTriangle_EW(int x, int y, int& count, int color);
西南东北走向检索:void breakTriangle_WN_WS(int x, int y, int& count, int color);
东南西北走向检索:void breakTriangle_EN_ES(int x, int y, int& count, int color);
4.2.13.九宫格:bool jiuGongge(int& x,int& y,int no_color);
以某一颗棋子为中心,判断四周是否可以落子,并有落子最佳位置。
4.3.槽函数
4.3.1.编辑:void on_button_edit();
对个人信息进行编辑。
4.3.2.记录:void on_button_record();
记录对战信息。
4.3.3. 悔棋:on_button_regretchess();
撤销棋子。
4.3.4.开始:void on_button_begin();
开始新游戏。
4.3.5.帮助:void on_button_help();
进行一些提示。
标签:Qt,17,4.2,int,void,五子棋,color,棋子,落子 来源: https://blog.csdn.net/weixin_49188222/article/details/120261419