浅析基本AI五子棋算法
五子棋是所有棋类博弈中比较简单的了,这里介绍的也只是一种非常基本的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五子棋算法的更多相关文章
- 人机ai五子棋 ——五子棋AI算法之Java实现
人机ai五子棋 下载:chess.jar (可直接运行) 源码:https://github.com/xcr1234/chess 其实机器博弈最重要的就是打分,分数也就是权重,把棋子下到分数大的地方, ...
- AI五子棋需求规格说明书
AI-Gobang AI五子棋小程序 github地址:https://github.com/holidaysss/AI-Gobang 程序简介 AlphaGo Zero在世界舞台上取得的巨大成功体现 ...
- 贝叶斯公式由浅入深大讲解—AI基础算法入门
1 贝叶斯方法 长久以来,人们对一件事情发生或不发生的概率,只有固定的0和1,即要么发生,要么不发生,从来不会去考虑某件事情发生的概率有多大,不发生的概率又是多大.而且概率虽然未知,但最起码是一个确定 ...
- 贝叶斯公式由浅入深大讲解—AI基础算法入门【转】
本文转载自:https://www.cnblogs.com/zhoulujun/p/8893393.html 1 贝叶斯方法 长久以来,人们对一件事情发生或不发生的概率,只有固定的0和1,即要么发生, ...
- 2018科大讯飞AI营销算法大赛全面来袭,等你来战!
AI技术已成为推动营销迭代的重要驱动力.AI营销高速发展的同时,积累了海量的广告数据和用户数据.如何有效应用这些数据,是大数据技术落地营销领域的关键,也是检测智能营销平台竞争力的标准. 讯飞AI营销云 ...
- 实践案例丨基于ModelArts AI市场算法MobileNet_v2实现花卉分类
概述 MobileNetsV2是基于一个流线型的架构,它使用深度可分离的卷积来构建轻量级的深层神经网,此模型基于 MobileNetV2: Inverted Residuals and Linear ...
- 五子棋 AI(AIpha-beta算法)
博弈树 下过五子棋的人都应该知道,越厉害的人,对棋面的预测程度越深.换句话讲,就是当你下完一步棋,我就能在我的脑海里假设把我所有可能下的地方都下一遍,然后考虑我下完之后你又会下在哪里,最后我根据每次预 ...
- AI大厂算法测试心得:人脸识别关键指标有哪些?
仅仅在几年前,程序员要开发一款人脸识别应用,就必须精通算法的编写.但现在,随着成熟算法的对外开放,越来越多开发者只需专注于开发垂直行业的产品即可. 由调查机构发布的<中国AI产业地图研究> ...
- AI xavier算法
xavier算法 参考链接: http://proceedings.mlr.press/v9/glorot10a/glorot10a.pdf
随机推荐
- jQuery使用.on()无法绑定hover
发现好像没有hover这个事件,jQuery的hover事件是一个封装,hover算不得一个事件.他只是将mouseover和mouseout合并了用mouseover和mouseout两个配合效果好 ...
- Theano2.1.5-基础知识之打印出theano的图
来自:http://deeplearning.net/software/theano/tutorial/printing_drawing.html Printing/Drawing Theano gr ...
- Realm Java的学习、应用、总结
从React Native珠三角沙龙会议了解到Realm这个开源库,然后开始学习.理解和使用Realm.Realm是跨平台.支持多种主流语言,这里主要是对Realm Java结合实际项目的一些情况进行 ...
- 微信公众平台SDK
微信公众平台网址:https://mp.weixin.qq.com/ 服务号说明:给企业和组织提供更强大的业务服务与用户管理能力,帮助企业快速实现全新的公众号服务平台. .NETSDK: Loogn. ...
- TextBoxFor控件的扩展---Bootstrap在mvc上的应用
TextBoxFor控件的问题: 1:自带了样式,再用bootstrap样式会有冲突. 2:要加水印,js事件,限制输入长度比较麻烦. 因此需要对textboxfor控件进行扩展. 目标: 1:能使用 ...
- Nginx的配置文件
#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #erro ...
- SQL语言概述
功能概述 DDL,数据库定义语言,创建,修改,删除数据库,表,视图,索引,约束条件等 DML,数据库操纵语言,对数据库中的数据进行增,删,改,查 DCL,数据库定义语言,对数据库总数据的访问设置权限 ...
- hihocoder 1260
之前做过的oj, acm题目忘了很多了, 又要开始要刷题了, go on! #1260 : String Problem I 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描 ...
- 61-umask 简明笔记
设定在创建文件时的权限掩码 umask [mask] 参数 mask可以是3位八进制数或者是如同在chmod中使用的符号值,mask指定不允许的权限(文件的实际权限是777减去umask值) 如果没有 ...
- 1014mysqldumpslow.pl简单分析慢日志 WINDOW平台
转自http://www.th7.cn/db/mysql/201507/113998.shtml 要想运行mysqldumpslow.pl(这是perl程序),下载perl编译器.下载地址:http: ...