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