读书人

一个面向对象设计的考试题怎么建模一

发布时间: 2012-03-11 18:15:39 作者: rapoo

一个面向对象设计的考试题,如何建模一副扑克牌
去掉王,剩下52张,写一个类,实现洗牌,发牌的功能

注意洗牌要能把牌洗得随机,

下面是我的简单的思路,0-51表示牌

class cards
{
public:
void shuffle()
{
for(int i=0;i<52; i++)
m_cards.push_back(i);
}
int send()
{
if(m_cards.size()==0)
return -1;
else if(m_cards.size()==1)
{
int tmp=m_cards.back();
m_cards.pop_back();
return tmp;
}
else
{
int tmpIndex=rand()%m_cards.size();
int tmp=m_cards[tmpIndex];
m_cards.erase(m_cards.begin()+tmpIndex);
return tmp;
}
}
private:
std::vector<int> m_cards;
};

感觉应该有更好的解决方案,怎么样才能更OO?

[解决办法]

C/C++ code
enum Suit{    Spade = 0,    Heart,    Diamond,    Club};class Poker{private:    Suit m_suit;    int m_number;public:    Poker(Suit suit,int number)    {        m_suit = suit;        m_number = number;    }    string GetSuit()    {        string suit = "Spade";        if(m_suit == Heart)            suit = "Heart";        if(m_suit == Diamond)            suit = "Diamond";        if(m_suit == Club)            suit = "Club";        return suit;    }        friend ostream& operator <<(ostream& os, Poker* pk)    {        string suit = pk->GetSuit();        os << "[" << suit.c_str() << ":" << pk->m_number << "]";        return os;    }};class Cards{private:    vector<Poker*> m_cards;public:    Cards()    {        for(int i = 0 ; i < 52 ; i++)        {            m_cards.push_back(new Poker((Suit)(i / 13), (i % 13)+1));        }    }    void Output()    {        vector<Poker*>::iterator iter = m_cards.begin();        for(; iter != m_cards.end() ; iter++)        {            cout<<(Poker*)(*iter)<<endl;        }    }};int _tmain(int argc, _TCHAR* argv[]){    Cards *cards  = new Cards();    cards->Output();    int a = 0;    a = cin.get();    return 0;}
[解决办法]
改进了一下。。。顶楼上
C/C++ code
#include <iostream>#include <string>#include <vector>using namespace std;enum Suit{    Spade = 0,    Heart,    Diamond,    Club};class Poker{private:    Suit m_suit;    int m_number;public:    Poker(Suit suit,int number)    {        m_suit = suit;        m_number = number;    }    string GetSuit()    {        string suit = "Spade";        if(m_suit == Heart)            suit = "Heart";        if(m_suit == Diamond)            suit = "Diamond";        if(m_suit == Club)            suit = "Club";        return suit;    }        friend ostream& operator <<(ostream& os, Poker* pk)    {        string suit = pk->GetSuit();        os << "[" << suit.c_str() << ":" << pk->m_number << "]";        return os;    }};class Cards{private:    vector<Poker*> m_cards;public:    Cards()    {        for(int i = 0 ; i < 52 ; i++)        {            m_cards.push_back(new Poker((Suit)(i / 13), (i % 13)+1));        }        left = 52;    }    void Output()    {        iter = m_cards.begin();        for(; iter != m_cards.end() ; iter++)        {            cout<<(Poker*)(*iter)<<endl;        }    }    void GetACard()    {         srand( (unsigned)time(NULL));          int index=rand()%left;          iter = m_cards.begin();         Poker *p=m_cards[index];         m_cards.erase(iter+index);         cout<<(Poker*)(p)<<endl;           left--;    }    private:    vector<Poker*>::iterator iter;    unsigned int left ;};int main(int argc, char* argv[]){    Cards *cards  = new Cards();   // cards->Output();    int i=52;     while(i--)     {       cout<<i<<":";       cards->GetACard();          }    system("pause");    return 0;} 


[解决办法]
个人觉得
用0到51表示牌,这只是总的啊
发牌,洗牌的时候才会用到

而牌的类还是这样设计
牌实体类,花色枚举,
enum CardType//花色枚举
{
Heart,Diamond,Spade,Club
}

class CardEntity//牌实体类
{
private:
CardType m_type;//花色
int m_num;//大小
}

class CardCollection//牌集合类,发牌,洗牌用
{
public :
void shuffle();
//..
}

class CardStep
{
public :
static bool validate(CardStep step);//是否符合规则
//..
}

class CardContext//当前上下文

。。。
总之,楼主边做边写了
一个牌的程序,需要不少类的,我原来写过

读书人网 >C++

热点推荐