本文讲述了VC实现五子棋游戏的一个算法示例,该算法采用极大极小剪枝博弈算法,感兴趣的读者可以对程序中不完善的部分进行修改与完善。

该设计主要包括:数据结构、估值函数、胜负判断、搜索算法

程序运行界面如下:

具体实现步骤如下:

1、数据结构

//记录每步棋,可以建立链表用来进行悔棋、后退(本程序没有实现)

struct Step

{

int x,y; //棋子坐标

int ball; //表示下子方{BLACK,WHITE}

};

//记录棋盘情况,用于搜索过程

class CBoardSituation

{

public:

int nArrBoard[15][15]; //棋盘情况

struct Step machineStep; //AI所下的那一步

long value; //盘面所打的分数

};

//当前棋盘,用于棋盘显示

int nArrBoard[15][15];

2、估值函数

分析当前棋盘上黑白双方棋型:五连、活四、冲四、双活三、单活三、眠三、活二、眠二,然后根据五子棋规则给棋盘打分,

具体分值可以根据经验自己确定。本程序中:五连=9999(极值),活四=9990,冲四=9980,双活三=9970,多活三加2000,

单活三加200,每个眠三加10,每个活二加4,每个眠二加1。其中打分时还要根据当前下棋方情况进行打分。

3、胜负判断

这个比较简单,根据最后落子情况从水平、垂直、左斜、右斜四个方向检查是否存在五个连续棋子即可。

4、搜索算法

算法采用极大极小值博弈算法,它的主要思想为:预测后N步下棋情况,对预测的后N个棋盘进行打分。轮到自己下棋时选分值最大的,轮到对方下时选分值最小的。选出我们认为最优的作为下一步走法。本程序算法基本思想如下(算法语言表示):

void DFAI()

