游戏规则

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

项目运行状况

20201019172422525.jpg

20201019172449478.jpg

20201019172625679.jpg

20201019172724844.jpg

主要函数描述

函数名称函数功能
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思考的主要函数,判断落子点时,该函数需要计算我方和对方的棋盘权值最大值,再找到两者最大权值的位置,作为落子点。

总体设计思路流程图

20201019172044699.jpg

主要函数流程图

一、人和AI落子函数

20200928223811274.jpg

二、 判断游戏是否结束函数

20200928223828903.jpg

三、 机机对战函数

20200928223839701.jpg