2014-12-02 2 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

브 루트 포스? 어떤 옵션이 있습니까? –

+2

이 줄로 판단 :'move = mRand.nextInt (getBOARD_SIZE()); '승리하는 움직임이 없다면 완전히 무작위로 보인다. 중간 사각형을 먼저 잡는 것과 같은 전략은 없다. –

+0

당신이 말하는 특정 섹션이 있습니까? 여기에는 알고리즘이라는 용어를 많이 사용하지 않습니다. – MrWizard54

답변

1

그들은 명시 적으로 세포보고를 통해 가능한 모든 경력 이동을 확인하고 있습니다.

나는 brute force algorithm으로 자격이 있다고 말하고 싶습니다.

+0

그것은 현재 이동에만 보입니다. –

0

깊이 제한 검색입니다. 그것은 1 앞서 움직입니다.

이길 수 있는지 확인합니다. 그것이 그것을 이길 수없는 경우에 인간이 이기게 할 것입니다 인간이 할 수있는 움직임이 있으면, 인간이이기는 것을 허용하는 움직임이있는 경우에, 그 때 그 반점을 가지고 간 ㄴ다는 것을 검사하십시오. 이 승리를 이동하거나 이동 부정 승리를 찾을 수없는 경우

은 거의 모든 가능한 검사를하고 임의의 빈 공간

0

을 선택합니다. Brute Force algorithm입니다.

+0

현재 이동을 보지 않습니다. –

+0

나중에 가능한 모든 이동을 의미합니다. – abhinav

관련 문제