简易五子棋AI权值法(2)
简易五子棋&AI权值法(2)
权值法
权值法实现AI,就是给每个无子的地方给一个权值,然后选出权值最大的让电脑落子。
具体到每个位置,权值根据周围一定范围的落子情况给出。
就我的想法来说,我觉得这个某一个位置的“一定范围”,如果细究的话应该是全盘所有其他位置,也就是说无论距离这个位置的远近,或者有无落子,都会对这个位置产生影响。
比如:
● _ _ _ _ _ _ _ _ _ ★☆
(_代表无子,○代表玩家的执子,●代表电脑的执子,后同)
当要计算★位置的权值的时候,要不要考虑最左边这一颗棋子呢?实际上,★位置和左边这颗棋子一定不可能成五子,但另一方面,你不能否定如果只考虑这三个位置的话,在☆和★两个位置落子对输赢的趋势影响还是略有区别的。(如果是我,我会选择在★落子)。
可你再想想,如果这种局势让你选,你一定选择落在紧挨着●的下一个位置。也就是说,纠结★位置的权值没有意义,我们姑且先这么认为。另外,人脑有限,要考虑到全盘去给某一个位置赋权是不值当也是几乎不可能实现的。
(以上可能只是庸人自扰,勿喷)
接下来,确定这个范围,我按照我见过较多的做法,也就是考虑以这个位置为端点的射线上的四个棋子来赋权值。(就一步而言,至多这四个位置有影响)。四个位置,每个位置可以是●或○或_,也就是说有3^4=81种情况,再思考一下,会发现对于★○xxx这种情况,x无论是什么对★没有影响,类似的还有,★_○xx,★__○x。这样一来,实际上我们需要考虑的只有:(★在每种情况的左边,未画出)
这31种情况,将这31种情况给出不同的权值,然后对每个空位置的8条射线依次辨明是哪一种情况,然后加上该种情况的权值。
一般来说,活4会比活3的权值要大得多,而活5又会比活4大得多。究竟大得多是大多少?说下我的想法:
因为活4就已经是九成可能赢了,为了防止有4个活3撼动一个活4的地位,所以活4比4倍的活3(4倍的理由后面会解释)大;而活5就更不用说了。(虽然上面这种情况较为极端,但我们要尽可能做最坏的打算)。
这里还有一个问题,按照上述来赋权的话正常情况下,●●●_(活4)会比●○xx(眠2),●●●○(眠4)的权值要大得多,但考虑下面两种情况
很明显,如果按照上面对赋权方法,(1)应该是会比(2)要小的,但实际上(1)合理的权值应该是最大的权值(五连)。
所以,单一分别考虑8条射线缺陷其实显而易见。
解决这个问题最好的方法就是考虑8条射线转换为考虑该位置为中心的4条9个位置长度的直线。这也就是上面为什么说最多4个(4倍)的原因,如果有5个及以上活3或活4的话,那必有活5,就没必要再讨论活3了。
至于其他情况,我也都是根据棋艺和感觉以及适当参考上面的思想来设定的。
(可能是我比较蠢)如果直接这么去赋权的话,共有3^8种情况,……就算要剔除不可能的情况也很费事>()<。
所以,就用上面讨论过的31种情况去组合出这4条直线。也就是,做一个31*31的权值矩阵。(呵呵呵呵呵)
实际上,我做了,按照我乱七八糟的棋艺做了。可做完之后有人指点我又发现,
★__●●,★___●……这样的情况,有必要考虑吗,这种情况我们不是优先在连子多的地方下吗?相反,★位置不仅不能给较大的权值(相对于活1,活2……),还要给他一个负的权值,因为这种局面落子就不应该落在★的位置,给它正的权值还会干扰其他位置。
基于种种考虑最后我将情况简化为了20种。
当然,上面只讨论了站在电脑角度去‘攻’,用同样的方法可以实现‘防’(即将玩家的棋子视作电脑的棋子)。不过我将每种情况‘防’的权值只设置成‘攻’的0.8。我方五连的权值一定要是绝对大的,防止敌方2个或3个五连撼动我方5连。
利用权值矩阵实现AI这部分代思路并不是很麻烦,需要注意的是要处理碰墙的情况(一条直线不满9个位置)。此时,我的简单权值AI就实现了,而且它的水品的确还是挺不错的(不枉我20*20的权矩阵,放在最后)。
—————————————————————————
和它下了很多盘后,我发现‘它’还是有很明显的弊病,就是太贪心于现状,也就是说,如果与它对弈时,尽量避免连在一起落子,而是几个方位散落,最后落子让几条线都活3或活4,它就会难以兼顾。简单来说,套路很容易打败它。虽然,这与我所赋权值有关系,但我觉得根本原因是考虑情况太少。也就是到了这个时候,就考虑4个位置而言我又回到初始的心态,考虑所有31种情况,一定是比20种要好的(如果有很好的的权值,这样完全可以实现一些简单的套路);再进一步讲,几乎可以肯定的说,要计算权值的这个位置的权值受其他所有位置落子情况的影响。当然,无论怎么说,你得有一个不错的权值表。权值法,AI的能力几乎完全取决于权值。
————————————————————————
以上仅为个人看法,若有错误或不当,请见谅。
权值表:(1同●,0同○)
简易五子棋AI权值法(2)相关推荐
- 权值法实现五子棋AI
权值法实现五子棋AI 前言 五子棋AI,能根据棋盘局势判断棋子应落在何处获胜,主要有权值法和博弈树法两种实现方案.本篇博客将就权值法展开介绍,笔者水平有限,望各路大神有所建议评论提出,谢谢. 权值法 ...
- 五子棋java程序=权值法_五子棋(人机对弈)——Java权值法五子棋博弈
五子棋人机博弈 五子棋,人与人之间博弈,我们不用考虑太多,都是玩家自动思考. 但是如果我们要玩一个单机的五子棋,实现人机的对战,那么我就得"帮"电脑考虑下走哪步了. 实现的方法大概 ...
- 五子棋(人机对弈)——Java权值法五子棋博弈
五子棋人机博弈 五子棋,人与人之间博弈,我们不用考虑太多,都是玩家自动思考. 但是如果我们要玩一个单机的五子棋,实现人机的对战,那么我就得"帮"电脑考虑下走哪步了. 实现的方法大概 ...
- JAVA权值法实现五子棋_java游戏之 五子棋实现人人对战!
五子棋,是我们大家都喜爱玩的智力棋类游戏,在学完了界面以及绘图之后便一直想做一个,如今终于如愿以偿,虽然还没有更好的美化该游戏,但是大局已定.高兴! 五子棋我们需要很多常量,比如说棋子的大小,棋盘格子 ...
- 五子棋_AI权值算法(2)
小编已经隔了好久没有更新了,原因我就不多说啦,接下来我要立个每周更新的flag啦. 上一篇我们的成果是这样的 然后如果我们要实现人机的话就需要算法啦,这里就使用比较简单的算法,其他的还有博弈树等比较高 ...
- 蒙特卡洛树搜索(MCTS)实现简易五子棋AI
蒙特卡洛树搜索算法可以通过自我对弈模拟得到不同状态分支中获胜的概率,从而获得最优的策略.代码部分可以分为Node类和State类.Node类通过关联父节点和子节点实现树结构,同时保存每个节点的属性:S ...
- 简易五子棋(包含开始、双人对战、简易AI、悔棋、认输、判断输赢)不含禁手
简易五子棋 先上效果图 一.问题分析 五子棋游戏分析: 五子棋作为较为普遍且简易的娱乐游戏,受到众多人的热爱,且五子棋AI也是一个较为容易实现的AI.下面我们先来分析游戏规则.(哈哈,虽然大家都知道, ...
- Java五子棋Ai-权值法
Java五子棋Ai-权值法 一. 什么是权值法? 二.实现权值法Ai会面临的问题 1.如何表达棋盘上未下处的横竖斜的棋子情况?(类似01120) 2.如何将未下处的横竖斜情况和权值联系起来?(Hash ...
- java五子棋ai_Java五子棋Ai-权值法
一. 什么是权值法? 权值法顾名思义,即是权衡不同的情况并赋予不同的数值,这个数值即代表着这个情况的重要性. 例如,当我们进行五子棋对战的时候,我们每下一个棋子就要判断这个点横竖斜的情况,对于不同的情 ...
最新文章
- Python函数参数的五种类型
- 详解虚函数的实现过程之虚基类(4)
- mysql is null走索引_Mysql数据库索引IS NUll ,IS NOT NUll ,!= 是否走索引
- roads 用户体验标准_世界智能大会与ROAD用户体验报告
- ASP.NET Session丢失问题原因及解决方案[转]
- 【100题】第三十三 高级字符匹配(和谐系统原理)
- odoo10参考系列--操作(Actions)
- 第八届“图灵杯”NEUQ-ACM程序设计竞赛个人赛——B题 小宝的幸运数组
- 华为手机 APP被杀_华为手机服务APP将全新改版 三大升级体验更加出色
- python研究背景与意义_立体匹配的研究背景以及意义
- 普元EOS的项目部署
- python批量打印word文件
- 文档数据库(document database)和键值数据库(key-value database)的区别(NoSQL)
- mac(苹果)电脑终端使用技巧
- 2021927学习总结
- 一文搞懂 USB 设备端驱动框架
- linux内存镜像技术,GitHub - oscomp/proj61-linux-address-range-memory-mirroring: Linux 内核内存镜像功能增强。...
- iOS实现服务器原生推送
- LM334芯片到底是恒流源还是温度传感器?
- Oracle 19c VLDB and Partitioning Guide 第8章:Using Parallel Execution 读书笔记