第17篇 Qt实现简单五子棋游戏(一)文档说明

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();

进行一些提示。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大唐不良猿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值