人工智能也就是所谓的AI(Artificial Intelligence)是一门很抽象的技术AI程序的编写不需要依据任何既定的思考模式或者规则尤其是游戏中的AI可以完全依程序设计者本身的思考逻辑制作我个人认为人工智能的核心应该是使计算机具有自动的处理事件的能力而我们的所有的研究也应该围绕着这一方向主体是策略类的人工智能
策略类人工智能可以说是AI中比较复杂的一种最常见的策略类AI游戏就是棋盘式游戏在这类游戏中通常的策略类AI程序都是使计算机判断目前状况下所有可走的棋与可能的获胜状况并计算当前计算机可走棋步的获胜分数或者玩家可走棋步的获胜分数然后再决定出一个最佳走法下面先介绍一下五子棋的AI构想
五子棋的AI构想
有句话叫当局者迷旁观者清但这句话在由AI所控制的计算机玩家上是不成立的因为计算机必须知道有那些获胜方式并计算出每下一步棋到棋盘上任一格子的获胜几率也就是说一个完整的五子棋的AI构想必须
能够知道所有的获胜组合
建立和使用获胜表
设定获胜的分数
使电脑具有攻击和防守的能力
一求五子棋的获胜组合
在一场五子棋的游戏中计算机必须要知道有那些的获胜组合因此我们必须求得获胜组合的总数我们假定当前的棋盘为*
()计算水平方向的获胜组合数每一列的获胜组合是共列所以水平方向的获胜组合数为*=
()计算垂直方向的获胜组合总数每一行的获胜组合是共行则垂直方向的获胜组合数为*=
()计算正对角线方向的获胜组合总数正对角线上的获胜组合总数为
+(++++)*=
()计算反对角线方向的获胜组合总数反对角线上的获胜组合总数为
+(++++)*= 这样所有的获胜组合数为+++=
二建立和使用获胜表
我们已经计算出了一个*的五子棋盘会有种获胜方式这样我们可以利用数组建立获胜表获胜表的主要作用是判断当前的获胜方式是否有效判断当前的获胜方式中到底有多少子落入该获胜组合中详细的使用您将在后面的程序中可以看出
三分数的设定
在游戏中为了让计算机能够决定下一步最佳的走法必须先计算出计算机下到棋盘上任一空格的分数而其中最高分数便是计算机下一步的最佳走法
原理我们判定当前讨论的空格与当前讨论的点有几种获胜的方式有几种该空格就加几分这种原理初听起来似乎是无法入手没关系当您了解我们后面的程序后您就会明白这种决策原理了
这种决策有一些缺陷因为如果只根据这个模型设计就有可能出现电脑或玩家有三个子连成一线的时候计算机却判断不出它认为其他某些空格是当前的获胜的最佳位置而不去攻击或防守没关系我们完全可以通过一个加强算法来改变当前的分值情况也就是说当电脑或玩家有三个子或四个子连成一线时我们通过加强算法将当前与三个子或四个子有关的空格的分值提高从而可以弥补这一缺憾
四攻击与防守
以上的方式事实上计算机只是计算出了最佳的攻击位置为了防守我们还应计算当前玩家的最佳的攻击位置这样有什么用呢?道理很简单如果玩家最佳攻击位置的分数大于计算机最佳攻击位置上的分数那么计算机就将下一步的棋子摆在玩家的最佳攻击位上以阻止玩家的进攻否则计算机便将棋子下在自己的最佳攻击位置上进行攻击
事实上这个AI构想是很强大的如果你不是很厉害的五子棋高手的话可能很快会被计算机打败我在联众上可是中级棋手啊跟这种构想打的时候胜率也不是很高
使用编写五子棋
一编写前的准备
用计算机的思想描述整个下棋的过程
考虑步骤
()为了简便我们可以先让电脑先走第一步棋电脑每走一步就会封掉许多玩家的获胜可能情况
()当玩家走棋的时候我们首先应该考虑玩家走棋的合法性
()如果合法那么玩家也会封掉许多电脑的获胜的可能情况
()电脑的思考路径首先判断当前玩家和电脑的所有获胜组合是否需要进行加强赋值是进行加强赋值否则进行普通的赋值
()比较当前玩家和电脑谁的分值最大将分值最大的点作为电脑的下一步走法
利用窗体和图形工具建立五子棋的棋盘界面
()添加一个picturebox控件
作用使用picturebox控件绘制棋子和棋盘
()添加一个label控件
作用显示当前的获胜标志也就是当某一方获胜或和棋时显示此标签
()添加一个mainmenu控件
作用控制游戏的开始或结束
()添加一个mediaplay组件
作用使程序可以播放音乐
设置整体框价
我们采取*的棋盘为主要的平台利用数组定义整个棋盘桌面利用数组定义获胜组合以及获胜标志等
二声明全局数组和变量
定义虚拟桌面
Dim table( ) As Integer
定义当前玩家桌面空格的分数
Dim pscore( ) As Integer
定义当前电脑桌面空格的分数
Dim cscore( ) As Integer
定义玩家的获胜组合
Dim pwin( ) As Boolean
定义电脑的获胜组合
Dim cwin( ) As Boolean
定义玩家的获胜组合标志
Dim pflag() As Boolean
定义电脑的获胜组合标志
Dim cflag() As Boolean
定义游戏有效标志
Dim theplayflag As Boolean