1. 程式人生 > >五子棋AI演算法 Java實現

五子棋AI演算法 Java實現

五子棋AI演算法 也算是一個典型的遊戲AI演算法,一些棋類的AI演算法都可以參考實現,下面是Java實現程式碼

棋盤抽象介面

  1. import java.util.List;  
  2. publicinterface IChessboard {  
  3.     //取得棋盤最大橫座標
  4.     publicint getMaxX();  
  5.     //最大縱座標
  6.     publicint getMaxY();  
  7.     //取得當前所有空白點,這些點才可以下棋
  8.     public List<Point> getFreePoints();  
  9. }  

棋子類實現

  1. //棋子類
  2. publicclass Point {  
  3.     // 這了效能,設成公有
  4.     publicint x;  
  5.     publicint y;  
  6.     publicint getX() {  
  7.         return x;  
  8.     }  
  9.     public Point setX(int x) {  
  10.         this.x = x;  
  11.         returnthis;  
  12.     }  
  13.     publicint getY() {  
  14.         return y;  
  15.     }  
  16.     public
     Point setY(int y) {  
  17.         this.y = y;  
  18.         returnthis;  
  19.     }  
  20.     public Point(int x, int y) {  
  21.         this.x = x;  
  22.         this.y = y;  
  23.     }  
  24.     @Override
  25.     publicint hashCode() {  
  26.         return x + y;  
  27.     }  
  28.     @Override
  29.     publicboolean equals(Object obj) {  
  30.         if (this == obj)  
  31.             returntrue;  
  32.         Point other = (Point) obj;  
  33.         if (x != other.x)  
  34.             returnfalse;  
  35.         if (y != other.y)  
  36.             returnfalse;  
  37.         returntrue;  
  38.     }  
  39. }  
玩家抽象介面
  1. import java.util.List;  
  2. publicinterface IPlayer {  
  3.     //下一步棋子,傳入對手已經下的棋子集合
  4.     publicvoid run(List<Point> enemyPoints, Point point);  
  5.     publicboolean hasWin();  
  6.     publicvoid setChessboard(IChessboard chessboard);  
  7.     public List<Point> getMyPoints();  
  8. }  
