我已经创建了一个数据结构来代表扑克牌(不确定它是否正确)来自标准牌组(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
我如何从这里开始,有没有更好的方法呢?
答案 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
会更加优雅,但案例更少。考虑哪些案例可以合并。