2017-10-31 8 views
0

9 개의 숫자가있는 보드 변수가있는 Clojure Tic Tac Toe 게임을 만듭니다. (def moves [0 0 0 0 0 0 0 0 0]). 이 변수는 1의 en 2로 채워집니다 (아직 "x"또는 "o"없음). 게임이 끝나면 변수는 [2 1 2 1 1 1 2 1 2]처럼 보일 수 있습니다. 여기서 1은 두 번째 행을 소유합니다. 이제 3 개가 연속적으로 있는지 확인하는 함수가 필요합니다. 나는 수평으로 시작하고 싶었다. 즉, 각 숫자가 같은 숫자 3 개가 연속적으로 있는지 확인하는 함수가 필요하다는 뜻입니다. 어떤 아이디어를 어떻게이 같은 함수를 만들 수 있습니까?Clojure : 행 검사기에서 같은 벡터 값

이 같은
(def moves [0 0 0 0 0 0 0 0 0]) 
(defn wongame? [playedmoved] 
    (
    (def counter 0) 
    ;action here.... 
    ) 
) 
(won moves) ;gives true/false 

답변

3

뭔가 작동합니다 : 그래서이 지금까지 기능 [2 1 2 1 1 1 2 1 2] (partition 3) 당신의 예 입력으로

(defn end-of-game? [moves] 
    (->> moves 
     (partition 3) 
     (remove #(= [0 0 0] %)) 
     (map (partial apply =)) 
     (some identity))) 

제공 :

((2 1 2) (1 1 1) (2 1 2)) 

각 목록에는 =을 사용해야합니다. =은 목록이 아닌 개별 인수로 작동하기 때문에 apply이 필요합니다. apply =의 매개 변수가 보류 중이므로 partial이 필요합니다. #(apply = %)이 동등하게 사용될 수 있습니다.

(false true false) 

some '은 (적어도) 하나 개 없음'에 대한 모든 것입니다. 여기에 전달 된 목록 중 하나가 사실이라면 그 중 하나가 반환됩니다.

true/false를 반환하는 대답이 필요한 경우 스레드 마지막 매크로 (->>)의 마지막 함수로 boolean을 호출하십시오. Clojure에서 실제로 true 또는 false를 반환해야하는 경우는 드물기 때문에 이것을 버렸습니다. 에 의존 할 수 있습니다.

이 기능은 수직으로도 작동합니다.

(defn transpose [matrix] 
    (apply mapv vector matrix)) 
다음

전에 입력을 패션, 그 출력 후 : 매트릭스를 위해 작동하는 일반 transpose 기능 (예 : [[0 0 0][0 0 0][0 0 0]])로 시작 처음에는

(defn transpose-flat [xs] 
    (->> xs 
     (partition 3) 
     transpose 
     (mapcat identity))) 
+0

넵,하지만 제 움직임은 9부터 시작합니다. 이는 메소드가 처음부터 true를 반환 함을 의미합니다. – Jelle

+0

그래서 3 연속이지만 0이 될 수 없습니까? –

+0

예, 1을 "x"로 2를 "o"로, 0을 채워지지 않은 공간으로 보입니다. – Jelle

2
(def moves [0 0 1 1 0 1 2 2 2]) #_"the game's state in the middle" 

, 우리의 경우 이 패턴과 같은 만남은 게임을 중지해야합니다. 그렇지 않으면 이동이 [2 2 1 1 1 1 2 2 2]와 같은 상태에 도달하면 이 우승자를 잘못 판단 할 수 있습니다. 승자는 어느 것입니까? 우리는이 기능을 게임의 매 턴마다 호출해야합니다.

둘째로, "won?" 이 함수는 승자에게 말하지 않고 게임이 끝났음을 알리기 때문에 적절하지 않습니다. "원?" 함수는 [ "게임이 끝났습니까?" "게임 끝?" "종료?"].

셋째,이 같은 게임의 승자를 반환 "승자"를 구현하려고 :

이 우리에게 게임의 승자를 알 수
(defn winner [moves] 
    (let [pattern-of-end {[1 1 1]:1 [2 2 2]:2}] 
    (->> moves   #_"I use threading macro to explain" 
     (partition 3) #_"group by each three symbols. 
          1 line of 9 elements -> 3 lines of 3 elements" 
     (keep pattern-of-end) #_"If there is some lines that matches 
            the pattern-of-end ,that will return [1] or [2]" 
     first   #_"Because the previous expression returns lazy-seq 
         we can get the scalar by calling first" 
))) 

.

+1

'winner'가 좋은 이름 일 수도 있습니다. 물음표는 사용하지 않겠습니다. 즉 함수가 거의 항상 술어로 사용될 것이라고 예상하지 않는 한'winner? '입니다. –

+0

당신의 의견에 완전히 동의합니다. –

2

당신은 X 및 o위한 적절한 번호가 있다면 그것은 더 쉬웠을 것입니다 : 심지어 승자 (15 또는 21)가 누구라고

(defn the-winner-is [moves] 
    (let [x 5 
      o 7] 
     (->> moves 
      (partition 3) 
      (map (partial apply +)) 
      (some #{15 21})))) 

이 방법.

(the-winner-is [5 5 7 7 7 0 7 7 7]) ; 21 
(the-winner-is [5 5 5 7 7 5 5 7 7]) ; 15 
(the-winner-is [5 7 5 7 7 5 5 7 5]) ; nil