F #

2011-02-22 5 views
5

에서 반복 반복자 만들기 저는 체커와 같은 게임을 구현하고 있습니다. 주어진 구성에 대한 모든 법적 이동을 나열하는 시퀀스가 ​​필요합니다.F #

내가 직접 C#을 번역 다음과 같은 기능을 가지고 :

seq { 
    for y1 = 0 to BOARDSIZE-1 do 
     for x1 = 0 to BOARDSIZE-1 do 
      for dy = -2 to 2 do 
       for dx = -2 to 2 do 
        let x2 = x1 + dx; 
        let y2 = y1 + dy; 
        let currentMove = new MoveStruct(x1, y1, x2, y2); 
        if (currentMove.SomeCondition = true) then 
          yield currentMove; 
    } 

그것은 작동을하지만, 꽤 "F 번호 방식", 홀로 어색한, 그리고 내가 가지고 몰래 의심 무슨 I 여기에서하는 것은 성능이 최적이 아닙니다.

필자가 원하는 것은 "모든 셀에서 반복", "이 셀에서 유효한 모든 이동을 반복"의 조합을 사용하는 무언가로 이것을 "평평하게"하는 것입니다. 때문에,

let AllCells = 
    seq { 
     for y=0 to BOARDSIZE-1 do 
      for x=0 to BOARDSIZE-1 do 
       yield (x,y); 
    }; 

let LegalMovesAround(x1,y1) = 
    seq { 
     if board.[x1, y1] = WHITE then 
     for dy = -2 to 2 do 
      for dx = -2 to 2 do 
       let x2 = x1 + dx; 
       let y2 = y1 + dy; 
       let currentMove = new MoveStruct(x1, y1, x2, y2); 
       if (currentMove.DetermineMoveType <> MoveType.ILLEGAL 
        && board.[x2, y2] = NONE) then 
         yield currentMove; 
    } 

나는 그것이 작동하도록 당신에게 내 다양한 ​​시도의 세부 사항을 아끼지거야을 :

그리고 여기에 내가 결합 바라고 있어요 기능입니다 그들 중 누구도 성공하지 못했습니다. 그러나 긴 이야기를 짧게하기 위해 제가 생각할 수있는 최선의 방법은 찾고있는 평평한 버전이 아닌 단순한 MoveStruct를 반환하는 seq를 반환하는 반복기입니다.

누구나 AllCells와 LegalMovesAround (x, y)를 결합하는 좋은 방법이 있습니까?

감사합니다, 하기 Aleks

답변

1

당신은 이런 식으로 뭔가를 그들에게이 방법을 결합하고 평평하게 할 수 있어야한다이 :

let validMoves = 
    AllCells 
    |> Seq.collect LegalMovesAround 
    |> Seq.distinct 

그것은 비록 최고의 솔루션의 성능 현명하지 않을 수 있습니다.

편집 : Tomas 주석에 따른 고정 샘플 코드

+0

게으른 시퀀스와 부작용을 혼합주의! 보드가 돌연변이 된 경우, 전체 서열이 언제 평가되는지 명확히 이해하는 것이 중요합니다. Seq.distinct를 호출하면 위험 해 보입니다. – Joh

+0

위의 내 의견에 신경 쓰지 마라. 이동 트리를 내려 가기 전에 Seq.distinct가 호출 될 것이다. – Joh

+1

이것은 유형을 확인하지 않습니다. 나는'legalMovesAround'가'Seq.collect'의 인자가되어야한다고 생각합니다. –

3

수율을 사용할 수 있습니다! 새로운 시퀀스 식 :

let allLegalMoves = seq { 
    for cell in AllCells do 
    yield! LegalMovesAround cell 
} 
3

당신은 yield! 알고 있습니까?

뭔가

같은
seq { 
    for x,y in Allcells do 
     yield! LMA(x,y) 
} 
+0

이 솔루션은 각 수율의 시퀀스를 반환한다는 점을 제외하고는 작동하지만 MoveStruct를 반환하는 것이 더 좋습니다. 호출자는 구현 세부 정보를 알 필요가 없습니다. – user627943

+0

아니요, MoveStruct가됩니다. 시도 해봐. – Brian

+0

사실입니다. 마술처럼 작동합니다. – user627943