ChessBot.java
上传用户:sjjz88
上传日期:2013-04-10
资源大小:452k
文件大小:12k
源码类别:

游戏

开发平台:

Java

  1. ///杨建国:ChessBot.java
  2. // The fivelink bot
  3. import java.math.*;
  4. import java.lang.*;
  5. import java.awt.*;
  6. public class ChessBot
  7. {
  8. class LinkInfo
  9. {
  10. public boolean isLinkN;
  11. public int isLive[]; //0死链,1半活链,2活链([0]-[3]表横竖左斜右斜)
  12. public int linknum[]; //([0]死链,[1]半活链,[2]活链)
  13. LinkInfo()
  14. {
  15. isLinkN=false;
  16. isLive=new int[4];
  17. linknum=new int[3];
  18. }
  19. public String toString()
  20. {
  21. String r=new String("isLinkN="+isLinkN+";isLive[0~3]="+isLive[0]+isLive[1]+isLive[2]+isLive[3]+";linknum[0~2]="+linknum[0]+linknum[1]+linknum[2]);
  22. return r;
  23. }
  24. public int getLiveNum()
  25. {
  26. int lvn=0;
  27. for(int i=0;i<4;i++)
  28. if(isLive[i]==2) lvn++;
  29. return lvn;
  30. }
  31. public int getHLiveNum()
  32. {
  33. int lvn=0;
  34. for(int i=0;i<4;i++)
  35. if(isLive[i]==1) lvn++;
  36. return lvn;
  37. }
  38. public int getDeathNum()
  39. {
  40. int lvn=0;
  41. for(int i=0;i<4;i++)
  42. if(isLive[i]==0) lvn++;
  43. return lvn;
  44. }
  45. }
  46. private int N; //棋盘边长
  47. private int HUMAN; //人下的棋子
  48. private int BOT; //机器人下的棋子
  49. private int NONE; //没有棋子
  50. private int isChessOn [][]; //存放棋局
  51. private int deep; //递归深度
  52. private int MAXDEEP; //最大递归深度
  53. private int step; //当前是第几步
  54. private Point last[];//[0]是敌人,[1]是机器人
  55. ChessBot(int r_n)
  56. {
  57. N=r_n;
  58. HUMAN=1;
  59. BOT=-1;
  60. deep=0;
  61. MAXDEEP=1;
  62. step=0;
  63. isChessOn=new int[N][N];
  64. last=new Point[2];
  65. }
  66. public void restart() //重开一局
  67. {
  68. HUMAN=1;
  69. BOT=-1;
  70. deep=0;
  71. step=0;
  72. for(int i=0;i<N;i++)
  73. for(int j=0;j<N;j++)
  74. isChessOn[i][j]=NONE;
  75. for(int i=0;i<2;i++)
  76. {
  77. last[i].x=0;
  78. last[i].y=0;
  79. }
  80. }
  81. public void rollback() //悔棋
  82. {
  83. for(int i=0;i<2;i++)
  84. isChessOn[last[i].x][last[i].y]=NONE;
  85. step--;
  86. }
  87. public Point play(int x,int y) //机器人走一步棋
  88. {
  89. deep=0;
  90. isChessOn[x][y]=HUMAN;
  91. // System.out.println("x="+x+"  y="+y+"  isChessOn[x][y]="+isChessOn[x][y]);
  92. Point r=new Point();
  93. r=next(BOT);
  94. isChessOn[r.x][r.y]=BOT;
  95. step++;
  96. System.out.println("step "+step+":-----------------------------------------------");
  97. for(int i=0;i<N;i++,System.out.print("n"))
  98. for(int j=0;j<N;j++)
  99. {
  100. if(isChessOn[j][i]!=-1)System.out.print(new String(" "+isChessOn[j][i]));
  101. else System.out.print(isChessOn[j][i]);
  102. }
  103. last[0]=new Point(x,y);
  104. last[1]=new Point(r);
  105. return r;
  106. }
  107. public Point playfirst() //机器人先手
  108. {
  109. isChessOn[7][7]=BOT;
  110. step++;
  111. last[0]=new Point(7,7);
  112. last[1]=last[0];
  113. return new Point(7,7);
  114. }
  115. private LinkInfo isLinkn(int x,int y,int type,int nn) //计算当前位置type方是否有nn子相连,相连的情况
  116. {
  117. int i=0;
  118.    int j=0;
  119.    int i1,j1;
  120.    int successFactor_v=0; //横向五子连珠
  121.    int successFactor_h=0; //纵向五子连珠
  122.    int successFactor_l=0; //左斜线五子连珠
  123.    int successFactor_r=0; //右斜线五子连珠
  124.    int live_v=0; //空格数
  125.    int live_h=0;
  126.    int live_l=0;
  127.    int live_r=0;
  128.    int islive1=0; //计算半死和活的临时变量
  129.    int islive2=0;
  130.    boolean isInt=false; //棋子链是(true)否(false)中断
  131.    int old=isChessOn[x][y];
  132.    LinkInfo r=new LinkInfo();
  133.    isChessOn[x][y]=type;
  134.   
  135.    islive1=0;
  136.    islive2=0;
  137.    for(i=0,isInt=false;i<5&&(x-i)>=0&&(isChessOn[x-i][y]!=(-1)*type);i++)//横向有几个棋子相连
  138.    {
  139.    if(isChessOn[x-i][y]==type&&!isInt) successFactor_v++;
  140.    if(isChessOn[x-i][y]==NONE)
  141.    {
  142.    live_v++;
  143.    islive1=1;
  144.    isInt=true;
  145.    }
  146.    }
  147.   
  148.    for(i=1,isInt=false;i<5+1&&(x+i)<N&&isChessOn[x+i][y]!=(-1)*type;i++)
  149.    {
  150.    if(isChessOn[x+i][y]==type&&!isInt) successFactor_v++;
  151.    if(isChessOn[x+i][y]==NONE)
  152.    {
  153.    islive2=1;
  154.    live_v++;
  155.    isInt=true;
  156.    }
  157.    }
  158.    r.isLive[0]=islive1+islive2;
  159.    if(successFactor_v+live_v<5) r.isLive[0]=0;
  160.   
  161.   
  162.    if(successFactor_v>=nn)
  163.    {
  164.    r.isLinkN=true;
  165.    //System.out.println("isLinkN=true is becanse Factor_v="+successFactor_v);
  166.    r.linknum[r.isLive[0]]++;
  167.    }
  168.   
  169.   
  170.    islive1=0;
  171.    islive2=0;
  172.    for(i=0,isInt=false;i<5&&(y-i)>=0&&(isChessOn[x][y-i]!=(-1)*type);i++)//纵向有几个棋子相连
  173.    {
  174.    if(isChessOn[x][y-i]==type&&!isInt) successFactor_h++;
  175.    if(isChessOn[x][y-i]==NONE)
  176.    {
  177.    live_h++;
  178.    islive1=1;
  179.    isInt=true;
  180.    }
  181.    }
  182.   
  183.    for(i=1,isInt=false;i<5+1&&(y+i)<N&&isChessOn[x][y+i]!=(-1)*type;i++)
  184.    {
  185.    if(isChessOn[x][y+i]==type&&!isInt) successFactor_h++;
  186.    if(isChessOn[x][y+i]==NONE)
  187.    {
  188.    islive2=1;
  189.   
  190.    live_h++;
  191.    isInt=true;
  192.    }
  193.    }
  194.    r.isLive[1]=islive1+islive2;
  195.    if(successFactor_h+live_h<5)  r.isLive[1]=0;
  196.    if(successFactor_h>=nn)
  197.    {
  198.    r.isLinkN=true;
  199.    //System.out.println("isLinkN=true is becanse Factor_h="+successFactor_h);
  200.    r.linknum[r.isLive[1]]++;
  201.    }
  202.   
  203.    islive1=0;
  204.    islive2=0;
  205.    for(i=0,isInt=false;i<5&&(x-i)>=0&&(y+i)<N&&(isChessOn[x-i][y+i]!=(-1)*type);i++)//左斜有几个棋子相连
  206.    {
  207.    if(isChessOn[x-i][y+i]==type&&!isInt) successFactor_l++;
  208.    if(isChessOn[x-i][y+i]==NONE)
  209.    {
  210.    live_l++;
  211.    islive1=1;
  212.    isInt=true;
  213.    }
  214.    }
  215.   
  216.    for(i=1,isInt=false;i<5+1&&(x+i)<N&&(y-i)>=0&&isChessOn[x+i][y-i]!=(-1)*type;i++)
  217.    {
  218.    if(isChessOn[x+i][y-i]==type&&!isInt) successFactor_l++;
  219.    if(isChessOn[x+i][y-i]==NONE)
  220.    {
  221.    islive2=1;
  222.    live_l++;
  223.    isInt=true;
  224.    }
  225.    }
  226.    r.isLive[2]=islive1+islive2;
  227.    if(successFactor_l+live_l<5)  r.isLive[2]=0;
  228.    if(successFactor_l>=nn)
  229.    {
  230.    r.isLinkN=true;
  231.    // System.out.println("isLinkN=true is becanse Factor_l="+successFactor_l);
  232.    r.linknum[r.isLive[2]]++;
  233.    }
  234.   
  235.    islive1=0;
  236.    islive2=0;
  237.    for(i=0,isInt=false;i<5&&(x-i)>=0&&(y-i)>=0&&(isChessOn[x-i][y-i]!=(-1)*type);i++)//右斜有几个棋子相连
  238.    {
  239.    if(isChessOn[x-i][y-i]==type&&!isInt) successFactor_r++;
  240.    if(isChessOn[x-i][y-i]==NONE)
  241.    {
  242.    live_r++;
  243.    islive1=1;
  244.    isInt=true;
  245.    }
  246.    }
  247.   
  248.    for(i=1,isInt=false;i<5+1&&(x+i)<N&&(y+i)<N&&isChessOn[x+i][y+i]!=(-1)*type;i++)
  249.    {
  250.    if(isChessOn[x+i][y+i]==type&&!isInt) successFactor_r++;
  251.    if(isChessOn[x+i][y+i]==NONE)
  252.    {
  253.    islive2=1;
  254.    live_r++;
  255.    isInt=true;
  256.    }
  257.    }
  258.    r.isLive[3]=islive1+islive2;
  259.    if(successFactor_r+live_r<5)  r.isLive[2]=0;
  260.    if(successFactor_r>=nn)
  261.    {
  262.    r.isLinkN=true;
  263.    //System.out.println("isLinkN=true is becanse Factor_r="+successFactor_r);
  264.    r.linknum[r.isLive[3]]++;
  265.    }
  266.   
  267.    isChessOn[x][y]=old;
  268.    return r;
  269.    }
  270. private int haveOneInNGird(int x,int y,int type,int nn) //当前位置附近能连成一线的子最大有几个
  271. {
  272. int i=0;
  273.    int j=0;
  274.   
  275.    int successFactor_v=0; //横向五子连珠
  276.    int successFactor_h=0; //纵向五子连珠
  277.    int successFactor_l=0; //左斜线五子连珠
  278.    int successFactor_r=0; //右斜线五子连珠
  279.    int live_v=0; //空格数
  280.    int live_h=0;
  281.    int live_l=0;
  282.    int live_r=0;
  283.   
  284.   
  285.    int old=isChessOn[x][y];
  286.    LinkInfo r=new LinkInfo();
  287.    isChessOn[x][y]=type;
  288.   
  289.   
  290.    for(i=0;i<nn&&(x-i)>=0&&(isChessOn[x-i][y]!=(-1)*type);i++)//横向有几个棋子相连
  291.    {
  292.    if(isChessOn[x-i][y]==type) successFactor_v++;
  293.    if(isChessOn[x-i][y]==NONE)
  294.    {
  295.    live_v++;
  296.    }
  297.    }
  298.   
  299.    for(i=1;i<nn+1&&(x+i)<N&&isChessOn[x+i][y]!=(-1)*type;i++)
  300.    {
  301.    if(isChessOn[x+i][y]==type) successFactor_v++;
  302.    if(isChessOn[x+i][y]==NONE)
  303.    {
  304.    live_v++;
  305.    }
  306.    }
  307.   
  308.   
  309.    if(successFactor_v+live_v<5)
  310.    {
  311.    successFactor_v=0;
  312.    }
  313.   
  314.   
  315.    for(i=0;i<nn&&(y-i)>=0&&(isChessOn[x][y-i]!=(-1)*type);i++)//纵向有几个棋子相连
  316.    {
  317.    if(isChessOn[x][y-i]==type) successFactor_h++;
  318.    if(isChessOn[x][y-i]==NONE)
  319.    {
  320.    live_h++;
  321.    }
  322.    }
  323.   
  324.    for(i=1;i<nn+1&&(y+i)<N&&isChessOn[x][y+i]!=(-1)*type;i++)
  325.    {
  326.    if(isChessOn[x][y+i]==type) successFactor_h++;
  327.    if(isChessOn[x][y+i]==NONE)
  328.    {
  329.    live_h++;
  330.    }
  331.    }
  332.   
  333.    if(successFactor_h+live_h<5)
  334.    {
  335.    successFactor_h=0;
  336.    }
  337.   
  338.   
  339.    for(i=0;i<nn&&(x-i)>=0&&(y+i)<N&&(isChessOn[x-i][y+i]!=(-1)*type);i++)//左斜有几个棋子相连
  340.    {
  341.    if(isChessOn[x-i][y+i]==type) successFactor_l++;
  342.    if(isChessOn[x-i][y+i]==NONE)
  343.    {
  344.    live_l++;
  345.    }
  346.     }
  347.   
  348.    for(i=1;i<nn+1&&(x+i)<N&&(y-i)>=0&&isChessOn[x+i][y-i]!=(-1)*type;i++)
  349.    {
  350.    if(isChessOn[x+i][y-i]==type) successFactor_l++;
  351.    if(isChessOn[x+i][y-i]==NONE)
  352.    {
  353.    live_l++;
  354.    }
  355.    }
  356.     if(successFactor_l+live_l<5)
  357.    {
  358.    successFactor_l=0;
  359.    }
  360.   
  361.   
  362.    for(i=0;i<nn&&(x-i)>=0&&(y-i)>=0&&(isChessOn[x-i][y-i]!=(-1)*type);i++)//右斜有几个棋子相连
  363.    {
  364.    if(isChessOn[x-i][y-i]==type) successFactor_r++;
  365.    if(isChessOn[x-i][y-i]==NONE)
  366.    {
  367.    live_r++;
  368.    }
  369.    }
  370.   
  371.    for(i=1;i<nn+1&&(x+i)<N&&(y+i)<N&&isChessOn[x+i][y+i]!=(-1)*type;i++)
  372.    {
  373.    if(isChessOn[x+i][y+i]==type) successFactor_r++;
  374.    if(isChessOn[x+i][y+i]==NONE)
  375.    {
  376.    live_r++;
  377.    }
  378.    }
  379.    if(successFactor_r+live_r<5)  successFactor_r=0;
  380.   
  381.    isChessOn[x][y]=old;
  382.    int max=0;
  383.    if(successFactor_v>max) max=successFactor_v;
  384.    if(successFactor_h>max) max=successFactor_h;
  385.    if(successFactor_l>max) max=successFactor_l;
  386.    if(successFactor_r>max) max=successFactor_r;
  387.    return max;
  388. }
  389. private boolean isSuccess(int x,int y,int type) //判断是否胜利
  390. {
  391. return isLinkn(x,y,type,5).isLinkN;  
  392. }
  393. public int getPriv(int i,int j,int side) //获得当前位置的优先权值
  394. {
  395. LinkInfo linkinfo=new LinkInfo();
  396. int link1=0,link2=0;
  397. int priv=0;
  398. if(isChessOn[i][j]==NONE)
  399. {
  400. isChessOn[i][j]=side;
  401. if(isSuccess(i,j,side)) //如果下一步能分出胜负
  402. {
  403. priv=50000000;
  404. link1=5;
  405. }
  406. if(isSuccess(i,j,(-1)*side))
  407. {
  408. priv=40000000;
  409. link2=5;
  410. }
  411. linkinfo=isLinkn(i,j,side,4);
  412. if(linkinfo.isLinkN&&link1<4)//我能四
  413. {
  414. priv+=linkinfo.linknum[1]*150000+linkinfo.linknum[2]*2000000;
  415. link1=4;
  416. // System.out.println("Judge point x="+i+" y="+j);
  417. // System.out.println("Aha,I will 4 linked!priv+200,linkinfo:"+linkinfo);
  418. }
  419. linkinfo=isLinkn(i,j,(-1)*side,4);
  420. if(linkinfo.isLinkN&&link2<4)//敌能四
  421. {
  422. priv+=linkinfo.linknum[2]*300000;
  423. if(linkinfo.linknum[1]>1) priv+=15200*linkinfo.linknum[1];
  424. else priv+=4600*linkinfo.linknum[1];
  425. link2=4;
  426. // System.out.println("Judge point x="+i+" y="+j);
  427. // System.out.println("Ohoo,You will 4 linked!priv+70,linkinfo:"+linkinfo);
  428. }
  429. linkinfo=isLinkn(i,j,side,3);
  430. if(linkinfo.isLinkN&&link1<3)//我能三
  431. {
  432. priv+=linkinfo.linknum[1]*570+linkinfo.linknum[2]*18600*(step>2?1:0);
  433. link1=3;
  434. // System.out.println("Judge point x="+i+" y="+j);
  435. // System.out.println("Aha,I will 3 linked!priv+50,linkinfo:"+linkinfo);
  436. }
  437. linkinfo=isLinkn(i,j,(-1)*side,3);
  438. if(linkinfo.isLinkN&&link2<3)//敌能三
  439. {
  440. priv+=linkinfo.linknum[1]*1000+linkinfo.linknum[2]*4650;
  441. link2=3;
  442. // System.out.println("Judge point x="+i+" y="+j);
  443. // System.out.println("Ohoo,You will 3 linked!priv+40,linkinfo:"+linkinfo);
  444. }
  445. linkinfo=isLinkn(i,j,side,2);
  446. if(linkinfo.isLinkN&&link1<2)//我能二
  447. {
  448. priv+=linkinfo.linknum[1]*20+linkinfo.linknum[2]*1150;
  449. link1=2;
  450. // System.out.println("Judge point x="+i+" y="+j);
  451. // System.out.println("Aha,I will 2 linked!priv+20,linkinfo:"+linkinfo);
  452. }
  453. linkinfo=isLinkn(i,j,(-1)*side,2);
  454. if(linkinfo.isLinkN&&link2<2)//敌能二
  455. {
  456. priv+=linkinfo.linknum[1]*10+linkinfo.linknum[2]*140;
  457. link2=2;
  458. // System.out.println("Judge point x="+i+" y="+j);
  459. // System.out.println("Ohoo,You will 2 linked!priv+20,linkinfo:"+linkinfo);
  460. }
  461. int add=haveOneInNGird(i,j,side,5);
  462. priv+=add*100;
  463. // System.out.println("Have "+add+" chesses in a line!");
  464. // System.out.println("------priv="+priv+"  i="+i+"  j="+j);
  465. isChessOn[i][j]=NONE;
  466. }//endif
  467. return priv;
  468. }
  469. private Point next(int side) //计算机器人下步该走啥
  470. {
  471. Point r=new Point();
  472. LinkInfo linkinfo=new LinkInfo();
  473. int maxpriv=0;
  474. for(int i=0;i<N;i++)
  475. {
  476. for(int j=0;j<N;j++)
  477. {
  478. if(isChessOn[i][j]==NONE)
  479. {
  480. int priv=0;
  481. priv=getPriv(i,j,side);
  482. // System.out.println("maxpriv="+maxpriv);
  483. if(priv>=maxpriv)
  484. {
  485. maxpriv=priv;
  486. r.x=i;
  487. r.y=j;
  488. }
  489. }
  490. }//endfor
  491. }//endfor
  492. return r;
  493. }//endnext
  494. }//endclass