关于一个人机博弈游戏的算法
时间:2011-08-16
来源:互联网
最近工作比较闲空,我就自己写一些东西做研究,我写了一个棋类游戏,目前碰到了困难,想向各位请教一下。
游戏的演示地址:http://u.115.com/file/aq7zi7ig
这个游戏是这样的:
1 有一个9x9=81格子的棋盘。
2 玩家1的棋子位于棋盘从上往下数第一行的正中间,玩家2的棋子位于棋盘最底一行(即第九行)的正中间。
3 游戏规则:先走到对方的底线的玩家获得胜利(比方说,玩家1的目标就是向下走到第9行,而玩家2的目标就是向上走到第1行)
只要走到目标行即可,不管它处于目标行的哪一个单元格内。
4 每个玩家都拥有10块挡板。挡板分为2种,一种为横挡板,一种为竖挡板,每个挡板的长度(或宽度)都是两个单元格。
5 在使用挡板时,不能将对方或自己前往终点的路线堵死。
6 每一步只能选择行棋或者放置挡板中的一种,如果走了棋子就不能放置挡板,放置了挡板就不能行棋。每回合棋子移动一格,每回合最多放置一个挡板。
7 允许两方的棋子在单元格上重叠,互不干扰。
规则大体如上
附件里附上我用VB 6.0写的一个简单人机对战(即Quoridor.rar),用方向键控制棋子移动(控制下方棋子),用鼠标移动、点击来放置挡板。
以上是游戏介绍,下面是我的问题。
这个游戏的算法涉及到两个方面:
1 如何以最快的速度计算出棋子前往目标行的最短路径。与A*算法有所区别的是,该游戏并没有规定一个具体的单元格作为目标点,而是目标行的每一个单元格都有可能成为目标点,我分别用A*算法以及遍历的方法,发现二者速度差别不大(因为A*我必须把目标行上的单元格最短路径全部计算出来,然后再求一个最短值,这本身和遍历已经没有太多区别,甚至会更慢)
2 人机博弈的计算量是相当大的。以该棋子为例,每一步的选择都有很多种(一共有144块挡板的安放方法,还要加上棋子的四个方向),如果电脑需要至少思考3步,则经历的过程是 电脑--人--电脑--人--电脑一共五层递归,每一层都有100来种的可能性,其复杂度就是n的5次方。即使用了剪枝,速度也非常缓慢。
我想了好久,都没有非常有效的加快速度的办法,目前只能通过一个函数来判断哪些挡板有可能会对局势起到作用,以削减每层递归时的计算量,但是减的狠了,电脑就显得很傻,减的少了,速度慢到难以忍受。
在这个计算里,我测试寻找最短路径最多需要0.4ms,如果一个人对电脑行棋的时间忍受为20秒,这意味着电脑最多只能进行50000次循环,但是50000次循环无疑太少了,电脑根本还想不出太多有意义的步子来。
请教各位算法达人,对于这样的游戏,如何进行有效的算法分析?
游戏的演示地址:http://u.115.com/file/aq7zi7ig
这个游戏是这样的:
1 有一个9x9=81格子的棋盘。
2 玩家1的棋子位于棋盘从上往下数第一行的正中间,玩家2的棋子位于棋盘最底一行(即第九行)的正中间。
3 游戏规则:先走到对方的底线的玩家获得胜利(比方说,玩家1的目标就是向下走到第9行,而玩家2的目标就是向上走到第1行)
只要走到目标行即可,不管它处于目标行的哪一个单元格内。
4 每个玩家都拥有10块挡板。挡板分为2种,一种为横挡板,一种为竖挡板,每个挡板的长度(或宽度)都是两个单元格。
5 在使用挡板时,不能将对方或自己前往终点的路线堵死。
6 每一步只能选择行棋或者放置挡板中的一种,如果走了棋子就不能放置挡板,放置了挡板就不能行棋。每回合棋子移动一格,每回合最多放置一个挡板。
7 允许两方的棋子在单元格上重叠,互不干扰。
规则大体如上
附件里附上我用VB 6.0写的一个简单人机对战(即Quoridor.rar),用方向键控制棋子移动(控制下方棋子),用鼠标移动、点击来放置挡板。
以上是游戏介绍,下面是我的问题。
这个游戏的算法涉及到两个方面:
1 如何以最快的速度计算出棋子前往目标行的最短路径。与A*算法有所区别的是,该游戏并没有规定一个具体的单元格作为目标点,而是目标行的每一个单元格都有可能成为目标点,我分别用A*算法以及遍历的方法,发现二者速度差别不大(因为A*我必须把目标行上的单元格最短路径全部计算出来,然后再求一个最短值,这本身和遍历已经没有太多区别,甚至会更慢)
2 人机博弈的计算量是相当大的。以该棋子为例,每一步的选择都有很多种(一共有144块挡板的安放方法,还要加上棋子的四个方向),如果电脑需要至少思考3步,则经历的过程是 电脑--人--电脑--人--电脑一共五层递归,每一层都有100来种的可能性,其复杂度就是n的5次方。即使用了剪枝,速度也非常缓慢。
我想了好久,都没有非常有效的加快速度的办法,目前只能通过一个函数来判断哪些挡板有可能会对局势起到作用,以削减每层递归时的计算量,但是减的狠了,电脑就显得很傻,减的少了,速度慢到难以忍受。
在这个计算里,我测试寻找最短路径最多需要0.4ms,如果一个人对电脑行棋的时间忍受为20秒,这意味着电脑最多只能进行50000次循环,但是50000次循环无疑太少了,电脑根本还想不出太多有意义的步子来。
请教各位算法达人,对于这样的游戏,如何进行有效的算法分析?
作者: Sandycs 发布时间: 2011-08-16
自己顶起来
作者: Sandycs 发布时间: 2011-08-16
支持原创
作者: Jokul_Lee 发布时间: 2011-08-16
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28