c++ - Card 和 Deck 类 C++

标签 c++

我是一名非常新手的程序员,创建 Card 和 Deck 类的任务让我有些头疼……我只需要朝正确的方向插入一下,因为我真的不知道自己在做什么。

我的卡头文件:

#ifndef CARD_H
#define CARD_H
#include <string>
#include <iostream>
using namespace std;
class Card
{
public:
    static const char SPADES = 'S';
    static const char CLUBS = 'C';
    static const char HEARTS = 'H';
    static const char DIAMONDS = 'D';

    Card();
    Card(int v, char s);

    const string toString();
    const int compareCard(const Card c);

private:
    int value;
    char suit;
};
#endif

我的卡片实现文件:

#include "Card.h"
#include <iostream>
#include <string>

using namespace std;

Card::Card(int v, char s)
{
    if (v < 1 || v > 13)
    { 
            cerr << "Invalid Card value";
    }
    else
    {
        value = v;
    }

    if ((s != SPADES) && (s != HEARTS) && (s != DIAMONDS) && (s != CLUBS))
    {
        cerr << "Invalid Suit name";
    }
    else
    {
        suit = s;
    }
}

const string Card::toString()
{
    string str; 

    switch (value)
    {   
        case 1: str = "Ace of ";    
            break;
        case 2: str = "Two of ";    
            break;
        case 3: str = "Three of ";  
            break;
        case 4: str = "Four of ";   
            break;
        case 5: str = "Five of ";   
            break;
        case 6: str = "Six of ";    
            break;
        case 7: str = "Seven of ";  
            break;
        case 8: str = "Eight of ";  
            break;
        case 9: str = "Nine of ";   
            break;
        case 10: str = "Ten of ";   
                 break;
        case 11: str = "Jack of ";  
            break;
        case 12: str = "Queen of ";
            break;
        case 13: str = "King of ";  
            break;
        default: cerr << "Invalid Card value";
    }//switch

    switch (suit) 
    {   
        case SPADES: str += "Spades";   
            break;
        case HEARTS: str += "Hearts";
            break;
        case DIAMONDS: str += "Diamonds"; 
            break;
        case CLUBS: str += "Clubs"; 
            break;
        default: cerr << "Invalid Card suit";
    }//switch

    return str; 
}

const int Card::compareCard(const Card c) 
{
     int result;

     if (value == c.value)
     {
         result = 0;
     }
     else if (value == 1)
     {
         result = 1;
     }
     else if (c.value == 1)
     {
         result = -1;
     }
     else if (value < c.value)
     {
         result = 1;
     }
     else
     {
         result = -1;
     }

     return result;
}//compareCard

我的 Deck 头文件:

#ifndef DECK_H
#define DECK_H
#include "Card.h"
#include <string>
using namespace std;
class Deck
{
public:
    Deck();
    Deck(int num);

    void addCard(Card c);
    Card getTopCard();
    Card peekTopCard();

    int getNumCards();
    bool isEmpty();

    void shuffleDeck(int list[], int size);
    void cutDeck();

private:
    static const int MAX = 52;
    static const int NUM_SUITS = 4;
    static const int NUM_VALUES = 13;
    int numCards;
    Card myCard[MAX];

};
#endif

我的 Deck 实现文件:

#include "Deck.h"
#include "Card.h"
#include <iostream>
#include <string>
#include <ctime>

using namespace std;

Deck::Deck()
{
    char suits[4] = {Card::SPADES, Card::HEARTS, Card::DIAMONDS,   Card::CLUBS};
    int count = 0;  

    for (int s = 0; s < 4; s++) 
    {
        for (int v = 1; v <= 13; v++)
        {
            myCard[count] = Card(v, suits[s]); 
            count++;
        }           
    }//for
    int numCards = 0;
}//Deck

Deck::Deck(int num)
{
    char suits[4] = {Card::SPADES, Card::HEARTS, Card::DIAMONDS, Card::CLUBS};
    int count = 0;

    for (int s = 0; s < NUM_SUITS; s++) 
    {
        for (int v = 1; v <= NUM_VALUES; v++)
        {
            myCard[count] = Card(v, suits[s]);
            count++;
        }           
    }//for

    if ((num < 0) || (num > MAX))
    {
        cerr << "Invalid number of cards in the deck";
    }
    numCards = num;
}//Deck