玩家基礎抽象類
  1. import java.util.ArrayList;  
  2. import java.util.List;  
  3. publicabstractclass BasePlayer implements IPlayer {  
  4.     //我已下的棋子
  5.     protected List<Point> myPoints = new ArrayList<Point>(200);  
  6.     //棋盤
  7.     protected IChessboard chessboard;  
  8.     //棋盤最大橫座標和縱標,
  9.     protectedint maxX;  
  10.     protectedint maxY;  
  11.     //所有空白棋子
  12.     protected List<Point> allFreePoints;  
  13.     @Override
  14.     publicfinal List<Point> getMyPoints() {  
  15.         return myPoints;  
  16.     }  
  17.     @Override
  18.     publicvoid setChessboard(IChessboard chessboard) {  
  19.         this.chessboard = chessboard;  
  20.         allFreePoints = chessboard.getFreePoints();  
  21.         maxX = chessboard.getMaxX();  
  22.         maxY = chessboard.getMaxY();  
  23.         myPoints.clear();  
  24.     }  
  25.     privatefinal Point temp = new Point(00);  
  26.     //我是否是否贏了
  27.     publicfinalboolean hasWin(){  
  28.         if(myPoints.size()<5){  
  29.             returnfalse;  
  30.         }  
  31.         Point point = myPoints.get(myPoints.size()-1);  
  32.         int count = 1;  
  33.         int x=point.getX(),y=point.getY();  
  34.         //橫向--
  35.         temp.setX(x).setY(y);  
  36.         while (myPoints.contains(temp.setX(temp.getX()-1)) && temp.getX()>=0 && count<5) {  
  37.             count ++;  
  38.         }  
  39.         if(count>=5){  
  40.             returntrue;  
  41.         }  
  42.         temp.setX(x).setY(y);  
  43.         while (myPoints.contains(temp.setX(temp.getX()+1)) && temp.getX()<maxX && count<5) {  
  44. 相關推薦

    五子棋AI演算法 Java實現

    五子棋AI演算法 也算是一個典型的遊戲AI演算法,一些棋類的AI演算法都可以參考實現,下面是Java實現程式碼 棋盤抽象介面 import java.util.List;   publicinterface IChessboard {  

    五子棋AI演算法簡易實現(一)

    基礎篇 (1)勝負判定 五子棋的勝負判定的條件是其中一方下棋以後,橫線、豎線、右上斜線或者右下斜線任一方向出現五子相連,即可判定獲勝。此處用遞迴方法即可實現。 var is_win = false; var ModuleWinnerC

    基本排序演算法-java實現

    最近重新學習了排序演算法,之前每次看完當時理解了,但是過一段時間就又忘了,尤其是程式碼,如果放一段時間有很多base case不知道怎麼寫了,所以還是應該詳細的解讀一下再不斷了敲程式碼才能理解比較深刻。 1.氣泡排序(bubble sort) 氣泡排序是一種簡單的排序演算法。其基本思

    編輯距離演算法Java實現

    /** * 計算編輯距離Edit Distance * if i == 0 且 j == 0,edit(i, j) = 0 * if i == 0 且 j > 0,edit(i, j) = j * if i > 0 且j == 0,edit(i,

    分散式ID 雪花演算法JAVA實現

    少年不想寫,來吧:https://github.com/singgel/SnowFlake snowflake的結構如下(每部分用-分開): 概述 分散式系統中,有一些需要使用全域性唯一ID的場景,這種時候為了防止ID衝突可以使用36位的UUID,但是UUID有一些缺點,首先他相對比

    氣泡排序演算法java實現

    package algorithm; /** * 氣泡排序演算法 * @author su * */ public class BubbleSort { public static void main(String[] args) { int[] a = {6,2,5,4,7,1,

    0-1揹包問題—回溯演算法java實現

    0-1揹包問題 【問題描述】 有n種可選物品1,…,n ,放入容量為c的揹包內,使裝入的物品具有最大效益。 表示 n :物品個數 c :揹包容量 p1,p2, …, pn:個體物品效益值 w1,w2, …,wn:個體物品容量 【問題解析】 0-1揹包問題的解指:物品1,…,n的一種放

    推特雪花演算法 java實現

    package twiter.snowflake; /** * twitter的snowflake演算法 -- java實現 */ public class SnowFlake { /** * 起始的時間戳 */ private final static long

    最小生成樹Prim演算法java實現

    package prim; import java.util.*; public class PrimTest { public static void main(String[] args) { //互動輸入圖的鄰接矩陣表示,為方便測試,直接給定了鄰接矩陣值 // System

    Dijkstra演算法-Java實現

    給定n個城市,並建立一個n*n的距離矩陣來存放兩兩城市之間的距離,當兩個城市之間不能直達時,將距離記為無窮大。對矩陣進行初始化: for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) {

    反轉連結串列演算法Java實現

    之前遇到反轉連結串列的演算法,比較晦澀難解,但其實挺簡單的。 目標:將一個順序連結串列反轉。 思路:用三個輔助節點,每次實現一個節點的指向反轉,即他的後繼變為他的前驅。           三個輔助節點: p  q  r&n

    【資料結構與演算法-java實現】二 複雜度分析(下):最好、最壞、平均、均攤時間複雜度的概念

    上一篇文章學習了:如何分析、統計演算法的執行效率和資源消耗? 點選連結檢視上一篇文章:複雜度分析上 今天的文章學習以下內容: 最好情況時間複雜度 最壞情況時間複雜度 平均情況時間複雜度 均攤時間複雜度 1、最好與最壞情況時間複雜度 我們首先

    6種排序演算法java實現

    6種排序演算法 氣泡排序 選擇排序 插入排序 計數排序 快速排序 歸併排序 1)氣泡排序       相鄰的兩個數字比較排序,先將最大的交換到最後面,然後重複。 程式碼實現 2)選擇排序       從第一個位置開始,用某個位置依次與後邊所有元

    連結串列排序演算法java實現(連結串列的快速排序、插入排序、歸併排序)

    難易程度:★★ 重要性:★★★      連結串列的排序相對陣列的排序更為複雜些,也是考察求職者是否真正理解了排序演算法(而不是“死記硬背”) 連結串列的插入排序 public class LinkedInsertSort { static cla

    經典排序演算法java 實現

    排序演算法的好壞對於效率的影響十分顯著。好的排序演算法排序100萬個整數可能只需要一秒(不考慮硬體因素),不好的排序演算法可能需要一個小時甚至幾個小時。 常見的排序演算法有氣泡排序、插入排序、堆排序、快速排序等,這些排序都屬於基於比較的排序,因此這些演算法的時間

    Dijkstra演算法 java實現

    import java.util.HashMap; import java.util.HashSet; import java.util.Map.Entry; /** * * Dijkstra演算法 * 適用範圍:沒有權值為負數的邊 * */ // no ne

    KMP演算法java實現

    package algorithm; public class KmpSearch { public static void main(String[] args) { String s1 = "ABABCABAA"; char[] pattern = s1.to

    常見排序演算法Java實現

    目前最經典的排序演算法要屬:氣泡排序,快速排序,簡單插入排序,希爾排序,簡單選擇排序,堆排序,二路歸併排序,多路鬼 並排序,計數排序,桶排序,基數排序。以下就是這些常見演算法的Java實現,有興趣的可以自行實現。現在我們就來一個個分析 介紹一下各自的基礎思想和實現。講解這些演

    有權最短路徑問題:狄克斯特拉(Dijkstra)演算法 & Java 實現

    一、有權圖 之前我們知道,在無權重的圖中,求兩個頂點之間的最短路徑,可以使用 廣度優先搜尋 演算法。但是,當邊存在權重(也可以理解為路程的長度)時,廣度優先搜尋不再適用。 針對有權圖中的兩點間最短路徑,目前主要有 狄克斯特拉演算法 和 貝爾曼福德演算法 兩種解決

    MD5演算法java實現原始碼

    流程 處理需要加密的字串: 以byte[]的形式獲取,此時,每個字元為一個位元組,佔8位 當此時獲得的位元組流對512位,也就是64個位元組取餘,結果不為448,即56個位元組時,使用1000……0的二進位制位進行補位,直到取餘結果為448,;而當結果為448時