五子棋AI的应用思路

   五子棋AI思想

      五子棋是深受人们特别是年轻朋友喜欢的一种娱乐性很强的益智游戏。其可以说是简单,但是它的变化多端,就给人们带来无穷的乐趣和思考。那么五子棋的AI(Artificial Intelligence)将会带来更大的思考空间和想象力。人工智能在当今社会中运用越来越频繁,也更多的适应社会的发展趋势。这里我也简单的谈谈我写AI五子棋的一些算法和思想。
       1.五子棋的了解:
  棋位:棋盘的任意一个能放置棋子的位置。
  空棋位:没有放置棋子的棋位。

  成五:同一色的五子连成一线,胜利。
       2.基本思想:
  从宏观上看整个棋盘,对整个棋盘的棋位打分,落子的位置为整个棋位分值的最大值。
 2.1打分的标准:

  a.中优先、斜优先.(注意大的分数不能过大,保持在0-10间),
这是总的从宏观上的打分标准。

  b.去除无关子的方法.
      假象敌(黑),如果黑子想连成五子,这必须它的四向的每一个方向都应该:黑子+空棋位>=5才可以,根据这条可去除无关子。

  c.一些特殊棋位的分数:

(1)
     敌4,空1、     敌3,空1 、     敌3,空2、   敌2,空2、   敌2,空1;

     友4,空1、     友3,空1、      友3,空2、    友2,空2、   友2,空1。
遇到这位置时候的的打分要合理安排。

当然这些敌、友和空 可以用统计四向的函数来表示:

package 机器白下;

import game.PanJu;
import game.QiPan;

public class PanJu3 extends PanJu
{
 protected double[][] fens2;

 //判据子类的"计算函数":
 // 可使用:
 //  1、qiPans[][]数组:棋盘行列数 QiPan.Hang  QiPan.Lie
 //  2、who:当前轮到谁下。
 //  3、白子为1  黑子为-1。机器为黑子,后手下
 //应算出:
 //  fens[][]数组各个元素的值
 //  分数应>=0的double数
 //  越大,代表 此点 价值越高


 public void jiSuan() 
 {
  for (int h=0 ;h<QiPan.Hang  ;h++  )
  {
   for (int l=0 ;l<QiPan.Lie  ;l++  )
   {
    fens[h][l]=10*dianFen(h,l)
   }
  } 
  
  }
 
 int dianFen(int kh,int kl)
 {
  //统计四向+斜优先
  int zongHeng=tongJi4Xiang(kh,kl,0,1,1);
  int zongZong=tongJi4Xiang(kh,kl,1,0,1);
  int zongPie=tongJi4Xiang(kh,kl,1,1,1)+2;
  int zongNa=tongJi4Xiang(kh,kl,-1,1,1)+2;

  double shu=   Math.pow(zongHeng,2)+  Math.pow (zongZong,2)+Math.pow(zongPie,2)+Math.pow(zongNa,2);
  return  (int)(shu*4);
 }
 
             protected int tongJi4Xiang(int dangHang,int dangLie,int dh,int dl,int who)
    {
    double shu=1.0;
    int h;
  int l;
  int zong; 
  //横
  l=dangLie-dl;
  h=dangHang-dh;
  zong=0;
  int kong=0;
  while (l>=1  &&  l<QiPan.Lie-1 && h>=1  &&  h<QiPan.Hang-1)
  {
   if (qiPans[h][l]==0)
   {
    kong++;
    break;
   }
   else if (qiPans[h][l]==who)
   {
    zong++;
    h=h-dh;
    l=l-dl;
   }
   else
   {
    break;
   }
  }

   l=dangLie+dl;
   h=dangHang+dh;
  while (l>=1&&l<QiPan.Lie-1&&h>=1&&h<QiPan.Ha-1)
  {
   if (qiPans[h][l]==0)
   {
    kong++;
    break;
   }
   else if (qiPans[h][l]==who)
   {
    zong++;
    h=h+dh;
    l=l+dl;
   }
   else
   {
    break;
   }
    }
  return zong;
   }

   int 分数(int shu)
   {
    return shu;
   }
}

 
(2)
 双关子的打分:
双关子的表现形式有:一一变为二二的那一点为双关点。当然如果不算禁点(禁点:黑棋一子形成三三、四四、长连、四三三、四四三的那一点称为禁点)。一些严格要求的五子棋如果走了禁点,就相当于自输了。如果不严格要求,那么这些形成禁点的点可以成为双关点。打分时应好好的把握。

3.结论:五子棋AI思路写出了,但是注意一点的是关于分数的给于,这是至关重要的。这能培养我们的协调能力、思维缜密和细心程度。

    
  


  

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值