五子棋是所有棋类博弈中比较简单的了,这里介绍的也只是一种非常基本的AI策略。其实,包括之前的AI贪吃蛇,感觉这两个AI其实体现的都是一种建模思想,把一个现实中的问题模型化,抽象化,得到其一般特征,再设计数据结构及算法。

  首先,要意识到一件事情,我们可以用一个三维数组记录所有的获胜局势,比如

  

  再如:

  

  这种获胜局势是有限可数的,所以,AI的关键一步就是得到这个三维数组:

 //统计所有可能的赢法,需要好好理解
for (var i = 0; i < 15; i++){
for (var j = 0; j < 11; j++){
for (var k = 0; k < 5; k++){
wins[i][j+k][count] = true;
}
count++;
}
}
for (var i = 0; i < 11; i++){
for (var j = 0; j < 15; j++){
for (var k = 0; k < 5; k++){
wins[i+k][j][count] = true;
}
count++;
}
}
for (var i = 0; i < 11; i++){
for (var j = 0; j < 11; j++){
for (var k = 0; k < 5; k++){
wins[i+k][j+k][count] = true;
}
count++;
}
}
for (var i = 0; i < 11; i++){
for (var j = 14; j > 3; j--){
for (var k = 0; k < 5; k++){
wins[i+k][j-k][count] = true;
}
count++;
}
}
//共 572 赢法

  现在,关键是如何利用这个三维数组,其实很多机器博弈其实就是在打分,再把棋子下到分高(或分低)的地方,比如以下红色位置,如果没有棋子,应该 给一个较高分,因为在下一个白棋子就赢了,但是如果下了一个黑棋子,那么,上面的第一种赢法无论如何也不可能了,所以直接设置为零分。所以在设置两个一位数组,记录每种赢法的得分,再查找棋盘上哪些位置可以实现这种赢法,给这些位置加分,最后从所有位置中,找出分最高的落子即可。而且,一种赢法上的落子越多,就越接近获胜,所以分数应该越高。

     for (var i = 0; i < 15; i++){
for (var j = 0; j < 15; j++){
if (0 == chessBoard[i][j]){//no chessman
for (var k = 0; k <count; k++){
if (wins[i][j][k]){
if (1 == myWin[k]){
myScore[i][j] += 200;
} else if (2 == myWin[k]){
myScore[i][j] += 400;
} else if (3 == myWin[k]){
myScore[i][j] += 2000;
} else if (4 == myWin[k]){
myScore[i][j] += 10000;
}
if (1 == computerWin[k]){
computerScore[i][j] += 320;
} else if (2 == computerWin[k]){
computerScore[i][j] += 420;
} else if (3 == computerWin[k]){
computerScore[i][j] += 4200;
} else if (4 == computerWin[k]){
computerScore[i][j] += 20000;
}
}
}
if (myScore[i][j] > max){
max = myScore[i][j];
u = i;
v = j;
} else if (myScore[i][j] == max){
if (computerScore[i][j] > computerScore[u][v]){
u = i;
v = j;
}
}
if (computerScore [i][j] > max){
max = computerScore[i][j];
u = i;
v = j;
} else if (computerScore[i][j] == max){
if (myScore[i][j] > myScore[u][v]){
u = i;
v = j;
}
}
}
}

  最后,只需要统计每落子一次是否有一方赢了即可,这里谈及了AI核心思想,其他部分比如判断胜负,交替落子等逻辑可以找到很多学习资料。

  总结,AI看似高大上,但是其实际是对实际问题的高度抽象、模型化以及大量计算(正是计算机的优势)。如果能缜密地设计好编码思路,那么效率就会很高,比如昨天写的贪吃蛇,很多情况没想到,所以总是陷入困境,当代码量增加,逻辑结构变的复杂时,一定要事先规划,或者说,设计模式。自己要突破目前的瓶颈期可能要学习一下这方面的东西了!!!

  此外,还利用Hbuilder生成了APP,首先是自己这么想了,然后还真找到办法实现了,所以创意,眼界,技术,同样重要。

  

  

完整代码点这里

  小记。

浅析基本AI五子棋算法的更多相关文章

  1. 人机ai五子棋 ——五子棋AI算法之Java实现

    人机ai五子棋 下载:chess.jar (可直接运行) 源码:https://github.com/xcr1234/chess 其实机器博弈最重要的就是打分,分数也就是权重,把棋子下到分数大的地方, ...

  2. AI五子棋需求规格说明书

    AI-Gobang AI五子棋小程序 github地址:https://github.com/holidaysss/AI-Gobang 程序简介 AlphaGo Zero在世界舞台上取得的巨大成功体现 ...

  3. 贝叶斯公式由浅入深大讲解—AI基础算法入门

    1 贝叶斯方法 长久以来,人们对一件事情发生或不发生的概率,只有固定的0和1,即要么发生,要么不发生,从来不会去考虑某件事情发生的概率有多大,不发生的概率又是多大.而且概率虽然未知,但最起码是一个确定 ...

  4. 贝叶斯公式由浅入深大讲解—AI基础算法入门【转】

    本文转载自:https://www.cnblogs.com/zhoulujun/p/8893393.html 1 贝叶斯方法 长久以来,人们对一件事情发生或不发生的概率,只有固定的0和1,即要么发生, ...

  5. 2018科大讯飞AI营销算法大赛全面来袭,等你来战!

    AI技术已成为推动营销迭代的重要驱动力.AI营销高速发展的同时,积累了海量的广告数据和用户数据.如何有效应用这些数据,是大数据技术落地营销领域的关键,也是检测智能营销平台竞争力的标准. 讯飞AI营销云 ...

  6. 实践案例丨基于ModelArts AI市场算法MobileNet_v2实现花卉分类

    概述 MobileNetsV2是基于一个流线型的架构,它使用深度可分离的卷积来构建轻量级的深层神经网,此模型基于 MobileNetV2: Inverted Residuals and Linear ...

  7. 五子棋 AI(AIpha-beta算法)

    博弈树 下过五子棋的人都应该知道,越厉害的人,对棋面的预测程度越深.换句话讲,就是当你下完一步棋,我就能在我的脑海里假设把我所有可能下的地方都下一遍,然后考虑我下完之后你又会下在哪里,最后我根据每次预 ...

  8. AI大厂算法测试心得:人脸识别关键指标有哪些?

    仅仅在几年前,程序员要开发一款人脸识别应用,就必须精通算法的编写.但现在,随着成熟算法的对外开放,越来越多开发者只需专注于开发垂直行业的产品即可. 由调查机构发布的<中国AI产业地图研究> ...

  9. AI xavier算法

    xavier算法 参考链接: http://proceedings.mlr.press/v9/glorot10a/glorot10a.pdf

随机推荐

  1. "org.jboss.netty.internal.LoggerConfigurator".DESCRIBED is already registered 的解决办法

    今天在jboss 6.2 EAP上部署一个项目时,报以下错误: org.jboss.msc.service.DuplicateServiceException: Service jboss.pojo. ...

  2. Java7并发编程实战(一) 线程的中断

    控制线程中断的方法一般常规是定义一个布尔值,然后while(布尔值) 去执行,当想停止该线程时候,把布尔值设为false. 这里我们来看第二种,Interrupt 该例子模拟一个线程从1打印到10,然 ...

  3. Android -- 桌面悬浮,QQ管家火箭实现

    续上一篇博客<Android -- 桌面悬浮,仿360>,传送门:http://www.cnblogs.com/yydcdut/p/3909888.html,在此代码上继续添加实现. 比起 ...

  4. 【分布式协调】之理解paxos

    感叹一下 不得不说近几年国内软件行业发生了巨大的变化,之前几乎所有应用都围绕桌面展开,而近几年很多让人神魂颠倒的关键词一个接一个的映入眼帘:web2.0.移动应用.云计算.大数据.互联网的浪潮一波接着 ...

  5. Linux进程间通信之信号量

    春节过去了,真的过去一年了.在公司待了快一年了.2016希望自己变得越来越好. ps:上面那句话是年前写的,中间隔了那么久,自己也变懒了. 一.信号量 1,信号量本质是一个计数器,控制访问共享资源的最 ...

  6. 清空KindEditor富文本编辑器里面的内容方法

    //清空KindEditorKindEditor.instances[0].html(""); 0表示第一个KindEditor编辑器对象 详情见链接:http://www.new ...

  7. 别名现象,java对象之间的相互赋值

    请看一下代码 import java.util.*; class book{ static  int c = null; } public static void main(String[] args ...

  8. RabbitMQ官方中文入门教程(PHP版) 第三部分:发布/订阅(Publish/Subscribe)

    发布/订阅 在上篇教程中,我们搭建了一个工作队列.每个任务之分发给一个工作者(worker).在本篇教程中,我们要做的之前完全不一样——分发一个消息给多个消费者(consumers).这种模式被称为“ ...

  9. Android 全屏显示的方法(不包含状态栏)

    我们都知道在Android中某些功能的实现往往有两种方法:一种是在xml文件中设置相应属性,另一种是用代码实现.同样Android实现全屏显示也可以通过这两种方法实现: 1.在AndroidManif ...

  10. linux基础-第十一单元 系统监控

    第十一单元 系统监控 系统监视和进程控制工具-top和free top命令的功能 TOP是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序 ...