2013-04-12 4 views
0

minmax AI로 Java에서 간단한 체커 게임을 만들었지 만 작동하지 않습니다. 나는 minmax의 재귀 적 버전을 사용한다. 그러나 움직임이 가장 좋지는 않지만, 아마도 처음 생성 된 것이므로, 무언가 잘못되어있을 것이다.CheckMax 용 MinMax AI

public int minmax(int [][] board, int depth, int curPlayer){ 
    ArrayList<Move> moves = findMoves(curPlayer, board); 

    if (depth == 0 || moves.size() == 0){ 
     return heurValue(curPlayer, board); 
    } 

    int bestVal = 0; 
    if (curPlayer == GameCore.BLACK){ 
     bestVal = Integer.MIN_VALUE; 
     curPlayer = GameCore.RED; 
    }else{ 
     bestVal = Integer.MAX_VALUE; 
     curPlayer = GameCore.BLACK; 
    } 

    for(int i = 0; i<moves.size(); i++){ 
     Move m = moves.get(i); 

    int [][] boardNew = makeMove(m, board); 

    int value = minmax(boardNew, depth-1, curPlayer); 

    board = undoMove(m, boardNew); 

    // computer plays as black 
    if (curPlayer == GameCore.BLACK){ 
     if (value < bestVal){ 
      bestMove = m; 
      bestVal = value; 
     } 
    }else{ 
     if (value >= bestVal){ 
      bestMove = m; 
      bestVal = value; 
     } 
    } 
    } 
    return bestVal; 
} 

I 깊이 = 1 MINMAX를 호출하는 경우는 "7 개 값을 반환한다 (도 7 개 가능한 이동 임)하지만 2,4에서 3,3-로 이동하는 경우에만 1 반환하지만 때 내가 그것을 디버깅하려, ArrayList 이동 크기가 정확합니다. : (

편집 : "return"나는 실수로 첫 번째 조건을 의미합니다 (깊이가 0이거나 움직임이 비어 있음) 한 번만 발생하지만 올바른 경우 7 번 발생합니다. 내 나쁜 영어로 죄송합니다.

아시나요? 사이트, 어디 minmax에 대한 올바른 재귀 의사 코드 (더 나은 알파/베타, 왜냐하면 내가 그것을 확장해야합니다) 또는이 문제를 해결하는 데 도움이 될 수 있습니까? 그것은 사소한 일일뿐입니다. 감사합니다.

+0

질문을 올바르게 읽지는 않았지만'public int minmax (int [] [] board, int depth, int curPlayer)'int 형의 값 하나만 반환합니다. 많은 값을 반환하기를 원한다면'LinkedList'와 비슷한'Collection'을 돌려 줄 수 있습니다. –

+0

어디에서 boardNew를 선언 했습니까? – Joan

+0

RED (인간)가 게임을 시작하면, 자신의 차례 (컴퓨터가 작동) 후 minmax가 호출됩니다 (깊이 1의 테스트 용). 컴퓨터에는 7 가지 방법이 있습니다. MinMax는 7 개의 가능한 보드에 대해 7 개의 값을 반환해야하지만 그렇지 않습니다. bestMove는 전역 변수입니다. 내 하찮은 영어 실력에 죄송하다는 말씀을 드리고 싶습니다. – user2275785

답변

0

최상의 값, 즉 return bestVal; 만 반환하도록 작성했습니다. 모든 결과를 반환하려면 해당 값을 List에 저장하고 그에 따라 메소드 서명을 변경하십시오.

+0

죄송합니다. 실수로 문제를 공식화했지만 시간 내 주셔서 감사합니다. :) – user2275785

0

편집 : 그래서 처음 생각했을 때 서명 문제는 아닙니다.

은 내가 MINMAX의 algorythm에 대한 빠른 검색을 해봤이 내가이 페이지에서 중요하다고 생각하는 것은 내가 an article

빨리 발견 것입니다 : 여기

값은 얼마나 좋은를 나타냅니다 움직이다. 따라서 MAX 플레이어는 결국 가장 높은 값으로 이동을 선택하려고합니다.

그래서 내가 rigth 인 경우 MinMax는 bestValue 인 이동 하나만 반환합니다.

+0

아니 내 영어에 의해 발생합니다. 이 말은 (depth == 0 || moves.size() == 0) {return heurValue (curPlayer, board);} 이 7 번 발생하지 않는다는 것을 의미합니다. 그러나 어쨌든 귀하의 답변에 감사드립니다. – user2275785

+0

문제 없습니다. 나는 네이티브 스피커가 아니기 때문에 내가 어떻게 느끼는지 알 수있다.) –

+0

@ user2275785하지만 내가 틀렸다면 1을 반환하는 것이 좋지만 7 번해야한다. –