【问题标题】:Write a function for comparing playing cards in SML在 SML 中编写一个比较扑克牌的函数
【发布时间】:2013-12-29 18:53:28
【问题描述】:

我创建了一个数据结构,用于表示标准牌组(52 张牌,没有小丑)中的扑克牌(不确定是否正确)。每张牌都有黑桃、红心、方块或梅花花色之一,以及 A、2、3、4、5、6、7、8、9、10、J、Q、K 等等级之一:

datatype suit = spades | hearts | diamonds | clubs
datatype rank = ace | king | queen | jack | ten | nine | eight | seven | six | five | four | three | two
type playing_card = suit * rank

下一步是编写一个函数greaterCard,它对我刚刚在上面声明的新数据类型进行操作。该函数应以两张扑克牌作为参数。如果第一张卡的值高于第二张卡,则该函数应返回true,否则返回false。王牌被认为是最高的等级,其次是国王、王后、杰克、10、9、...、2。如果两张牌的等级相同,花色的顺序如下:黑桃 > 红心 > 梅花 > 方块。

首先我做了两个子函数,这样每个等级和花色都以整数的形式得到一个值,这样我以后就可以比较这些整数来判断一张牌是否大于另一张牌:

fun value_of_rank rank =                                      
case rank of
   ace => 14
 | king => 13
 | queen => 12
 | jack => 11
 | ten  => 10
 | nine => 9
 ...
 | two => 2 

还有:

fun value_of_suit suit =
case suit of
   spades => 4
 | hearts => 3
 | diamonds => 2
 | clubs => 1

我该如何从这里开始,还有更好的方法吗?

【问题讨论】:

    标签: function sml smlnj


    【解决方案1】:

    卡片比较需要两个阶段:

    fun compare_cards(c1,c2)
      let val val_c1 = value_of_rank(c1)
          val val_c2 = value_of_rank(c2)
      in 
          if val_c1 = val_c2
          then compare_on_suit
          else compare_on_rank
      end
    

    另外,value_of_rank 会更优雅,但案例更少。考虑哪些情况可以合并。

    【讨论】:

    • 您是否建议使用Num of int 之类的东西作为编号排名?如果是这样,这将增加出错的机会。问题变量是离散的,最好这样表示。
    猜你喜欢
    • 2023-03-05
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 2014-04-25
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多