2013-06-11 34 views
1

看看相關的大酒杯問題,有什麼更好的用於卡,或者製作一個字符串/項目或整數數組混淆混淆。數組爲二十一點卡,字符串或整數?

隨着我的大酒杯遊戲王牌只有11和10,J,Q和K都是價值10,無關緊要。什麼可以讓我更容易地使用字符串或整數對卡片進行編碼?

的Visual Studio C#2010,Windows窗體應用程序

+9

有趣的問題:沒有。我會創建一個專用的'Card'類,並且可能爲13個可能的值提供'enum'支持。 –

+0

聽起來更容易 –

+0

沒有「最好」或「舒適」的方式來做到這一點。有些人會說52個值的枚舉。其他人會說一個具有價值的「卡」對象,並且可能是西裝的枚舉。有些人可能會在同一個應用程序中找到兩個理由。你是否與從未做過面向對象的人一起工作?那麼也許你不應該使用一個對象。這些問題對於StackOverflow來說並不是很好的問題。用一種方法,並瞭解它爲什麼不起作用。但要認識到,在編程​​中沒有什麼「最好」的方式來做任何事情,因爲每個人的經驗和項目都不同。 –

回答

0

enum對13倍可能的值會是更好的主意

2

卡是一個對象,因此使之成爲自己的類。

應該使用套裝(心臟,鑽石,俱樂部,黑桃)的枚舉和Rank的枚舉(Ace,Jack,10等,爲了便於比較而相應排序)。你可以從西裝中派生顏色,所以我不會建議將顏色作爲構造函數的參數,因爲它是多餘的。你只需要構造函數中的這兩個字段,除非你計劃重複這些卡片,就像你在遊戲中使用多個卡片一樣。使用這些卡時,使用List或類似的類型是非常明智的,因爲很多排序操作都是內置的。當你需要洗牌時,使用Knuth shuffle!您可以很容易地在Google上找到它,它很容易實現,並且快速高效地工作。

這種方法來自我的CS教授,我也傾向於欣賞它。你的代碼模擬真實生活的越多,理解和擴展就越容易。你可以通過int或字符串常量來獲得,但它們是額外的工作,你不需要做,也不是優雅的。

public class Card 
{ 
    public Suit Suit { get; private set; } 
    public Rank Rank { get; private set; } 

    public Card(Suit suit, Rank rank) 
    { 
     this.suit = suit; 
     this.rank = rank; 
    } 
} 
2

字符串幾乎從來都不是實際文本以外的最佳內部表示法。字符串是爲了人;電腦使用數字。對於卡片來說,這是一件不容易的事情,因爲卡片通常需要按等級進行比較並按價值進行相加。它需要很少的代碼來告訴一個程序12> 11或加總數10,而不是告訴它「K」>「Q」或者加總數「J」。在內部使用字符串對於懶得學習數據表示的新手程序員來說很常見。

當然,在像C++這樣的面嚮對象語言中,你可以使用對象,但是那些持有卡片等級和套裝的對象的成員變量應該是整數,所以你可以索引查找表,比較範圍等等。

我寫了一篇關於卡片表示的文章here

對於二十一點,如果你不需要一個通用的卡片表示,那麼使用整數1到10是理想的。使用1作爲ace,而不是11,它會使你的總計算速度更快:你只需要從1到11提升一個ace,但是你需要從11降級到幾個1.

例如,if你有代表的手,這些整數數組,加入手總是這樣的(當然,充實了):

int total = 0, acefound = 0, soft = 0; 

for (int i = 0; i < cardsinhand; ++i) { 
    total += hand[i]; 
    if (1 == hand[i]) acefound = 1; 
} 
if (acefound && total < 12) { 
    soft = 1; 
    total += 10; 
} 

簡單,和快如閃電。如果你代表的是實際的牌,那麼你將擁有11,12,13等級的牌,然後在那裏添加一些像if (r > 10) r = 10;這樣的牌(另一個原因是讓牌1)。我可以在這樣的幾分鐘內模擬數十億手

+0

比我的答案要好得多,我應該花時間正確地佈置班級,而不是尋找快速答案,特別是我應該知道優化的粉絲比發佈這樣一個馬虎的答案更好,很高興的成員保留每個其他達到鼻菸在這個網站上! –

1

酒杯控制檯應用程序示例項目(C#)的GitHub:

https://github.com/koistya/Blackjack

public class Card 
{ 
    public Card(Rank rank, Suite suite) 
    { 
     this.Rank = rank; 
     this.Suite = suite; 
     this.IsFaceUp = true; 
    } 

    public Rank Rank { get; private set; } 

    public Suite Suite { get; private set; } 

    public bool IsFaceUp { get; private set; } 

    public void Flip() 
    { 
     this.IsFaceUp = !this.IsFaceUp; 
    } 
} 

public enum Rank : byte 
{ 
    Ace = 1, 
    Two = 2, 
    Three = 3, 
    Four = 4, 
    Five = 5, 
    Six = 6, 
    Seven = 7, 
    Eight = 8, 
    Nine = 9, 
    Ten = 10, 
    Jack = 11, 
    Queen = 12, 
    King = 13, 
} 

public enum Suite : byte 
{ 
    Club = 1, 
    Diamond = 2, 
    Heart = 3, 
    Spades = 4 
} 
相關問題