Qt实现六子棋游戏
游戏规则
1. 默认先手者为黑棋方,对峙双方谁的六个棋子先连在一条线即为胜者。
2. 当有四个子连成一条直线时,就应采取防守,堵住四子的一端,否则就会输掉比赛。
3. 应当避免在比赛内出现四四禁手、五五禁手等情况,否则就会不小心输掉比赛。
已实现的功能
1. Qt编程实现server程序六子棋游戏界面,20*20格子;
2. 编程实现server本地端的鼠标点击依次放置黑白棋子,实现双人手动下棋;
3. 编程实现自动判别下棋的合法性;
4. 编程实现自动判别盘面输赢或者和棋;
5. 编程实现实现本地人机下棋;
6. 编程实现本地机机下棋;
7. 开始游戏有背景音乐;点击按钮或落下棋子时,有声效;加入按钮点击特效。
8. 设计选项,可选择开启/关闭禁手。
开发平台
所使用的开发环境:Windows10 + Qt 5.9.2 + C++语言环境
项目地址
作者Github主页:https://github.com/Nuyoah-xlh
项目仓库:https://github.com/Nuyoah-xlh/QT-Connec6
项目运行状况
主要函数描述
| 函数名称 | 函数功能 |
|---|---|
| void MainWindow::paintEvent(QPaintEvent *); | 绘图函数:绘制棋盘、根据实时情况绘制黑棋子和白棋子、添加棋盘背景图片、实现部分按钮特效 |
| void MainWindow::mouseReleaseEvent(QMouseEvent *event); | 鼠标点击函数:如果是双人模式,则每次点击棋盘时,该函数调用playByPerson()进行人下棋;如果是人机模式,每次点击时,该函数被调用,根据情况调用playByPerson()人下棋playByAI()进行AI下棋;同时更新界面 |
| void MainWindow::mouseMoveEvent(QMouseEvent *event); | 鼠标移动函数:鼠标移动到按钮处时,显示按钮;获取鼠标的当前坐标值,并计算距离最近的可落子的点;并更新界面; |
| void MainWindow::isEnd(); | 判断游戏是否结束函数:分别调用函数bool Game::isWin(int clickX,int clickY)、bool Game::isHeQi()、bool Game::isJinShou(int x,int y)判断是否六子连珠、是否和棋、是否禁手,从而判断游戏是否结束,并做相应处理; |
| bool Game::isWin(int clickX,int clickY); | 判断输赢函数:判断是否因发生任意一方六子连珠导致游戏结束; |
| bool Game::isHeQi(); | 判断和棋函数:判断是否棋子占满棋盘仍未结束游戏,即为和棋; |
| bool Game::isJinShou(int x,int y); | 判断禁手函数:判断先手一方的落子点是否是禁手点;若是,则结束游戏,先手方败; |
| void Game::getScore(); | 计分函数:分别对黑棋子方、白棋子方的落子情况进行计分,最后取最大计分值,并存入计分数组score |
总体思路
1. 设计绘图函数paintEvent(QPaintEvent * ),绘制出20 * 20棋盘,并添加背景图片,使用UI界面添加三个按钮,分别作为人人对战、人机对战、机机对战的开始按钮;
2. 设计鼠标移动处理函数:mouseMoveEvent(QMouseEvent * event),记录下鼠标位置;设计鼠标点击处理函数mouseReleaseEvent(QMouseEvent * event),根据情况将该点击位置存储到预先设定的棋盘二维数组board中,再通过步骤 1 的绘图函数绘制出相应棋盘布局情况;
3. 设计判断游戏是否结束的函数isEnd(),该函数通过调用isWin()、isHeQi()、isJinShou()三个函数分别判断是否六子连珠、是否和棋、是否黑子方禁手,从而判断游戏是否结束,并做出相应处理;至此,双人模式即算完成;
4. 设计人机模式,首先构造AI思考函数,通过getScore()函数获得AI的最大分值位置,计入棋盘积分数组,考虑每次人点击棋盘下棋后,AI经过一定延迟时间,在最大计分位置落子;即可构思人机模式;
5. 考虑机机模式,通过设计定时器,启动游戏后,定时器启动,每隔一定间隔时间,AI双方轮流调用AI思考函数,找到各自的权值最大的位置落子,从而实现AI对决的模式。
6. 每次人或AI落下棋子时,调用QSound::play()函数发出特效;初始默认按钮透明,当鼠标在按钮上方时,按钮恢复不透明。
计分函数void Game::getScore()权值设定
| 类型 | 分值 |
|---|---|
| 活五 | +=60 0000 |
| 死五 | +=50 0000 |
| 活四 | +=40 0000 |
| 死四 | +=25 0000 |
| 活三 | +=30 0000 |
| 死三 | +=15 0000 |
| 活二 | +=20 0000 |
| 死二 | +=10 0000 |
| 单棋 | +=2000 |
| 其他 | +=1000 |
优先级顺序:活五>>死五>>活四>>活三>>死四>>活二>>死三>>死二>>其他
活五:指已有五子连成一条线,且两端有两个位置可以落子;
死五:指已有五子连成一条线,且两端只有一个位置可以落子。
其他情况类推。
该函数为AI思考的主要函数,判断落子点时,该函数需要计算我方和对方的棋盘权值最大值,再找到两者最大权值的位置,作为落子点。
总体设计思路流程图
主要函数流程图
一、人和AI落子函数
二、 判断游戏是否结束函数
三、 机机对战函数













.jpg)


