vc c语言 五子棋,VC实现五子棋游戏的一个算法示例
本文讲述了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实现五子棋游戏的一个算法示例相关推荐
- C语言实现井字棋游戏(含算法优化)
目录 序言 代码1 小结 算法优化 代码2 总结 序言 井字棋 英文名叫Tic-Tac-Toe 想必大家对这个小游戏都不陌生了 无论是小时候课堂上被画的全是"井"字的草稿纸 还是长 ...
- c语言字符笛卡尔积,JavaScript笛卡尔积超简单实现算法示例
本文实例讲述了JavaScript笛卡尔积超简单实现算法.分享给大家供大家参考,具体如下: JS笛卡尔积算法 function cartesianProductOf() { return Array. ...
- c 语言奇数幻方代码,【C】——幻方算法(示例代码)
一.幻方按照阶数可分成了三类,即奇数阶幻方.双偶阶幻方.单偶阶幻方. 二.奇数阶幻方(劳伯法) 奇数阶幻方最经典的填法是罗伯法.填写的方法是: 把1(或最小的数)放在第一行正中:按以下规律排列剩下的( ...
- 简单五子棋游戏c语言简单,C语言制作简单的五子棋游戏
原标题:C语言制作简单的五子棋游戏 C语言制作简单的五子棋游戏 学习C语言的人很多,但是用C语言很少,而用来为自己所用,来做游戏的人就更少了,很多人都是跟着学校学习,学校讲到哪就坐到哪,但是以后却还是 ...
- c语言课程设计作业五子棋,C语言课程设计之五子棋小游戏.doc
C语言课程设计之五子棋小游戏.doc C语言课程设计 题目名称:五子棋小游戏 氺氺木木木 专 业计算机类 班 级 *班 指导教师J22 编写日期2016.05.26 目录 TOC \o "1 ...
- C语言简单五子棋两人/五子棋人机
对于初学C语言的同学,五子棋不可谓不是一个好的练习.我们不但要考虑玩家及电脑的落子,还要考虑棋盘是否已满.是否有一方已经获得胜利.因此我们要考虑好各种情况,设定好函数及循环. 下面是两人五子棋的简单代 ...
- c语言五子棋源代码vc6,五子棋源码实验报告及人机对战说明.docx
1. 五子棋对战说明 2. 实验报告 3. 源代码 五 子 棋 作品特点:C 语言程序 五子棋 作品功能:五子棋人机对战,人人对战. 目录:1 五子棋介绍. 五子棋棋型介绍. 人人对战的实现. 电脑下 ...
- C语言三子棋,五子棋,n子棋的代码实现
C语言三子棋,五子棋,n子棋的代码实现 这里以五子棋为例,来说明开发过程 开发思路 菜单打印 棋盘的打印 棋子的打印 电脑下棋(随机数) 判断输赢 代码整合 注意事项 这里以五子棋为例,来说明开发过程 ...
- 五子棋html游戏代码与算法介绍
五子棋html游戏代码与算法介绍 运行图片 目录路径 五子棋.html 五子棋算法 进行下一个游戏的开发! 注意事项 我会把html文件.css文件提供下载地址,文件夹路径也展示给大家.但是图片就没法 ...
最新文章
- pygame的字体画不出来_5毛钱的圆珠笔画的?每一幅都是大师之作,网友:为何我画不出来...
- 易邮邮箱服务器的安装和配置
- 维基链(WICC)当前币值应该还远远没有达到它本身应有的高度
- 第4章 类型基础 -- 4.1 所有类型都从System.Object派生
- elasticsearch mapping之fields
- 【算法系列之一】二叉树最小深度
- 点击list view中一行内容可以在combox中显示_java版飞机大战小游戏详细教程(零基础小白也可以分分钟学会!)...
- 从零开始学前端:字符串和数组的方法 --- 今天你学习了吗?(JS:Day10)
- 毕设日志5.12凌晨
- opencv对图像是软解码_基于opencv和c++的图像处理软件设计与实现(26页)-原创力文档...
- Tomcat部署到CentOS7
- 二哥杂货铺matlab安装步骤,Matlab2017a软件安装教程
- Java—计算长方体、四棱锥的表面积和体积
- Legion:基于Haskell开发的极简区块链服务器
- 思科路由器的介绍及实战
- MAMP(win) Apache启动失败__句柄无效。 : master_main: create child process failed. Exiting.
- Java中的Date时间转换【SimpleDateFormat (parse和format)】和Calendar日历表
- git commit时的几种指令
- 用Javascript实现回到顶部效果
- 作为一个食品专业的本科生 我对我们专业是彻底失望了[转帖]