2014-12-02 38 views
0

這是一個android tic tac toe遊戲的代碼。但我不明白他們使用什麼算法?任何人都可以告訴哪個算法在這裏使用?以下代碼的算法名稱是什麼?

package va.indiedevelopment.tictactoe; 

import java.util.Random; 

public class TicTacToeGame { 

    private char mBoard[]; 
    private final static int BOARD_SIZE = 9; 

    public static final char HUMAN_PLAYER = 'X'; 
    public static final char ANDROID_PLAYER = '0'; 
    public static final char EMPTY_SPACE = ' '; 

    private Random mRand; 

    public static int getBOARD_SIZE() { 
     return BOARD_SIZE; 
    } 

    public TicTacToeGame(){ 

     mBoard = new char[BOARD_SIZE]; 

     for (int i = 0; i < BOARD_SIZE; i++) 
      mBoard[i] = EMPTY_SPACE; 

     mRand = new Random(); 
    } 

    public void clearBoard() 
    { 
     for (int i = 0; i < BOARD_SIZE; i++) 
     { 
      mBoard[i] = EMPTY_SPACE; 
     } 
    } 

    public void setMove(char player, int location) 
    { 
     mBoard[location] = player; 
    } 

    public int getComputerMove() 
    { 
     int move; 

     for (int i = 0; i < getBOARD_SIZE(); i++) 
     { 
      if (mBoard[i] != HUMAN_PLAYER && mBoard[i] != ANDROID_PLAYER) 
      { 
       char curr = mBoard[i]; 
       mBoard[i] = ANDROID_PLAYER; 
       if (checkForWinner() == 3) 
       { 
        setMove(ANDROID_PLAYER, i); 
        return i; 
       } 
       else 
        mBoard[i] = curr; 
      } 
     } 

     for (int i = 0; i < getBOARD_SIZE(); i++) 
     { 
      if (mBoard[i] != HUMAN_PLAYER && mBoard[i] != ANDROID_PLAYER) 
      { 
       char curr = mBoard[i]; 
       mBoard[i] = HUMAN_PLAYER; 
       if (checkForWinner() == 2) 
       { 
        setMove(ANDROID_PLAYER, i); 
        return i; 
       } 
       else 
        mBoard[i] = curr; 
      } 
     } 

     do 
     { 
      move = mRand.nextInt(getBOARD_SIZE()); 
     } while (mBoard[move] == HUMAN_PLAYER || mBoard[move] == ANDROID_PLAYER); 

      setMove(ANDROID_PLAYER, move); 
     return move; 
    } 

    public int checkForWinner() 
    { 
     for (int i = 0; i <= 6; i += 3) 
     { 
      if (mBoard[i] == HUMAN_PLAYER && 
       mBoard[i+1] == HUMAN_PLAYER && 
       mBoard[i+2] == HUMAN_PLAYER) 
       return 2; 
      if (mBoard[i] == ANDROID_PLAYER && 
       mBoard[i+1] == ANDROID_PLAYER && 
       mBoard[i+2] == ANDROID_PLAYER) 
       return 3; 
     } 

     for (int i = 0; i <= 2; i++) 
     { 
      if (mBoard[i] == HUMAN_PLAYER && 
       mBoard[i+3] == HUMAN_PLAYER && 
       mBoard[i+6] == HUMAN_PLAYER) 
       return 2; 
      if (mBoard[i] == ANDROID_PLAYER && 
       mBoard[i+3] == ANDROID_PLAYER && 
       mBoard[i+6] == ANDROID_PLAYER) 
       return 3; 
     } 

     if ((mBoard[0] == HUMAN_PLAYER && 
      mBoard[4] == HUMAN_PLAYER && 
      mBoard[8] == HUMAN_PLAYER) || 
      mBoard[2] == HUMAN_PLAYER && 
      mBoard[4] == HUMAN_PLAYER && 
      mBoard[6] == HUMAN_PLAYER) 
      return 2; 
     if ((mBoard[0] == ANDROID_PLAYER && 
      mBoard[4] == ANDROID_PLAYER && 
      mBoard[8] == ANDROID_PLAYER) || 
      mBoard[2] == ANDROID_PLAYER && 
      mBoard[4] == ANDROID_PLAYER && 
      mBoard[6] == ANDROID_PLAYER) 
      return 3; 

     for (int i = 0; i < getBOARD_SIZE(); i++) 
     { 
      if (mBoard[i] != HUMAN_PLAYER && mBoard[i] != ANDROID_PLAYER) 
       return 0; 
     } 

     return 1; 
    } 
} 
+1

蠻力?有什麼選擇? – 2014-12-02 18:57:11

+2

用這一行來判斷:'move = mRand.nextInt(getBOARD_SIZE());'它看起來完全是隨機的,除非有一個勝利的舉動 - 沒有策略,比如先捕獲中間方塊。 – 2014-12-02 18:58:43

+0

有沒有你指的特定部分?這裏沒有太多,我會稱一個算法。 – MrWizard54 2014-12-02 18:59:10

回答

1

他們通過查看單元格明確檢查每個可能的獲勝移動。

我可以說這是合格的brute force algorithm

+0

它沒有,它只看當前的移動 – 2014-12-02 19:23:20

0

它的深度限制搜索。它向前看1步。

它檢查它是否能贏。如果它無法勝出,那麼就檢查一下,如果人類能夠做出讓人類獲勝的舉動,如果有讓人類獲勝的舉動,那麼就需要那個位置。

如果不能找到一個成功的舉動或贏否認移動它只是隨機選擇一個空白

0

它使得幾乎所有可能的檢查。 這是一個Brute Force algorithm

+0

它沒有,它只看當前的移動 – 2014-12-02 19:22:36

+0

我的意思是所有可能的舉動之後可以做出。 – abhinav 2014-12-02 19:30:34