五子棋设计与实现
作者:CC周兵价_667 | 来源:互联网 | 2023-09-16 11:01
1、数据结构记录每步棋,可以建立链表用来进行悔棋、后退(本程序没有实现)structStep{intx,y;棋子坐标intball;表示下子方{BLACK,WHITE}};记
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;
}
推荐阅读
-
在尝试加载支持推送通知的iOS应用程序的Ad Hoc构建时,遇到了‘no valid aps-environment entitlement found for application’的错误提示。本文将探讨此错误的原因及多种可能的解决方案。 ...
[详细]
蜡笔小新 2024-11-21 19:26:31
-
本文详细介绍了 `org.apache.tinkerpop.gremlin.structure.VertexProperty` 类中的 `key()` 方法,并提供了多个实际应用的代码示例。通过这些示例,读者可以更好地理解该方法在图数据库操作中的具体用途。 ...
[详细]
蜡笔小新 2024-11-21 17:38:10
-
-
publicclassBindActionextendsActionSupport{privateStringproString;privateStringcitString; ...
[详细]
蜡笔小新 2024-11-21 16:25:41
-
本文介绍了如何通过C#语言调用动态链接库(DLL)中的函数来实现IC卡的基本操作,包括初始化设备、设置密码模式、获取设备状态等,并详细展示了将TextBox中的数据写入IC卡的具体实现方法。 ...
[详细]
蜡笔小新 2024-11-21 11:02:19
-
spring boot使用jetty无法启动 ...
[详细]
蜡笔小新 2024-11-21 10:15:52
-
c语言二元插值,二维线性插值c语言 ...
[详细]
蜡笔小新 2024-11-20 12:20:16
-
本文详细介绍了如何在循环双链表的指定位置插入新元素的方法,包括必要的步骤和代码示例。 ...
[详细]
蜡笔小新 2024-11-20 06:48:26
-
线程中通信在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取& ...
[详细]
蜡笔小新 2024-11-18 14:56:11
-
开发心得:利用 Redis 构建分布式系统的轻量级协调机制 ...
[详细]
蜡笔小新 2024-10-29 07:37:33
-
本书基于Redis 3.0版本编写,虽然与后续版本存在一些差异,但仍详细介绍了Redis服务器的一对多客户端连接机制。书中不仅涵盖了基本的安装配置和命令操作,还深入探讨了数据结构、持久化策略及性能优化等高级主题,适合初学者和进阶用户参考学习。 ...
[详细]
蜡笔小新 2024-10-26 12:01:45
-
本文详细介绍如何使用MySQL数据库进行环境搭建,包括创建数据库表并插入示例数据。随后,逐步指导如何配置Maven项目,整合Spring框架与MyBatis,实现高效的数据访问。 ...
[详细]
蜡笔小新 2024-11-21 18:39:23
-
本文介绍了一种使用SQL Server存储过程来实现基于单一条件的高效分页查询的方法。通过示例代码,详细说明了如何构建和执行这种分页查询。 ...
[详细]
蜡笔小新 2024-11-21 17:23:20
-
nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ...
[详细]
蜡笔小新 2024-11-21 16:03:49
-
本文深入探讨了逻辑回归在机器学习中的应用,并详细解释了如何通过正则化等方法来有效避免模型的过拟合问题。 ...
[详细]
蜡笔小新 2024-11-21 15:22:20
-
PHPSeckill是一个基于PHP、Lua和Redis构建的高效分布式秒杀系统。该项目利用php_apcu扩展优化性能,实现了高并发环境下的秒杀功能。系统设计充分考虑了分布式架构的可扩展性和稳定性,适用于大规模用户同时访问的场景。项目代码已开源,可在Gitee平台上获取。 ...
[详细]
蜡笔小新 2024-10-30 12:16:19
-