[解決済み] カード・デッキクラス C++
質問
私は非常に初心者のプログラマーで、Card and Deckクラスを作成するという私の課題は、少し私の頭を越えています...私は本当に何をしているのか全く分からないので、正しい方向に少し押して欲しいのです。
私のCardヘッダーファイル。
#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
私のCard実装ファイルです。
#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);
}
これはコンパイルできません。バグがあります。 バグを見つけ、それを修正してから、さらに何かを追加してください。
どうしても解けない問題にぶつかったら、遠慮なく助けを求めてください。次のような問題に直面するまでに
cut
と
shuffle
を使えば、たくさんの小さな問題を簡単に解決することができます。
EDIT
デフォルトのコンストラクタを宣言し (
Card()
) の中で
Card.h
には定義していませんが
Car.cc
. という場所があります。
Deck
は引数なしでカードを構成しようとします(例.
Card c;
)、リンカはそこに差し込むものを何も持っていません。デフォルトのコンストラクタを
Card.cc
.
EDIT
そして、あなたの
shuffleDeck
は作業途中のようです。もし、問題があるようでしたら
swapCards(int, int)
をまず最初に使ってください。
EDITです。
投稿されたコードは2つのクラスになっていますね。それらを使用するメインルーチンはあるのでしょうか?がないと実行ファイルをビルドできません。
main()
のようなものです(ライブラリはそうですが、実行ファイルはそうではありません)。
EDITです。
オブジェクトファイル(
Card.o
と
Deck.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++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] static_cast, dynamic_cast, const_cast, reinterpret_cast はいつ使うべきですか?
-
[解決済み] コピーアンドスワップ慣用句とは?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] スマートポインターとは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 unsigned int vs. size_t
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み】構造体のベクター初期化について
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み】C++ - 適切なデフォルトコンストラクタがない [重複]。