亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ai.java

?? Eclipse高級編程3源碼(書本源碼)
?? JAVA
字號:
/***
 * Hex-7
 *  Version 2.0
 * www.mazeworks.com
 *
 *  Copyright (c) 2002 David Herzog
 *  All Rights Reserved.
 */


package com.bdaum.Hex.game;

import org.eclipse.swt.graphics.Point;

/******** AI ********
   generates computer moves
*/   
public final class AI {
   static final int PLAYER_WIN=-999999, COMPUTER_WIN=999999 ;
   static final byte hexes[][] = {
         // cols 0 and 1 hold all hexes from center outward
         // cols 2 and 3 hold 2nd-ply response move 
         // inner diamond
         {3,3,0,0},{2,2,3,4},{4,4,3,2},{3,2,3,3},{4,3,4,4},
         {2,3,2,2},{3,4,3,3},{4,2,3,3},{2,4,3,3},
         // middle ring
         {1,1,2,3},{5,5,4,3},{2,1,3,3},{5,4,5,5},{1,2,1,1},{4,5,3,3},
         {3,1,3,2},{5,3,4,2},{1,3,2,4},{3,5,3,4},{4,1,4,2},
         {5,2,3,3},{1,4,3,3},{2,5,2,4},{5,1,5,5},{1,5,1,1},
         // outer ring
         {0,0,1,2},{6,6,5,4},{1,0,3,3},{6,5,3,3},{0,1,3,3},{5,6,3,3},
         {2,0,3,3},{6,4,5,5},{0,2,1,1},{4,6,3,3},{3,0,3,3},{6,3,3,3},
         {0,3,3,3},{3,6,3,3},{4,0,3,3},{6,2,3,3},{0,4,3,3},{2,6,3,3},
         {5,0,3,3},{6,1,3,3},{0,5,3,3},{1,6,3,3},{6,0,3,3},{0,6,3,3} } ;
   private int ply, maxDepth ;
   private BestMove best ;
   private Point move ;
   private Board bd ;
   private StaticEval stat ;
   private Game game ;

   // constructor
   public AI(Board bd,StaticEval stat,Game game) {
      this.bd = bd ;
      this.stat = stat ;
      this.game = game ;
   }
   // main routine
   public void makeMove() { 
      ply = game.getPly() ; move = null ;
      if (ply<=2) move = openingMove() ;
      if (move==null) {
         // set search depth (ply)
         if (game.getLevel()==Game.LEVEL1) maxDepth = 4 ; 
         else maxDepth = 6 ;
         // search game tree
         best = abSearch(Game.COMPUTER,PLAYER_WIN,COMPUTER_WIN,0) ;
         move = best.getMove() ;
      }
      // if somehow there's still no move, make a random one
      if (move==null) move = randomMove() ;
      bd.computerMove(move,game.getColor(Game.COMPUTER)) ;
   }
   // returns random integer from 0 to n-1 inclusive
   private int randomInt(int n) { return (int)(n*Math.random()) ; }

