練習 - 套用清單屬性
假設您是一家休閒遊戲公司的開發人員。 您的工作是建立一些可用於卡牌遊戲的起始程式碼。 您的第一項作業是建立一組牌堆,然後建立一個函式,從牌堆中一次抽取一張卡牌。
建立牌堆
卡牌組有 52 張卡牌,但為了讓您更容易閱讀主控台上印出的內容,讓我們將牌堆縮減為五張卡牌。 您可以透過在清單中的第一個數字和最後一個數字間,插入兩個以空格括住的點 (..
) 來建立數字序列。
在主控台中,執行
dotnet new
以建立新專案:dotnet new console --language F# -o Cards cd Cards
若要在 Program.fs 檔案中建立保存卡牌的清單,請新增下列程式碼:
let cards = [ 0 .. 5 ]
此程式碼會建立從 0 到 5 的數字清單。
從牌堆中抽取卡牌
現在您已建立了牌堆,您可以建立用來從中抽取卡牌的方法。 若要執行這項操作,您可以使用內建的 Head
和 Tail
屬性。
接下來,建立函式
drawCard()
:let drawCard (list:int list) = printfn "%i" list.Head list.Tail
透過使用
Head
屬性,您會讀取清單中的第一個項目,並且藉由傳回Tail
,您可以模擬從清單的頂端抽取卡牌,然後傳回牌堆中剩餘的卡牌。若要測試您的實作,請將下列程式碼新增至
main()
方法:let result = cards |> drawCard |> drawCard // 0 1
呼叫
dotnet run
執行專案:您現在應該會在主控台中看到其印出
0
和1
。
恭喜! 您已實作可從中抽取卡牌的牌堆。
用手抽牌
能夠從牌堆中抽牌是很好的開始,但卡牌遊戲通常需要兩名以上的玩家來挑選這些卡牌。 如您所知,每個玩家所抽取的卡牌集合都稱為「手牌」。 接下來,您需要實作程式碼,將每個抽出的卡牌新增至手牌中。
請在宣告
cards
清單的位置新增下列程式碼:let hand = []
接下來,修改
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
。修改 main 方法中的程式碼,用手抽取卡牌:
let d, h = (cards, hand) |> drawCard |> drawCard printfn "Deck: %A Hand: %A" d h // Deck: [2; 3; 4; 5] Hand: [1; 0]
呼叫
dotnet run
執行專案:dotnet run
您應該會在主控台中看到其印出下列輸出:
Deck: [2; 3; 4; 5] Hand: [1; 0]
恭喜! 您設法模擬玩家 hand
每次抽取卡牌的過程。