ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 一个五子棋小游戏的设计

一个五子棋小游戏的设计

原创 Linux操作系统 作者:alzhu-san 时间:2008-09-12 16:57:56 0 删除 编辑
一个五子棋小游戏的设计
Alzhu.San


    
二、AI   
  有了上面的部分就可以做一个双人游戏,用户既执白子又执黑子。不过大多数情况下,用户并不希望是这样的自娱自乐,对弈毕竟是两个人的游戏。我们让计算机充当我们的对手。
  对弈游戏正是人工智能的用武之地,虽然所谓的智能不过是一种编程技术而已。
  首先,我们需要记录棋局的情况,这里构造一个与棋盘大小相同的二维数组,以不同的整数代表每一个交点的3种不同状态:空(9)、黑子(1)、白子(0)。
  在落子的同时需要对记录表进行修改:
    public void actionPerformed(ActionEvent e)
    {
        //贴图(还得区分一下,是贴白棋子还是黑棋子)
        //修改记录表
    }
  AI过程需要分析的也就是这张记录表,落子时分析每一个为空的交点,计算在此处落子的价值,选择价值最大的一点落子就好了。
  至于说把棋下到这一点的价值,这完全来源于经验(我下五子棋的经验),从结果考虑:
  形成00000形式价值最高,五子连珠我赢了,设定价值为10000;
  将对方一个即将形成的五子连珠破坏掉,价值次之,设定价值为5000;
  加长自己相邻子连成的串又次之……
  以上的价值判断仅仅是笔者的个人意见,为不同的棋型设置不同的权重,可以有效调整落子优先级,调整落子顺序。合理的价值判断有助于提高程序的智能程度。
  这里的智能不过是一个搜索的算法,以待搜索点的价值作为取舍依据,使价值最大化。

三、补充说明
  1、上面的算法将检索所有为空的交点,实际上落在与已存在的棋子相邻的位置的价值要高于落在孤立位置上,所以只检索这样的位置会提高效率,所附文件就采取了这样的实现,同时也省去了判断孤立点价值的问题。
  2、一般的,程序向前搜索的步数越多,判断越准确,然而消耗的资源也越多。所附文件并没有实现多步搜索,笔者认为如果玩家赢的机会太少就会对游戏失去兴趣。以下给出一个多步检索的模板,以便读者补充实现。
   
/**
*alpha beta剪枝算法
*
*@para depth 确定的检索深度,当达到此值时返回当前的最优解
*@para p 表示当前棋局状态的数据类型。
*@para player 当前的玩家,因为此时计算机将模拟用户作出选择,计算机扮演双角色
*@para alpha 初始设定的alpha值
*@para beta 初始设定的beta值
*@return 返回一个向量,向量的第一个元素是最佳落子点的价值,从第二个元素开始是
* 一个落子的序列,它表示取得最大价值所通过的路径,也就是说第二个元素就是
* 所求的最佳落子点。
*
*需要实现以下方法:
* //判断是否达到最大检索深度,如是返回真
* boolean reachedMaxDepth(Position,int)
* //评估函数
* float evaluation(Position,boolean)
* //返回可以下子的位置
* Position[] possibleMoves(Position,boolean)
*
*典型的调用:Position p=new Position(……);
* alphaBetaHelper(10, p, true, 1000000.0f, -1000000.0f);
*说明:这里的Position类是一个假设的类,它表示当前棋局状态,为方便起见,
* 将评估函数的对象,及可落子位置也设为此类型,读者可根据应用情况作出调整
*/

Vector alphaBetaHelper(int depth, Position p,
      boolean player, float alpha, float beta)
{
  if (reachedMaxDepth(p, depth))
  {
    Vector v = new Vector(2);
    float value = evaluation(p, player);
    v.addElement(new Float(value));
    v.addElement(null);
    return v;
  }
  Vector best = new Vector();
  Position [] moves = possibleMoves(p, player);
  for (int i = 0; i < moves.length; i++)
  {
    Vector v2 = alphaBetaHelper(depth + 1, moves[i], !player, -beta, -alpha);
    float value = -((Float)v2.elementAt(0)).floatValue();
    if (value > beta)
    {
      beta = value;
      best = new Vector();
      best.addElement(moves[i]);
      Enumeration en = v2.elements();
      en.nextElement(); // skip previous value
      while (en.hasMoreElements())
      {
        Object o = en.nextElement();
        if (o != null) best.addElement(o);
      }
    }
    /**
    * Use the alpha-beta cutoff test to abort search if we
    * found a move that proves that the previous move in the
    * move chain was dubious
    */
    if (beta >= alpha)
    {
      break;
    }
  }
  Vector v3 = new Vector();
  v3.addElement(new Float(beta));
  Enumeration en = best.elements();
  while (en.hasMoreElements())
  {
    v3.addElement(en.nextElement());
  }
  return v3;
}

a.GIF

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/15822571/viewspace-446903/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2008-09-12

  • 博文量
    10
  • 访问量
    26049