本文讲述了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. pygame的字体画不出来_5毛钱的圆珠笔画的?每一幅都是大师之作,网友:为何我画不出来...
  2. 易邮邮箱服务器的安装和配置
  3. 维基链(WICC)当前币值应该还远远没有达到它本身应有的高度
  4. 第4章 类型基础 -- 4.1 所有类型都从System.Object派生
  5. elasticsearch mapping之fields
  6. 【算法系列之一】二叉树最小深度
  7. 点击list view中一行内容可以在combox中显示_java版飞机大战小游戏详细教程(零基础小白也可以分分钟学会!)...
  8. 从零开始学前端:字符串和数组的方法 --- 今天你学习了吗?(JS:Day10)
  9. 毕设日志5.12凌晨
  10. opencv对图像是软解码_基于opencv和c++的图像处理软件设计与实现(26页)-原创力文档...
  11. Tomcat部署到CentOS7
  12. 二哥杂货铺matlab安装步骤,Matlab2017a软件安装教程
  13. Java—计算长方体、四棱锥的表面积和体积
  14. Legion:基于Haskell开发的极简区块链服务器
  15. 思科路由器的介绍及实战
  16. MAMP(win) Apache启动失败__句柄无效。 : master_main: create child process failed. Exiting.
  17. Java中的Date时间转换【SimpleDateFormat (parse和format)】和Calendar日历表
  18. git commit时的几种指令
  19. 用Javascript实现回到顶部效果
  20. 作为一个食品专业的本科生 我对我们专业是彻底失望了[转帖]

热门文章

  1. python二维列表互换行列值
  2. 快捷指令 自动刷新网页 脚本
  3. 计算机网络实验:UDP套接字编程
  4. gradle依赖子project的指定flavor
  5. Js获取域名地址并截取
  6. 走近 JSON Schema
  7. 代谢组学喜讯|百趣生物与金域医学达成代谢组学战略合作
  8. 线程的4种创建方式及区别
  9. mysql 创建数据库 原则_MySQL数据库建立原则
  10. Spring Boot 如何正确读取配置文件属性