演習 - ループを使用する

完了済み

この演習では、開発中のトランプ ゲーム用のカード デッキを構築します。 ループ コンストラクトを使用してカードを反復処理し、カードを画面に出力します。 同僚の懸命な作業もあって、最初の演習で作成したコードが関数に組み込まれました。

プロジェクトをスキャフォールディングする

まず、コンソールで新しい F# プロジェクトをスキャフォールディングします。 コマンド dotnet new を実行します。

dotnet new console --language F# -o Loops
cd Loops

カードの説明を作成する

前の演習で作成したコードは、同僚が関数に組み込んでくれたことで、再利用可能になりました。 現在のコードは次のようになります。

let cardDescription (card: int) : string =
    let cardNo: int = card % 13
    if cardNo = 1 then "Ace"
    elif cardNo = 11 then "Jack"
    elif cardNo = 12 then "Queen"
    elif cardNo = 0 then "King"
    else string cardNo

カードの説明を作成するには:

  1. Program.fs で、内容を次のコードに置き換えます。

    open System
    
    let cardDescription (card: int) : string =
        let cardNo: int = card % 13
        if cardNo = 1 then "Ace"
        elif cardNo = 11 then "Jack"
        elif cardNo = 12 then "Queen"
        elif cardNo = 0 then "King"
        else string cardNo
    
    [<EntryPoint>]
    let main argv =
        // implement the rest
        0 // return an integer exit code
    

    関数の名前は cardDescription で、入力パラメーターは card です。 同僚から、使用するコード スニペットが提供されました。 同様の関数を実装してほしいとのことですが、関数によってカードがどのスーツかを決定します。 次のコード スニペットが提供されました。

    let suit (no:int) : string = 
        let suitNo:int = no / 13
        // add implementation here 
    

    次に、if...else について得た知識を使って、カードがどのスーツかを決定します。 0 はハート、1 はスペード、2 はダイヤ、3 はクラブというルールです。

    ヒント

    次に進む前に、一息ついて知識を適用する方法について考えてみてください。

  2. コードに次の変更を加えます。

    let suit (no:int) : string = 
        let suitNo:int = no / 13
        if suitNo = 0 then "Hearts"
        elif suitNo = 1 then "Spades"
        elif suitNo = 2 then "Diamonds"
        else "Clubs" 
    

    Program.fs のコードは、次の例のようになります。

    open System
    
    let suit (no:int) : string = 
        let suitNo:int = no / 13
        if suitNo = 0 then "Hearts"
        elif suitNo = 1 then "Spades"
        elif suitNo = 2 then "Diamonds"
        else "Clubs" 
    
    let cardDescription (card: int) : string =
        let cardNo: int = card % 13
        if cardNo = 1 then "Ace"
        elif cardNo = 11 then "Jack"
        elif cardNo = 12 then "Queen"
        elif cardNo = 0 then "King"
        else string cardNo
    
    [<EntryPoint>]
    let main argv =
        // implement program
        0 // return an integer exit code
    

お疲れさまでした。トランプ ゲームのこの部分は終了です。

同僚がカード デッキを作るのを手伝ってくれました。 あなたが行う必要があるのは、それを出力することだけです。 カードの組のコードをこちらに示します。

let cards = [ 1; 10; 2; 34 ]

デッキを出力するには:

  1. cards の定義を main() メソッドに追加します。

     [<EntryPoint>]
     let main argv =
         let cards = [ 1; 10; 2; 34 ]
         // implement program
         0 // return an integer exit code
    

    この組には 4 枚のカードしか含まれていません。 より現実的な実装では、コードに 52 枚のカードをすべて含めますが、例としてはこの一覧で十分です。

    同僚がここでもコードを記述してくれました。 あなたは、不足しているものを入力するだけです。 コード スニペットはこちらです。

    // add for loop
      printfn "%s of %s" (cardDescription(card)) (suit(card))
    

    このコードは、コメントアウトされた行で構成されています。 あなたの仕事は、for...in ループを実装するコードを追加することです。

  2. 次のコードを main() メソッドに追加して、for...in ループを実装します。

    for card in cards do
      printfn "%s of %s" (cardDescription(card)) (suit(card))
    

    main() メソッドは、次のコードのようになるはずです。

    [<EntryPoint>]
    let main argv =
        let cards = [ 1; 10; 2; 34 ]
        for card in cards do
          printfn "%s of %s" (cardDescription(card)) (suit(card))
        0 // return an integer exit code
    
  3. dotnet run を呼び出してプロジェクトを実行します。

    dotnet run
    

    次の出力が表示されます。

    Ace of Hearts 
    10 of Hearts
    2 of Hearts
    8 of Diamonds 
    

おめでとうございます。 ご自分と同僚が実装したコードを使って開発し、より本物そっくりのプログラムを作りました。

Program.fs は次のコードのようになります。

open System

let suit (no:int) : string = 
    let suitNo:int = no / 13
    if suitNo = 0 then "Hearts"
    elif suitNo = 1 then "Spades"
    elif suitNo = 2 then "Diamonds"
    else "Clubs" 

let cardDescription (card: int) : string =
    let cardNo: int = card % 13
    if cardNo = 1 then "Ace"
    elif cardNo = 11 then "Jack"
    elif cardNo = 12 then "Queen"
    elif cardNo = 0 then "King"
    else string cardNo

[<EntryPoint>]
let main argv =

    let cards = [ 1; 10; 2; 34 ]

    for card in cards do
      printfn "%s of %s" (cardDescription(card)) (suit(card))
    0 // return an integer exit code