一个五子棋小游戏的设计
Alzhu.San
Alzhu.San
![bb](http://img.blog.itpub.net/blog/attachments/2008/09/15822571_200809130001011.gif?x-oss-process=style/bb)
二、AI
有了上面的部分就可以做一个双人游戏,用户既执白子又执黑子。不过大多数情况下,用户并不希望是这样的自娱自乐,对弈毕竟是两个人的游戏。我们让计算机充当我们的对手。
对弈游戏正是人工智能的用武之地,虽然所谓的智能不过是一种编程技术而已。
首先,我们需要记录棋局的情况,这里构造一个与棋盘大小相同的二维数组,以不同的整数代表每一个交点的3种不同状态:空(9)、黑子(1)、白子(0)。
在落子的同时需要对记录表进行修改:
public void actionPerformed(ActionEvent e)AI过程需要分析的也就是这张记录表,落子时分析每一个为空的交点,计算在此处落子的价值,选择价值最大的一点落子就好了。
{
//贴图(还得区分一下,是贴白棋子还是黑棋子)
//修改记录表
}
至于说把棋下到这一点的价值,这完全来源于经验(我下五子棋的经验),从结果考虑:
形成00000形式价值最高,五子连珠我赢了,设定价值为10000;
将对方一个即将形成的五子连珠破坏掉,价值次之,设定价值为5000;
加长自己相邻子连成的串又次之……
以上的价值判断仅仅是笔者的个人意见,为不同的棋型设置不同的权重,可以有效调整落子优先级,调整落子顺序。合理的价值判断有助于提高程序的智能程度。
这里的智能不过是一个搜索的算法,以待搜索点的价值作为取舍依据,使价值最大化。
三、补充说明
1、上面的算法将检索所有为空的交点,实际上落在与已存在的棋子相邻的位置的价值要高于落在孤立位置上,所以只检索这样的位置会提高效率,所附文件就采取了这样的实现,同时也省去了判断孤立点价值的问题。
2、一般的,程序向前搜索的步数越多,判断越准确,然而消耗的资源也越多。所附文件并没有实现多步搜索,笔者认为如果玩家赢的机会太少就会对游戏失去兴趣。以下给出一个多步检索的模板,以便读者补充实现。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15822571/viewspace-446903/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/15822571/viewspace-446903/