回 帖 发 新 帖 刷新版面

主题:棋类游戏的算法的原理是怎样的呀>?

如题,棋类游戏的算法的原理是怎样的呀>?懂的都说说看!

回复列表 (共13个回复)

沙发

只有做不到的,
没有想不到的。

板凳

"moz"老大,这次你错了,应该是“只有想不到的,没有做不到的”

3 楼

喔喔,不好意思,脑袋乱了,说错了,抱歉抱歉。

4 楼

恩??

5 楼

比较简单的游戏用穷举,复杂的就复杂了,我听说过有用概率论的,有用拓扑学的,有用动态规划的。反正我是一个也没用过。

6 楼

A*算法,一般要先制定一套评分规则,然后选出最有利的一步,接着交换棋盘,重复同样的过程,如此深度/广度优先搜索几步以后,找出综合评分最高的一步执行

7 楼

唉!我旱就想问这种问题了,只不是知怎么问才好。

最近想编一个军棋游戏

现在有的一些军棋对军棋练习并不好,看不到过程,输了都不知怎么输的,对提高没有太大帮助。
但军棋又不象象棋,棋子都看得到,军棋还涉及到对未知棋子的判断过程。用穷举显然不行,而且程序很大,我看到一些单机的军棋游戏只有很小,且智商很好,一般还下不赢。

我不是军棋高手(是高手就不会想编一个练习了哦),高手可能总结得出其中的规律。
关键就这算法核心,难道只能棋类高手才都编这种程序吗?

唉~~~正在郁闷中......

8 楼

一般来说,应用软件的编制都离不开相关专业的高手的参与。

9 楼

转的:

BASIC 中使用BEST-FIRST 搜索路径BASIC 中使用BEST-FIRST 搜索路径
      来自:http://member.netease.com/~ldx/index.htm作者:凌云RTC
       在网上看了一些讲AI的资料,对搜索路径很感兴趣(因为有了这个,在游戏中就可以用鼠标指挥
      了),但我看过的资料中全是C++的程序(唉,可怜我们BASIC 没那么多数据类型),想想我钟情的
      BASIC,便决定要写BASIC 的程序.一下午写了出来,用的是 BEST-FIRST 算法(不过我也不知这算
      不算是),给大家看一下:
      说明:
      本程序中估价使用的是 评价值=|终止节点X-当前节点X|+|终止节点Y-当前节点Y|
      注:
      算法说明可以从各大游戏制作站点的技术文档中关于AI的文章中找到.

      DECLARE SUB PathFind (N AS ANY, T AS ANY, PathFound() AS ANY, PathNumber 
      AS INTEGER)
      DECLARE FUNCTION SelDirect! ()
      DECLARE SUB SelNode (SeledNode AS ANY, Col AS INTEGER)

      '$DYNAMIC '使用动态数组
      'DEFINT A-Z '缺省时全部变量使用整型

      CLS : SCREEN 13 '进入图形方式
      TYPE Node '定义新类型---节点
      x AS INTEGER
      y AS INTEGER
      END TYPE

      DIM SHARED Maze(33, 21) '定义障碍数组

      DIM SHARED N AS Node, T AS Node '定义节点
      DIM xww AS Node, LASTN AS Node
      DIM PathFound(0) AS Node, PathNumber AS INTEGER '定义路径表 及 路径表中包含的节点数
      FOR j = 0 TO 19
      FOR i = 0 TO 31
      READ w '读入障碍数据
      Maze(i, j) = w
      IF w = 1 THEN LINE (i * 10, j * 10)-(i * 10 + 9, j * 10 + 9), 4, BF
      NEXT
      NEXT

      SelNode N, 2 '选择初始节点
      SelNode T, 3 '选择终止节点


      LINE (T.x, T.y)-(T.x + 9, T.y + 9), 3, BF

      PathFind N, T, PathFound(), PathNumber '生成从N节点到T节点的路径

      FOR i = 0 TO PathNumber - 1 '显示已生成的路径
      LINE (PathFound(i).x, PathFound(i).y)-(PathFound(i).x + 9, PathFound(i).y 
      + 9), 2, BF
      NEXT



10 楼



      '障碍数据
      DATA 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
      DATA 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
      DATA 0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
      DATA 0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
      DATA 0,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
      DATA 0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
      DATA 0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
      DATA 0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
      DATA 0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
      DATA 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
      DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
      DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
      DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
      DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
      DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
      DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
      DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
      DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
      DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
      DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0


      SUB PathFind (N AS Node, T AS Node, PathFound() AS Node, PathNumber AS 
      INTEGER)
      '估测路径表中节点数
      PathNumber = 2 * INT(ABS(T.x / 10 - N.x / 10) + ABS(T.y / 10 - N.y / 10)) 
      + 10
      DIM LASTN1 AS Node, LASTN AS Node
      REDIM PathFound(PathNumber) AS Node
      PathFound(0).x = N.x
      PathFound(0).y = N.y
      PathNumber = 1

      IF Maze((T.x / 10), INT(T.y / 10)) <> 1 THEN '如果终止节点不是障碍,则

      DO UNTIL (N.x = T.x AND N.y = T.y) '循环直到到达目标节点

      RNDDirect = SelDirect '选择方向
      SELECT CASE RNDDirect
      CASE 1 '上
      N.x = N.x: N.y = N.y - 10
      CASE 2 '右
      N.x = N.x + 10: N.y = N.y

我来回复

您尚未登录,请登录后再回复。点此登录或注册