2014-10-07 2 views
4

나는 느릅 나무에 대한 독립적 인 연구를하고있어, 나는 다시 한번 프로그램을 배우는 것 같아! 언어 학습 프로젝트로서, 나는 쉽게 블랙 잭을 켜고 실행하려고 노력하지만, 일단 시작하면 아직 얼마나 많이 파악하지 못했는지 깨달았습니다. 나는 갑판에서 카드를 뽑아서 목록에 추가 할 수 있습니다.느릅 나무 초급 : 블랙 잭 쓰기 시도

import Random 
import Mouse 
import Array 

--Build the deck 
faces = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] 
suits = ['H', 'D', 'C', 'S'] 

allCards faces suits = 
    case suits of 
    x :: xs -> family faces x ++ allCards faces xs 
    _ -> [] 

family faces suit = 
    case faces of 
    x :: xs -> (,) x suit :: family xs suit 
    _ -> [] 

deck = allCards faces suits 

rand : Signal Int 
rand = Random.range 0 (length deck-1) Mouse.clicks 

pickCard n = head <| drop n deck 
nextCard = lift pickCard rand 

yourHand = foldp (::) [] nextCard 

main = lift asText yourHand 

내 질문은 대부분 어떻게 계속해야하는지에 관한 것입니다. 완성 된 느릅 나무 프로젝트를 보는 것은 조금 도움이되지만, 많은 사람들이 나를 초보자로 파싱하기가 어렵습니다. 모든 종류의 방향이 도움이됩니다! 나는 그들이이 목록에서 그려진 카드를 필터링 할 수 dropCard deck card = filter (\card /= nextCard) deck 같은 것을 사용하여 그려하고 한 번 갑판에서 카드를 제거하는 방법을 알아 내려고 노력하고 있었다 첫 번째 문제의

  1. 하나. 그러나 느릅 나무에 대한 나의 이해는 신호가 변할 때마다 프로그램이 다시 평가된다는 것입니다. 즉, 카드가 그려 질 때마다 데크가 완전히 재생성된다는 의미입니다. 원래 갑판도 foldp해야합니까?

  2. 한 목록에서 요소를 제거하고 기능 프로그래밍에서 다른 요소를 추가하는 적절한 방법은 무엇입니까? 기능 구성, 예 : toHand . dropCard card?

  3. 승패를 결정하기 위해 카드 얼굴을 추가 할 때 목록에서 정수 값을 얻는 방법을 모르겠습니다. 나는 fst (head deck)을 시도했지만, 유형 오류가 발생했습니다. 아마도 갑판 자체가 어떤 종류의 신호이기 때문입니다. 내가 보지 못하는 것이 있습니까?

그렇다고해서 지금까지 엘름을 정말 좋아했습니다!

답변

7

질문

간단한 프로그램의 경우
  1. , 신호에 대해 생각하는 가장 쉬운 방법은 프로그램에서 어떤 일의 종류를 변경할 수 있습니다 생각입니다. 당신의 경우에 그것은 갑판과 손일 것입니다. 그런 다음 이러한 것들을 가져 와서 저장할 데이터 구조를 만듭니다. 그런 다음 전체 데이터 구조를 통해 foldp을 수행하므로 손을 추적하는 대신 데크를 추적 할 수 있습니다.
  2. 목록과 인덱스를 사용하고 목록의 해당 인덱스에있는 항목을 반환하고 해당 항목이 제거 된 목록을 반환 할 수 있습니다. 그런 다음 다른 목록에 항목을 추가하면 작업이 완료됩니다.
  3. fst (head deck)이 작동해야합니다. 아마도 시도했을 때 main 정의에서 lift을 삭제하는 것을 잊었을 것입니까? 아무것도 불분명 한 경우

예제 코드

-- This first part is your code: 
import Random 
import Mouse 
import Array 

--Build the deck 
faces = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] 
suits = ['H', 'D', 'C', 'S'] 

allCards faces suits = 
    case suits of 
    x :: xs -> family faces x ++ allCards faces xs 
    _ -> [] 

family faces suit = 
    case faces of 
    x :: xs -> (,) x suit :: family xs suit 
    _ -> [] 

-- Here come my additions/changes: 
-- Naming some types for clarity 
type Card = (Int,Char) 
type ProgramState = { deck : [Card], hand : [Card] } 

getFromList : Int -> [a] -> (a,[a]) 
getFromList index list = 
    let prefix = take index list 
     (item :: postfix) = drop index list 
    in (item, prefix ++ postfix) 

startState : ProgramState 
startState = { deck = allCards faces suits, hand = [] } 

rand : Signal Float 
rand = Random.float Mouse.clicks 

rFloatToInt : Float -> Int -> Int -> Int 
rFloatToInt rnd lo hi = round ((rnd + toFloat lo) * toFloat hi) 

pickCard : Float -> ProgramState -> ProgramState 
pickCard rnd {deck,hand} = 
    let index = rFloatToInt rnd 0 (length deck - 1) 
     (item, newDeck) = getFromList index deck 
    in { deck = newDeck, hand = item :: hand } 

programState : Signal ProgramState 
programState = foldp pickCard startState rand 

main : Signal Element 
main = lift asText programState 

알려주세요.

+1

감사합니다. 죄송합니다. 늦게 접수 한 것으로 표시하고 있지만 귀하의 답변은 매우 도움이되었습니다. 이 패러다임은 너무 달랐지 만 도전을 정말로 즐기고 있습니다. – Tinstar