2010-07-05 11 views
1

나는 운동으로 다양한 언어로 tic-tac-toe를 작성해 왔으며 그 중 하나의 패턴은 모든 표현 I 유효한 유효 행을 정의하기 위해 실망스럽게 하드 코딩되었습니다. 이들은 일반적으로 두 가지 범주로 하락했다 :tic-tac-toe grid에서 유효한 모든 "행"을 표현하는 간결한 방법

먼저, 기판은 1 또는 2 차원 배열로 표현되며, 행 명시 위치 트리플릿에 의해 정의된다 (숫자는 빈 공간이다)

board = [1, x, 3, 4, o, 6, 7, 8, x] 

def match3(x,y,z) 
    board[x] == board[y] && board[y] == board[z] 
end 

def winner 
    match3(1,2,3) || match3(4,5,6) || ... 
end 

이것은 마법 같은 설명이 아닌 장점을 가지고 있지만, 장황한 것처럼 보입니다.

다른 접근법은 배열 배열을 사용하고 행을 map + reduce하는 것입니다. 그것은 약간 더 나은,하지만 나에게 모든 방법을 얻을하지 않습니다

board = [[nil, 1, nil], [nil, -1, nil], [nil, nil, 1]] 

def diag(x,y,z) 
    [board[x/3,x%3], board[y/3,y%3], board[z/3,z%3]] 
end 

def winner 
    rows = board + board.transpose << diag(0,4,8) << diag(2,4,6) 
    rows.map { |r| r.reduce(:&) }.reduce { |m,c| m || c } 
end 

수직 및 수평 일치 중대하다,하지만 난 여전히 대각선을 하드 코딩하고 있습니다.

명시 적 주소에 의존하지 않는 대각선 (또는 전혀 다른 접근 방식)을 특성화하는 방법에 대해 누구나 생각할 수 있습니까?

내 의사 코드는 Rubyish이지만 원하는 언어로 자유롭게 게시 할 수 있습니다. 나는 tic-tac-toe code 골프를 보았고, 그 중 일부 솔루션은 독창적이었습니다 (특히 마법의 사각형!) 나는 다소 덜 난해한 것을 찾고 있습니다.

답변

1

훨씬 더 빠르고 소형 인 시스템은 모든 사각형에 대해 하나의 비트를 사용합니다. 현재 위치는 두 개의 변수로 유지 될 수 있습니다 : X는 모든 "X"표시를, O는 모든 "O"표시를 유지합니다. 9 제곱에 대한 가능한 인코딩은 첫 번째 행이며, 상부 1+2+4=7/왼쪽> 바닥/1+16+256=273 오른쪽 대각선이 인코딩 예

1 2 4 
8 16 32 
64 128 256 

위한 것이다. X는 첫 번째 행에 승리하면 확인

def winner(p): 
    for m in (7, 56, 448, 73, 146, 292, 273, 84): 
     if p & m == m: return True 
    return False 
+0

흠, 흥미로운 ... 다만 if ((X & 7) == 7), 다른 검사가 유사하지만 대신 7. 다른 번호로 전체 승리를 확인하는 루틴이 될 것입니다. 그 계획에 움직임을 넣을 때'board | = 2 ** space'를 사용할 수도 있습니다. 점유 공간 확인은 'xboard & oboard & 2 ** space'가됩니다. 확실히 그것을 내가 모호하지 않다라고 말할 것인지 확신하지 못한다. :) 그러나 그것은 확실히 콤팩트하다. – seriousken