{

long value=-MAXINT; //对初始根节点的value赋值

CBoardSituation currentBoard;

//获取当前机器新棋面情况

for(int i=0;i<15;i++)

for(int j=0;j<15;j++)

currentBoard.nArrBoard[i][j]=nArrBoard[i][j];

currentBoard.machineStep.ball=ComputerBall;

currentBoard.machineStep.x=gnRow;

currentBoard.machineStep.y=gnColumn;

currentBoard.value=Eveluate(currentBoard.nArrBoard,BLACK);

//选取几个最好的下法(贪婪法)-->CountList;

GetSeveralGoodPlace(¤tBoard,WHITE);

CountList.RemoveAll();

POSITION pos=templist.GetHeadPosition();

for(int j=0;j {

CountList.AddTail(templist.GetNext(pos));

}

pos=CountList.GetHeadPosition();

CBoardSituation *pBoard;

//对这些盘面做进一步深度搜索

for(i=0;i {

pBoard= &(CountList.GetNext(pos));

pBoard->value=Search(pBoard,BLACK,value,0);

value=Select(value,pBoard->value,WHITE); //找出最大的分值

}

//回到链表头

pos=CountList.GetHeadPosition();

for(i=0;i {

pBoard= &(CountList.GetNext(pos));

if (value==pBoard->value) //找出得到最高分的盘面

{

value=pBoard->value;

gnRow=pBoard->machineStep.x;

gnColumn=pBoard->machineStep.y;

bPlayerDo=TRUE; //当前下子方改为人

break;

}

}

//其他处理

}

其中Search()函数如下:

//算法搜索函数

long Search(CBoardSituation *board,int mode,long &oldvalue, int depth)

{

CList m_DeepList;

long value;

if(depthnArrBoard,mode))<8000)

{

value=(mode==WHITE)?-MAXINT:MAXINT;

//选择几个最好的搜索目标

GetSeveralGoodPlace(board,mode);

POSITION pos=templist.GetHeadPosition();

for(int j=0;j {

m_DeepList.AddTail(templist.GetNext(pos));

}

pos=m_DeepList.GetHeadPosition();

CBoardSituation successorBoard;

for(int i=0;i {

successorBoard= m_DeepList.GetNext(pos);

//是否进行继续深度搜索(剪枝):极大极小值法

if((mode==WHITE && value<=oldvalue) || (mode==BLACK && value>=oldvalue))

{

if(mode==WHITE)

value=Select(value,Search(&successorBoard,BLACK,value,depth+1),WHITE);

else//mode==BLACK

value=Select(value,Search(&successorBoard,WHITE,value,depth+1),BLACK);

}

}

return value;

}

else//搜索结束条件

{

return Eveluate(board->nArrBoard,mode);//棋面打分

}

return 0;

}

vc c语言 五子棋,VC实现五子棋游戏的一个算法示例相关推荐

  1. C语言实现井字棋游戏(含算法优化)

    目录 序言 代码1 小结 算法优化 代码2 总结 序言 井字棋 英文名叫Tic-Tac-Toe 想必大家对这个小游戏都不陌生了 无论是小时候课堂上被画的全是"井"字的草稿纸 还是长 ...

  2. c语言字符笛卡尔积,JavaScript笛卡尔积超简单实现算法示例

    本文实例讲述了JavaScript笛卡尔积超简单实现算法.分享给大家供大家参考,具体如下: JS笛卡尔积算法 function cartesianProductOf() { return Array. ...

  3. c 语言奇数幻方代码,【C】——幻方算法(示例代码)

    一.幻方按照阶数可分成了三类,即奇数阶幻方.双偶阶幻方.单偶阶幻方. 二.奇数阶幻方(劳伯法) 奇数阶幻方最经典的填法是罗伯法.填写的方法是: 把1(或最小的数)放在第一行正中:按以下规律排列剩下的( ...

  4. 简单五子棋游戏c语言简单,C语言制作简单的五子棋游戏

    原标题:C语言制作简单的五子棋游戏 C语言制作简单的五子棋游戏 学习C语言的人很多,但是用C语言很少,而用来为自己所用,来做游戏的人就更少了,很多人都是跟着学校学习,学校讲到哪就坐到哪,但是以后却还是 ...

  5. c语言课程设计作业五子棋,C语言课程设计之五子棋小游戏.doc

    C语言课程设计之五子棋小游戏.doc C语言课程设计 题目名称:五子棋小游戏 氺氺木木木 专 业计算机类 班 级 *班 指导教师J22 编写日期2016.05.26 目录 TOC \o "1 ...

  6. C语言简单五子棋两人/五子棋人机

    对于初学C语言的同学,五子棋不可谓不是一个好的练习.我们不但要考虑玩家及电脑的落子,还要考虑棋盘是否已满.是否有一方已经获得胜利.因此我们要考虑好各种情况,设定好函数及循环. 下面是两人五子棋的简单代 ...

  7. c语言五子棋源代码vc6,五子棋源码实验报告及人机对战说明.docx

    1. 五子棋对战说明 2. 实验报告 3. 源代码 五 子 棋 作品特点:C 语言程序 五子棋 作品功能:五子棋人机对战,人人对战. 目录:1 五子棋介绍. 五子棋棋型介绍. 人人对战的实现. 电脑下 ...

  8. C语言三子棋,五子棋,n子棋的代码实现

    C语言三子棋,五子棋,n子棋的代码实现 这里以五子棋为例,来说明开发过程 开发思路 菜单打印 棋盘的打印 棋子的打印 电脑下棋(随机数) 判断输赢 代码整合 注意事项 这里以五子棋为例,来说明开发过程 ...

  9. 五子棋html游戏代码与算法介绍

    五子棋html游戏代码与算法介绍 运行图片 目录路径 五子棋.html 五子棋算法 进行下一个游戏的开发! 注意事项 我会把html文件.css文件提供下载地址,文件夹路径也展示给大家.但是图片就没法 ...

最新文章

  1. 【蓝桥java】递归基础之输出连续数字
  2. 汇编LAHF指令学习 - 使用emu8086
  3. linux删除文件后,空间未释放的一种情况,使用lsof查看
  4. 推荐算法炼丹笔记:Deep Bayesian的多目标推荐
  5. 洛谷P4389:付公主的背包(多项式、生成函数)
  6. Linux 系统关于应该把程序安装在目录 /usr 还是目录 /usr/local 下的思考
  7. 编写函数实现随机产生指定范围的整数的功能
  8. [CB] 支付宝区块链的应用- 区块链发票医保理赔.
  9. oracle job放在哪里,oracle在job的使用有关问题
  10. Python中List,tuple,Dictionary之间的区别
  11. Android多媒体功能开发(7)——使用SoundPool类播放音频
  12. 智慧城市的顶层设计与底层对接
  13. MSM8953 Android9.0 配置USB2.0 Camera
  14. 计算机技术中采用二进制,计算机中采用二进制编码的原因是什么
  15. echart添加文本_ECharts自定义富文本
  16. Python链家租房信息爬虫
  17. android studio logcat 字体,android studio - 修改logcat颜色字体
  18. kotterKnife+dagger2+otto+okhttp+picasso+retrofit+rxjava示例项目,使用kotlin编写。
  19. 相机响应曲线、ISO详解
  20. qlib平台实现可转债“双低”策略

热门文章

  1. 2023系统分析师-文老师资料必备知识点
  2. 使用Git命令-查看远程分支、本地分支、创建分支、删除分支的方法
  3. IRIS65双模蓝牙5.2热插拔PCB
  4. Laravel 主题模板功能扩展包, 这可能是我用过最优雅的 Laravel 主题扩展插件了
  5. Python面向对象的三大特征
  6. 图像质量评价及色彩处理
  7. Spring MVC面试常问
  8. 2017年大数据十大发展趋势
  9. linux riot密码,在Linux系统上安装Riot的方法
  10. java内聚 耦合_图解高内聚与低耦合,傻瓜都能看懂!