编写一个用于比较SML中的扑克牌的功能

时间:2013-12-11 16:58:24

标签: function sml smlnj

我已经创建了一个数据结构来代表扑克牌(不确定它是否正确)来自标准牌组(52张牌,没有玩家)。每张卡片都有黑桃,心形,钻石或俱乐部中的一种,其中一种是ace,2,3,4,5,6,7,8,9,10,杰克,女王,王:

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。 Ace被认为是最高等级,其次是国王,女王,杰克,10,9,......,2。如果两张牌具有相同等级,则按如下顺序排列:黑桃>心>俱乐部>钻石。

首先,我创建了两个子函数,以便每个rank和suit都以整数的形式获得一个值,以便我稍后可以比较这些整数,看看一张牌是否比另一张更大:

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

我如何从这里开始,有没有更好的方法呢?

1 个答案:

答案 0 :(得分: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会更加优雅,但案例更少。考虑哪些案例可以合并。