2014-09-08 4 views
0

Ruby에서 고모 쿠 게임을 구현하고 있습니다.이 게임은 15x15 보드에서 실행되는 tic-tac-toe의 변형이며, 5 O 또는 X를 수평, 수직 또는 수직으로 배치 한 첫 번째 플레이어입니다. 대각선 행 승.대각선 행의 루비 수 중복

첫째, 변수에 매트릭스를 할당하고 0에서 224까지 숫자를 채우기 때문에, 거기에 더 반복은없고 나중에

gomoku = Matrix.zero(15) 
num = 0 
15.times do |i| 
    15.times do |j| 
    gomoku[i, j] = num 
    num += 1 
    end 
end 

다음 선수가 번갈아 가며, 모든 후 나는 차례를 셀 수 방법 win?

def win? matrix 
    15.times do |i| 
    return true if matrix.row_vectors[i].chunk{|e| e}.map{|_, v| v.length}.max > 4 # thanks to sawa for this way of counting adjacent duplicates 
    return true if matrix.column_vectors[i].chunk{|e| e}.map{|_, v| v.length}.max > 4 
    end 
    return false 
end 

나는 아마 잘못하고 있어요 것을 알고 있지만, 제안은 환영하지만 내 문제는, 그 아니다으로 승리를 확인합니다. 문제는 대각선 행입니다. 대각선 줄에서 중복 수를 계산하는 방법을 모르겠습니다.

+0

'Matrix'는 불변이고'gomoku [i, j] = num'을 할 수 없어야합니다 ... – Amadan

+0

틀렸어, 방금 시도 했어 – budkin

+0

[표준 Ruby'Matrix' ] (http://www.ruby-doc.org/stdlib-2.1.2/libdoc/matrix/rdoc/Matrix.html#method-i-clone) : "... 이렇게 할 이유가 없어야합니다. 왜냐하면 * 행렬은 불변입니다 *. " 또한'Matrix # [] ='가 존재하지 않는 것에 유의하십시오. '[0, 0] = 1 ''은 Matrix [[0, 0], [0, 0] = 1을 호출하는 private 메소드'[] ='를 반환 할 것이다. 0]] : 행렬 (NoMethodError)'. 반면에 라이브러리를 사용하는 경우이를 지적하고 싶을 수도 있습니다. – Amadan

답변

1
diagonal_vectors = (-10 .. 10).flat_map do |x| 
    i = x < 0 ? 0 : x 
    j = x < 0 ? -x : 0 
    d = 15 - x.abs 
    [ 
    d.times.map { |k| 
     gomoku[i + k, j + k] 
    }, 
    d.times.map { |k| 
     gomoku[i + k, 14 - j - k] 
    } 
    ] 
end 

이렇게하면 sawa와 같은 테스트를 적용 할 수 있습니다.

편집 :이 무엇

대각선 볼 때 두 가지 종류가있다 : 아래에서 왼쪽으로 가고, 아래에서 오른쪽으로가는가. 지금 오른쪽 아래에 집중하겠습니다. 15x15 행렬에는 29 개의 오른쪽 아래 대각선이 있습니다. 하나는 첫 번째 행의 각 요소에서 시작하고, 하나는 첫 번째 열의 각 요소에서 시작하지만 하나는 [0, 0]에서 두 번째 행을 세지 않도록주의하십시오. 그러나 일부 대각선은 너무 짧기 때문에 처음 11 개의 행과 열에서 시작하는 대각선 만 가져오고 싶습니다 (다른 요소는 5 개의 요소보다 짧기 때문입니다). 첫 번째 세 줄은 다음과 같습니다. [i, j][10, 0], [9, 0] ... [0, 0], [0, 1], ... [0, 10]이됩니다. d은 그 위치에서 시작하는 대각선의 길이입니다. 그런 다음 d.times.map { |k| gomoku[i + k, j + k] }은 해당 대각선의 모든 요소를 ​​수집합니다. [10, 0] : d5 일 경우 [10, 0], [11, 1], [12, 2], [13, 3], [14, 4]입니다. 목록에있는 좌표에서 값을 수집합니다. 동시에 왼쪽 아래 대각선에서도 작업 할 것입니다. 그건 하나의 좌표를 뒤집는 다른 map의 일입니다. 따라서, 내부 블록은 두 개의 대각선, 하나는 왼쪽 아래, 하나는 오른쪽 아래의 두 요소 배열을 반환합니다. flat_map은 two-element 배열을 squilling하는 동안 iterating을 처리 할 것이기 때문에 대각선의 두 요소 배열의 배열이 아닌 하나의 거대한 대각선 배열을 얻습니다.

+0

대단히 감사합니다! 나는 이것을 완전히 이해하지는 못했지만 작동한다! – budkin