2013-12-11 73 views
0

我已經創建了一個用於從標準套牌(52張牌,沒有玩家)中表示撲克牌的數據結構(不知道它是否正確)。每張卡片都有黑桃,心形,鑽石或者俱樂部中的一種,以及其中一個王牌2,3,4,5,6,7,8,9,10,千斤頂,皇后,王:在SML中編寫比較撲克牌的函數

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.如果兩張牌的排名相同,則按以下順序排列:黑桃>心形>俱樂部>鑽石。

首先,我做了兩個子功能,讓每一個等級和花色獲取一個整數形式的值,這樣我以後可以比較這些整數,看是否一個卡是大於其他:

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

卡比較需要兩個階段:

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會更優雅用較少的情況下。考慮哪些情況可以合併。

+0

你是否建議在編號行列中使用'Num of int'之類的東西?如果是這樣,這會增加發生錯誤的機會。問題變量是離散的,並且表現得更好。 – lebowski