五子棋AI算法的改进方法讲解--实用.doc
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
又是本人一份人工智能作⋯⋯首先道歉,从Word到Livewrter,好多格式没了,也没
做代高亮⋯⋯大家凑活着看⋯⋯想做个好的人机弈的五子棋,可以需要考的
是很多的,我将制作有大AI 五子棋的程分十四步,我来步步介。
第一步,了解禁手
做一个五子棋的程序,自然五子棋需要有足的了解,在默大家在和我研究五子棋
之前了解是一多的。以个基,介多数人不大熟悉的方面。五子棋的上有
两种:有禁手和无禁手。由于无禁手的比,因此被更多人所接受。其,于
下五子棋的人来,有禁手才是。所以,里先“有禁手” 行一下介:
五子棋中“先手必”已得到了,似“花月定式”和“浦月定式”,很多先手必下法
然需要大量的,但高手确能做到必。所以五子棋的行了化,得到了“有禁手”五子棋。五子棋中,黑棋必然先行。因此“有禁手”五子棋技中黑棋有以下“禁手”限制:“三三禁”:黑棋下子位置同形成两个以上的三;“四四禁”:黑棋下子位置同形成两个以上的
四;“ 禁”:六子以上的黑棋成一。黑棋如下出“禁手“ 上掉棋局。不如果“ 五”与“禁手”同出“禁手”是无效的。所以于黑棋只有冲四活三(后面会有解)
是无解局面。反白棋多了一种方式,那就是逼迫黑棋必定要下在禁点。
了迎合所有玩家,五子棋自然需要做出两个版本,或者是可以行禁手上的控制。
第二步,游界面
里,我制作了一个的界面,但是,于人机弈来,用。和很多网上的精美界面相比,我的界
面也略粗糙,但,开速度高,用了不到半天。下面我看下界面的做法。
界面我采用了 WPF ,表和完全分开,前台基本可以通拖拽完成布局,里就不做多介。根
据界面截介
1 处实际上市两个渐变Label 但是没有做事件响应。通过按钮属性。也许有人会奇怪,为什么的拼接,
2 、
3 是两个 label ,
4 、 5
6 、
7 、
8 、9的控制,修改label
Button 会丝毫看出不出有Button
实际上是两个Button,
和 Button的Content
的影子,这里战友
whrxiao 写过一个Style 如下
这里我们把这个Style称为Style1。界面逻辑上,将是否开始、是否禁手和是否电脑先行
作为两个全局变量的布尔型值,通过设置和判断 bool 型值进行逻辑上的控制。中间的棋盘是个canvas ,一个 15*15 的 Grid 放满 Button 并将每个 Button 应用 Style1 开始时候透明度设为 0 ,也就是根本看不到,在下棋的时候改变 Button 的背景和透明度,实现落子
的效果,因为Grid的位置关系,所以可看起来好像是下在横竖的交线处。
第三步,进行输赢判断:
因为规则不同,“无禁手”和“有禁手”的输赢判断自然不同。先看无禁手:这个比较简单,遍
历每个位置,然后从这个位置开始,分别判断它的四个方向:即横、竖、左上到右下、左下
到右上。每个方向从中间点开始,往两边数连子数,然后将两个方向的连字数加和再加一(中间的棋子)。如果得到大于等于 5 ,那么就说明下子方赢棋。
对于有禁手的五子棋,输赢判断还需要判断禁手,禁手的判定较为复杂。将待判断点放入黑棋子。然后搜索待判断点周边棋盘;还原棋盘;利用搜索结果依次对各方向进行分析,判断黑棋放入后所产生的棋型是否形成长连或形成某种四连或三连的的棋型。若形成长连,判定为禁手,返回长连禁手标识。若形成某种四连或三连的棋型,该棋型统计数加 1 ,再对下一个方向进行判断,直到各个方向分析结束。若四连棋型或三连棋型的统计数大于1,则返回为禁手。其余情况返回非禁手。
第四步:构造棋型估分
“有禁手”规则比较复杂,涉及到比较多下棋方面的技巧,而且对算法的思路没有丝毫影响,
所以下面我们主要考虑无禁手规则下的AI 设计。若设计好无禁手AI ,只需要让AI 执黑时坚决不下到禁手点,就可以很快构造有禁手的 AI 。虽然这种方式没有利用有禁手规则下的技
巧,但这些技巧只需要修改下面所讲到的估分函数即可。
我们可以将五子棋的连珠可以分为以下几种:
成 5 :即构成五子连珠
活4 :即构成两边均不被拦截的四子连
珠。死 4 :一边被拦截的四子连珠
活3 :两边均不被拦截的三字连珠
死3 :一边被拦截的三字连珠
活 2 :两边均不被拦截的二子连珠
死2 :一边被拦截的二子连
珠单子:四周无相连棋子
根据五子棋的技巧,可以将五子棋的棋型用连珠进行分类,分类过后我们按照威力给每种棋型
打分。因为五子棋一次只落一子,因此很容易理解,双活三和三活三的威力是一样的,类
似情况不多做解释。程序中,我以100 分为满分,对棋型进行了以下打分:
成5, 100 分
活4 、双死 4 、死 4 活 3 , 90 分双
活 3 , 80 分