练习 - 执行列表操作

已完成

你的团队对你目前为纸牌游戏编写的代码感到满意。 团队希望你进一步开发代码,并开始实现特定于游戏规则的逻辑,例如计算底牌的值。

对于本练习,使用列表模块中的一些函数。

计算游戏 31 的手牌

在纸牌游戏“31”中,两名或两名以上的玩家每人手中有三张牌。 纸牌点数最接近 31 的玩家将获胜。 每张牌都按自身的面值计算,例外情况如下:J、Q、K 按 10 分计算,A 按 11 分计算。 例如,一名玩家手里有 10、J 和 A 这三张牌,总计 31 分,因此,拥有这副底牌的玩家就是赢家。

在上一单元中,你创建了一副牌,每张牌用从 0 到 51 的数字表示。 若要开始计算底牌的面值,你需要将这些数字转换成纸牌领域中对应的内容。 例如,将数字“0”替换为名称“红桃 A”。

幸运的是,你的一位同事已经写好了该代码:

// 0 = 11, 11, 12, 13 = 10, else the actual number
let cardValue card =
    let value = card % 13
    if value = 0 then 11
    elif value = 10 || value = 11 || value = 12 then 10
    else value

复制上面的代码以在下面说明的步骤 2 中使用。

你的任务是抽出手牌,然后使用 sumBy() 函数计算其值。

  1. 通过调用空目录中的 dotnet new 来创建新项目:

    dotnet new console --language F# -o CardGame
    cd CardGame
    
  2. 在 main 方法的上方,添加刚才复制的同事的代码。

  3. 若要创建手牌,请添加以下代码:

    let hand = [0; 25; 31]
    
  4. 现在你已经创建了底牌,请添加 sumBy() 函数:

    let sum = List.sumBy(fun card -> cardValue card) hand
    printfn "%i" sum
    
  5. 通过调用 dotnet run 运行代码:

    dotnet run
    

    现在应会看到以下输出:

    26 
    

祝贺你! 你已经成功对实现纸牌游戏 31 点进行了评估。 虽然它变成了 26,而不是 31,但还是不错了。