300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 【附源码/完整教程】如何使用C语言打造人机对战版五子棋?

【附源码/完整教程】如何使用C语言打造人机对战版五子棋?

时间:2019-11-16 20:29:13

相关推荐

【附源码/完整教程】如何使用C语言打造人机对战版五子棋?

1.项目分析

2.项目目标

AI的基础应用算法的设计和实现C语言的图形界面程序开发

3.项目准备

VS/VC++(任意版本)easyx图形库(直接双击即可安装)领取素材(图片、音效)传送门

4.创建项目

创建空项目。把素材拷贝到项目目录下

5.画棋盘

画棋盘,播放开局提示、播放背景音乐

6.画棋子

鼠标点击后,在点击位置画棋子

效果:

黑色区域,透明背景的PNG图片显示不了。

解决方案:

导入工具库tools.h, tools.cpp修改代码

效果:

修改

看上去,很完美,但是有一个严重的BUG

当不在交叉点准确点击时,就会出现以上情况。

解决方案:

需要判断这个点击是否是合法未知的点击,并允许一定的偏差

7.判断有效的点击

定义数据模型

因为点击时,要判断是否在已经有棋子的位置上点击(不能在已经落子的位置点击)

所以需要定义一个数据模型,来表示当前的所有棋子数据。

【模块化开发思想】

创建ChessData.h, 并把main.cpp中的与围棋相关的全局数据,剪贴到ChessData.h中

ChessData.h

在main.cpp中添加围棋数据变量game

初始化数据模型

ChessData.h

ChessData.cpp

main.cpp

判断有效点击

判断原理

先计算出绿点,然后分别计算出3个黑点位置,计算当前位置离4个点的位置。

如果小于阈值(POS_OFFSET),就认为选择了哪个点。

在main.cpp中添加变量,存储有效点击的位置

判断是否是有效点击,如果是有效点击,返回true并把结果保存到全局变量clickPosRow、clickPosCol;

ChessData.h

实现有效点击

测试效果:

8.优化项目架构

封装画棋子的代码在ChessData.h中添加棋子类型在main.cpp封装“落子”代码落子

2.优化项目架构

9.更新游戏数据

人(黑方)落子后,还没有修改底层的游戏数据。

在ChessDatat.h添加接口:

在ChessData.cpp中添加实现。

应用更新:

10.实现AI走棋

五子棋入门

连2

活3

死3

活4

死4

连5(赢)

AI走棋原理

计算每个合法的落子点的“权值”,然后再权值最大的点落子

以后,可以在这个基础之上,实现多个层次的计算.

对于每个空白点,分别计算周围的八个方向

因为在计算某个方向时,正向和反向需同时考虑,所以实际上只需计算4个方向即可:

如果黑棋走这个点

如果白棋AI走这个点

计算各点的“权值”

权值的计算,放在ChessData模块中。

ChessData.h

ChessData.cpp

AI思考落子点

在各落子点,找到分值最大的点。如果有多个分值相同的点,直接在其中取一个随机点。

在ChesssData模块实现。

ChessData.h

ChessData.cpp

实现AI落子

11判断棋局是否结束

在ChessData模块定义判断输赢的接口

原理分析:

在4个方向上搜索。

以右下方向为例:(黑色棋子表示刚下的棋子)

从当前棋子开始,向右下方数5个

从当前棋子的左上角开始,向右下方数5个

从当前棋子的左上第2个开始,向右下方数5个

从当前棋子的左上第3个开始,向右下方数5个

从当前棋子的左上第4个开始,向右下方数5个

ChessData.h

ChessData.cpp

调用AI接口

main.cpp

显示分数

在胜利窗口,或者失败窗口中,显示分数。

main.cpp

更新分数

ChessData.cpp

12.项目迭代

服务器端业务开发。

3.AI迭代

使用搜索树,提高算度。

C语言C++编程学习交流圈子,QQ群:1021486511【】

整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)

欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!

编程学习资料分享:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。