一个面向对象设计的考试题,如何建模一副扑克牌
去掉王,剩下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?
[解决办法]
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;}
[解决办法]
改进了一下。。。顶楼上
#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//当前上下文
。。。
总之,楼主边做边写了
一个牌的程序,需要不少类的,我原来写过