나는 운동으로 다양한 언어로 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 골프를 보았고, 그 중 일부 솔루션은 독창적이었습니다 (특히 마법의 사각형!) 나는 다소 덜 난해한 것을 찾고 있습니다.
흠, 흥미로운 ... 다만
if ((X & 7) == 7)
, 다른 검사가 유사하지만 대신 7. 다른 번호로 전체 승리를 확인하는 루틴이 될 것입니다. 그 계획에 움직임을 넣을 때'board | = 2 ** space'를 사용할 수도 있습니다. 점유 공간 확인은 'xboard & oboard & 2 ** space'가됩니다. 확실히 그것을 내가 모호하지 않다라고 말할 것인지 확신하지 못한다. :) 그러나 그것은 확실히 콤팩트하다. – seriousken