練習 - 套用清單屬性

已完成

假設您是一家休閒遊戲公司的開發人員。 您的工作是建立一些可用於卡牌遊戲的起始程式碼。 您的第一項作業是建立一組牌堆,然後建立一個函式,從牌堆中一次抽取一張卡牌。

建立牌堆

卡牌組有 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 函式則用來存取手牌。 您也修改了傳回型別,所以其會傳回由牌堆和手牌 (deck.Tail, hand) 組成的元組,但另外加上新增的卡牌 firstCard

  3. 修改 main 方法中的程式碼,用手抽取卡牌:

    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 每次抽取卡牌的過程。