   private Point randomMove() {
      int x, y ;

      while (true) {
         if (bd.isEmpty(x=randomInt(Game.SIZE),y=randomInt(Game.SIZE))) break ;
      }
      return new Point(x,y) ;
   }
   private Point openingMove() {
      if ((ply==2)&&(game.getLevel()==Game.LEVEL2)) {
         // search hexes array for response
         for (int i=0; i<hexes.length; i++)
            if (!bd.isEmpty(hexes[i][0],hexes[i][1]))
               return new Point(hexes[i][2],hexes[i][3]) ;         
      }
      // first move is always on inner diamond (except the center!) or 
      // the 2 hexes on main diagonal from middle ring (1-1 and 5-5)
      else if (ply==1) {
         int i = randomInt(10) + 1 ;
         return new Point(hexes[i][0],hexes[i][1]) ;
      }
      return null ;
   }
   // move generator
   private byte[] moveGen(int depth,int color) {
      // uses 3 main arrays:
      //    "list1" contains all possible moves for white & black, 
      //       with values from shallow search
      //    "list2" contains n-best moves, with values
      //    "ml" is final movelist: byte array with n-best moves only

      int temp[]=new int[3], moveListLength=0, list1ptr=0, list2ptr=0,
          list1[][]=new int[100][3], list2[][] ; 
      byte ml[] ;

      // generate list1
      for (int i=0; i<list1.length; i++ ) list1[i][2] = -999999 ;
      for (int i=0; i<hexes.length; i++) {
         // first get value of move for current color
         if (bd.setHex(hexes[i][0],hexes[i][1],color)) {
            list1[list1ptr][0] = hexes[i][0] ;
            list1[list1ptr][1] = hexes[i][1] ;
            list1[list1ptr][2] = stat.eval(color) ;
            bd.setEmpty(hexes[i][0],hexes[i][1]) ;

            if ((depth==0)&&(list1[list1ptr][2]==StaticEval.WIN_VALUE)) {
               // found winning move
               // return it alone NOW
               ml = new byte[1] ;
               ml[0] = (byte)( (list1[list1ptr][0]*10) + list1[list1ptr][1] ) ;
               return ml ;
            }
            else list1ptr++ ;
            // get value of Black move
            bd.setHex(hexes[i][0],hexes[i][1],game.getOtherColor(color)) ;
            list1[list1ptr][0] = hexes[i][0] ;
            list1[list1ptr][1] = hexes[i][1] ;
            list1[list1ptr++][2] = stat.eval(game.getOtherColor(color)) ;
            bd.setEmpty(hexes[i][0],hexes[i][1]) ;
         }
      }
      // set movelist max size
      if (game.getLevel()==Game.LEVEL1) moveListLength = 16 ;
      else {
         // at Advanced level, n-best is tapered
         if (depth<2) moveListLength = 16 ;
         else moveListLength = 14 ;
      }
      // initialize list2
      list2 = new int[moveListLength][3] ;
      // Shellsort list1 by value
      for (int h=list1.length/2; h>0; h/=2) {
         for (int i=h; i<list1.length; i++) {
            for (int k=0; k<3; k++) temp[k] = list1[i][k] ; 
            int j = i ;
            for ( ; j>=h && temp[2]>list1[j-h][2] ; j-=h)
               for (int k=0; k<3; k++) list1[j][k] = list1[j-h][k] ;

            for (int k=0; k<3; k++) list1[j][k] = temp[k] ;
         }
      }
      // copy top entries to list2
      // if duplicate move, add value of both entries
      list1ptr = list2ptr = 0 ;

      outer:
      while (list2ptr<moveListLength) {
         // quit if no more possible moves listed
         if (list1[list1ptr][2]==-999999) break ;
         for (int i=0; i<list2ptr; i++) {
            if ( (list1[list1ptr][0]==list2[i][0])&&
                 (list1[list1ptr][1]==list2[i][1]) ) {
               // duplicate found
               list2[i][2] += list1[list1ptr++][2] ;
               continue outer ;
            }
         }
         // copy entry to list2
         list2[list2ptr][0] = list1[list1ptr][0] ;
         list2[list2ptr][1] = list1[list1ptr][1] ;
         list2[list2ptr++][2] = list1[list1ptr++][2] ;
      }
      // now we know how big to make ml
      ml = new byte[list2ptr] ;
      // sort list2 by value
      for (int h=list2.length/2; h>0; h/=2) {
         for (int i=h; i<list2.length; i++) {
            for (int k=0; k<3; k++) temp[k] = list2[i][k] ; 
            int j = i ;
            for ( ; j>=h && temp[2]>list2[j-h][2] ; j-=h)
               for (int k=0; k<3; k++) list2[j][k] = list2[j-h][k] ;

            for (int k=0; k<3; k++) list2[j][k] = temp[k] ;
         }
      }
      // copy list2 to ml: 1-D byte array, and return
      for (int i=0; i<ml.length; i++) 
         ml[i] = (byte)( (list2[i][0]*10) + list2[i][1] ) ;
      return ml ;
   } 
   // negamax game tree search, with alpha-beta
   private BestMove abSearch(int side,int alpha,int beta,int depth) {
      int otherSide, baseCase, value, x, y ;
      int color = game.getColor(side) ;
      BestMove reply ;
      Point saveMove=null ;
      
      // base to end recursion
      baseCase = stat.eval(game.getColor(Game.COMPUTER)) ;
      if ((depth==maxDepth)||(baseCase==-100000)||(baseCase==100000)) 
         return new BestMove(baseCase) ;
      // cutoff for valuable computer move
      if ((depth==maxDepth-1)&&(baseCase>100)) 
         return new BestMove(baseCase) ;
      
      // set initial values
      if (side==Game.COMPUTER) { otherSide = Game.PLAYER ; value = alpha ; }
      else { otherSide = Game.COMPUTER ; value = beta ; }
      // loop through move list
      byte ml[] = moveGen(depth,color) ;
      for (int i=0; i<ml.length; i++) {
         x = (int)(ml[i]/10) ; y = ml[i] % 10 ;
         if (bd.setHex(x,y,color)) {
            reply = abSearch(otherSide,alpha,beta,depth+1) ;
            bd.setEmpty(x,y) ;
         
            if ( ((side==Game.COMPUTER)&&(reply.getValue()>value))||
                 ((side==Game.PLAYER)&&(reply.getValue()<value)) ) {
               // save better move 
               if (side==Game.COMPUTER) alpha = value = reply.getValue() ;
               else beta = value = reply.getValue() ;
               saveMove = new Point(x,y) ;
               // refutation
               if (alpha >= beta) break ;
            }
         }
      }
      return new BestMove(value,saveMove) ;
   }
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲女同女同女同女同女同69| 青青青伊人色综合久久| 香蕉久久夜色精品国产使用方法| 久久精品国产一区二区三 | 成人免费视频caoporn| 欧美探花视频资源| 国产日韩影视精品| 精品在线播放免费| 欧美日韩综合在线免费观看| 中文字幕av一区二区三区高| 亚洲电影在线播放| 91小宝寻花一区二区三区| 日韩你懂的在线播放| 有码一区二区三区| 成人性视频免费网站| 精品久久一区二区三区| 亚洲国产精品久久不卡毛片| av中文一区二区三区| 精品剧情v国产在线观看在线| 亚洲国产精品久久一线不卡| caoporm超碰国产精品| 久久综合久色欧美综合狠狠| 日本伊人精品一区二区三区观看方式| 欧美亚洲综合色| 最新成人av在线| 成人免费毛片a| 久久精品亚洲一区二区三区浴池| 秋霞电影一区二区| 日韩一区二区三区精品视频| 午夜欧美2019年伦理| 日本大香伊一区二区三区| 综合久久久久综合| 成人激情动漫在线观看| 中文字幕高清不卡| 成人伦理片在线| 中文字幕二三区不卡| 国产成人精品在线看| 久久伊人蜜桃av一区二区| 久久国产福利国产秒拍| 精品福利视频一区二区三区| 久草中文综合在线| 欧美tk—视频vk| 国产精品一线二线三线精华| 国产亚洲欧美日韩日本| 国产91精品在线观看| 国产精品网曝门| 91网站在线观看视频| 亚洲一二三级电影| 欧美一区二区在线免费观看| 久久99热国产| 国产欧美一区二区三区在线老狼| 福利一区在线观看| 亚洲精品乱码久久久久久| 欧美中文字幕一区二区三区| 亚洲成人资源网| 日韩精品一区二区三区视频播放 | 成人91在线观看| 亚洲欧美日韩中文字幕一区二区三区| 一本到高清视频免费精品| 亚洲综合自拍偷拍| 日韩亚洲欧美一区| 国产福利一区二区三区视频| 亚洲天堂中文字幕| 91福利精品视频| 久久精品国产精品亚洲精品| 中文在线免费一区三区高中清不卡 | 精品在线一区二区| 国产精品免费观看视频| 欧美日韩中文一区| 国产综合久久久久久久久久久久| 国产精品另类一区| 欧美电影一区二区三区| 国产精品资源网站| 一区二区三区电影在线播| 欧美mv和日韩mv的网站| 在线看一区二区| 美洲天堂一区二卡三卡四卡视频| 久久精品欧美日韩精品| 91成人免费在线| 国产一区啦啦啦在线观看| 亚洲人成人一区二区在线观看| 欧美一区二区免费观在线| 国产91综合一区在线观看| 亚洲成在人线在线播放| 国产精品理伦片| 日韩欧美第一区| 欧美在线色视频| 丁香六月综合激情| 麻豆高清免费国产一区| 一区二区三区日韩在线观看| 欧美精品一区二区三区视频| 欧美色国产精品| 99精品1区2区| 韩国理伦片一区二区三区在线播放| 亚洲欧美日韩国产综合| 国产午夜精品理论片a级大结局 | 成人永久aaa| 久久电影网站中文字幕| 亚洲一二三四区| 综合激情成人伊人| 国产亚洲成aⅴ人片在线观看| 91精品国产综合久久精品麻豆| 97se亚洲国产综合在线| 国产传媒日韩欧美成人| 男人的天堂久久精品| 亚洲精品成a人| 亚洲男帅同性gay1069| 国产精品福利一区二区三区| 久久亚洲欧美国产精品乐播 | 国产精品久久一卡二卡| 久久在线观看免费| 精品国产91洋老外米糕| 欧美大片国产精品| 欧美一卡二卡在线| 日韩西西人体444www| 欧美一区二区精美| 日韩丝袜美女视频| 日韩欧美你懂的| 精品少妇一区二区三区在线视频| 欧美一区二区在线视频| 日韩免费福利电影在线观看| 欧美电影在哪看比较好| 日韩一区二区三区在线视频| 欧美一卡2卡3卡4卡| 欧美一级欧美三级| 精品国产免费人成电影在线观看四季 | 国产真实乱偷精品视频免| 99国产精品一区| 91色porny蝌蚪| 在线观看亚洲精品视频| 欧美色综合天天久久综合精品| 欧美中文一区二区三区| 欧美日韩国产免费一区二区| 69堂成人精品免费视频| 欧美xxxxxxxx| 国产日韩av一区| 中文字幕一区二区三区在线观看| 亚洲欧美日韩电影| 亚洲大片精品永久免费| 免费观看成人av| 国产精品1区二区.| 99在线热播精品免费| 欧洲一区二区av| 日韩欧美一区中文| 国产日本欧美一区二区| 亚洲免费观看高清完整版在线观看| 一区二区三区在线视频观看 | 久久影院视频免费| 国产精品二区一区二区aⅴ污介绍| 一区二区三区在线不卡| 奇米777欧美一区二区| 狠狠色狠狠色综合系列| 972aa.com艺术欧美| 欧美精品三级日韩久久| 精品国产免费人成电影在线观看四季| 亚洲国产精品黑人久久久| 亚洲国产精品久久久男人的天堂| 精品一区在线看| 在线视频综合导航| 久久女同精品一区二区| 亚洲欧美国产三级| 精品一区二区免费| 91国偷自产一区二区三区成为亚洲经典 | 欧美日韩高清一区二区| 日本一区二区三区四区| 午夜欧美视频在线观看| 国产成人精品免费视频网站| 欧美午夜精品一区二区蜜桃| 精品播放一区二区| 亚洲午夜激情av| 成人午夜视频在线观看| 欧美一区二区视频在线观看2020| 中文字幕一区二区三区四区| 久久精品国产99| 色婷婷激情综合| 久久精品视频一区二区三区| 午夜av一区二区三区| av激情亚洲男人天堂| 精品欧美一区二区在线观看| 亚洲一二三四区| 99久久夜色精品国产网站| 精品国产一区二区国模嫣然| 亚洲一区二区三区自拍| 成人伦理片在线| 亚洲女同ⅹxx女同tv| 国产999精品久久| 2023国产精品| 日本不卡一二三区黄网| 欧美日韩在线播放三区四区| 中文字幕亚洲精品在线观看| 国产一区视频网站| 精品久久久久久久一区二区蜜臀| 亚洲线精品一区二区三区八戒| 99久久精品免费| 中文字幕色av一区二区三区| 国产99一区视频免费| 久久精品一区二区三区不卡牛牛| 美国欧美日韩国产在线播放| 在线成人av网站| 日韩激情视频网站|