연습 - 목록 속성 적용하기

완료됨

여러분이 캐주얼 게임 업체의 개발자라고 가정해 보겠습니다. 여러분은 카드 게임에 사용할 시작 코드를 작성해야 합니다. 첫 번째 과제는 카드 한 벌을 만들고 여기에서 한 번에 카드 하나를 뽑는 함수를 만드는 것입니다.

카드 한 벌 만들기

카드 한 벌은 52장의 카드로 이루어지지만, 여기서는 콘솔 출력을 쉽게 읽을 수 있도록 한 벌을 다섯 장으로 줄이겠습니다. 목록의 첫 번째 숫자와 마지막 숫자 사이에 앞뒤에 공백이 있는 점 두 개(..)를 삽입하여 숫자 계열을 만들 수 있습니다.

  1. 콘솔에서 dotnet new를 실행하여 새 프로젝트를 만듭니다.

    dotnet new console --language F# -o Cards
    cd Cards
    
  2. 카드를 포함하는 목록을 만들려면 Program.fs 파일에 다음 코드를 추가합니다.

    let cards = [ 0 .. 5 ]
    

    이 코드는 0부터 5까지의 숫자로 이루어진 목록을 만듭니다.

한 벌의 카드에서 카드 뽑기

카드 한 벌을 만들었으니 이제 여기에서 카드를 뽑는 메서드를 생성할 수 있습니다. 이렇게 하려면 기본 제공 속성인 HeadTail을 사용하면 됩니다.

  1. 그리고 함수drawCard()를 만듭니다.

    let drawCard (list:int list) = 
        printfn "%i" list.Head
        list.Tail 
    

    Head 속성을 사용하여 목록의 첫 번째 항목을 읽을 수 있고, Tail을 반환함으로써 목록의 맨 위에서 카드를 하나 뽑은 다음 나머지 카드를 돌려놓는 동작을 시뮬레이션할 수 있습니다.

  2. 구현을 직접 사용해 보려면 main() 메서드에 아래 코드를 추가합니다.

    let result = cards |> drawCard |> drawCard // 0 1
    
  3. dotnet run을(를) 호출하여 프로젝트를 실행합니다.

    콘솔에 01이 출력되는 것을 볼 수 있습니다.

축하합니다! 이렇게 해서 카드를 뽑을 수 있는 한 벌의 카드를 구현했습니다.

카드를 뽑아 손으로 가져오기

지금까지 카드 한 벌에서 카드를 뽑는 기능을 만들었는데, 카드 게임을 하려면 카드를 뽑을 둘 이상의 플레이어가 필요합니다. 아시다시피 각 플레이어가 뽑은 카드의 모음을 ‘핸드’라고 합니다. 이번에는 뽑은 카드를 핸드에 추가하는 코드를 구현해야 합니다.

  1. 앞에서 cards 목록을 선언한 코드에 다음 코드를 추가합니다.

    let hand = []
    
  2. 다음으로, 하나는 카드 한 벌을 나타내고 다른 하나는 핸드를 나타내는 두 개의 목록으로 구성된 튜플을 받도록 drawCard() 메서드를 수정합니다.

    let drawCard (tuple: int list * int list) = 
        let deck = fst tuple
        let draw = snd tuple
        let firstCard = deck.Head
        printfn "%i" firstCard
    
        let hand = 
            draw
            |> List.append [firstCard]
    
        (deck.Tail, hand)
    

    fst() 함수는 튜플(한 벌의 카드 중에서 플레이어가 뽑지 않은 나머지 카드인 ‘카드 더미’)의 첫 번째 속성에 액세스하는 데 사용됩니다. snd 함수는 핸드에 액세스하는 데 사용됩니다. 또한 카드 firstCard가 더해진 핸드와 카드 더미로 구성된 튜플 (deck.Tail, hand)을 반환하도록 반환 형식을 수정했습니다.

  3. 기본 메서드의 코드를 수정하여 뽑은 카드를 손으로 가져옵니다.

    let d, h = (cards, hand) |> drawCard |> drawCard
    
    printfn "Deck: %A Hand: %A" d h // Deck: [2; 3; 4; 5] Hand: [1; 0]
    
  4. dotnet run을(를) 호출하여 프로젝트를 실행합니다.

    dotnet run
    

    콘솔에 다음이 출력됩니다.

    Deck: [2; 3; 4; 5] Hand: [1; 0]
    

축하합니다! 카드를 뽑을 때마다 플레이어 즉 hand을(를) 시뮬레이트했습니다.