void Deck::addCard(Card c)
{   
    if(numCards == MAX)
    {
        cerr << "Attempt to add to full deck";
    }//if
    else
    {
        myCard[numCards] = c;
        numCards++;
    }//else
}//addCard

Card Deck::getTopCard()
{
    Card c;

    if (numCards > 0) 
    {   
        c = myCard[0];  
        for (int i = 1; i < numCards; i++) 
        {
            myCard[i - 1] = myCard[i];
        }
    numCards--; 
    } 
    else 
    {
        cerr<<"Cannot add card from an empty deck.";
    }
    return c;   
}//getTopCard

Card Deck::peekTopCard()
{
    Card c;     

    if (numCards > 0)
    {   
        c = myCard[0];
    } 
    else 
    {
        cerr<<"Cannot add card from an empty deck.";
    }
    return c;
}//peekTopCard

int Deck::getNumCards()
{
    return numCards;
}//getNumCards

bool Deck::isEmpty()
{
    bool empty = true;
    if (numCards == 0)
    {
        empty = true;
    }
    else
    {
        empty = false;
    }

    return empty;
}//isEmpty

void Deck:: shuffleDeck(int list[], int size)
{
    srand(time(0));
    for(int i = 0; i < size; i++)
    {
        int index = rand() % MAX;
        int temp = list[i];
        list[i] = list[index];
        list[index] = temp;
    }//for
}//shuffleDeck

最佳答案

当你开始一个新的代码库时,从小而简单开始,一次增加一点复杂性,在每一步都进行测试,在你引入下一个之前让每一个添加都完美地工作,并且永远不要添加到代码中不起作用

让我们从 Card 开始:

// Card.h
#ifndef CARD_H
#define CARD_H
class Card
{
 public:
  Card();

 private:
  int value;
 };
#endif


//Card.cc

#include "Card.h"

这编译。现在我们添加一个非默认构造函数,一个值的“getter”,并编写一个测试:

// in Card.h:

Card(int v);
int getValue();

// in Card.cc:

Card::Card(int v)
{
  value=v;
}

int Card::getValue()
{
  return(v);
}

// in testCard.cc:

#include <iostream>
#include "Card.h"
using namespace std;

int main()
{
  Card X(5);

  cout << "card is " << X.getValue() << endl;

  return(0);
}

这不会编译;它有一个错误。 在添加更多内容之前找到错误并修复它。

如果遇到无法解决的问题,请随时寻求帮助。当您开始使用 cutshuffle 时,您将轻松解决许多小问题。

编辑:

您在 Card.h 中声明了一个默认构造函数 (Card()),但您没有在 Car.cc 中定义它.在某些地方 Deck 试图构造一个没有参数的卡片(例如 Card c;),而链接器没有任何东西可以插入那里。将默认构造函数添加到 Card.cc

编辑:

而您的 shuffleDeck 看起来像是一项正在进行的工作。如果您遇到问题,我建议您先尝试实现 swapCards(int, int)

编辑:

您发布的代码属于两个类。是否有使用它们的主要例程?如果没有 main() 就无法在某处构建可执行文件(库是,可执行文件不是)。

编辑:

您应该能够使用现有的构建目标文件(Card.oDeck.o)。我建议您编写(构建并运行)一个测试例程,例如:

#include "Deck.h"
#include <iostream>
using namespace std;

int main()
{
  Deck D;
  D.addCard(Card(10,'D'));
  D.addCard(Card(4,'C'));
  cout << D.getNumCards() << endl;

  D.cutDeck();

  while(!D.isEmpty())
    {
      Card C = D.getTopCard();
      cout << C.toString() << endl;
    }

  return(0);
}

您应该一直这样做,以便在添加函数时测试它们。

关于c++ - Card 和 Deck 类 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12735129/

相关文章:

c++ - Qt Creator 仅显示 android 作为可用工具包

c++ - 字符串相乘的有效方法

c++ - Boost序列化异常错误

c++ - 顶点开关 DX

c++ - 为什么在析构函数中抛出异常时不调用重载删除?

c++ - 临时存储#define 宏值并重新使用它

c++ - CLion中的Arduino-ESP8266项目-如何正确编译项目?

c++ - 使用 winsock 进行文件传输 (c++)

c++ - 严格不起作用

C++ 使用类方法作为函数指针类型