10 年ぶりに C++ に戻ってきたので、ASCII BlackJack ゲームを試してプログラミングすることにしました。デックとプレイヤーの手の両方を保持するためにベクターを使用することにしましたが、2 枚のカードを DEALER ベクター ハンドと PLAYER ベクター ハンドの両方に割り当てる必要がある初期ディール関数を呼び出すと、カードは問題なく書き込まれますが、それが出てきて、後で手を印刷したいのですが、範囲外の例外が発生します。
以下のコードスニペット!
void deck::initialDeal(player dealer, player player1)
{
for(int i = 0; i < 2 ; i++)
{
dealer.addHand(myDeck[i]);
myDeck.erase(myDeck.begin());
player1.addHand(myDeck[i]);
myDeck.erase(myDeck.begin());
}
}
上記は、メイン デッキから数枚のカードを取得し、addHand ルーチンを呼び出して、そのカードをプレイヤーのベクター ハンドに追加するだけです。
void player::addHand(card dealtCard)
{
hand.push_back(dealtCard);
}
addHand 関数内に手のベクトルを出力するルーチンを入れると、正常に動作し、データが入れられたことがわかります。
ただし、後で手を画面に出力したいので、printHand() という別の関数を用意します。
void player::printHand()
{
if (dealer == true)
{
cout << hand[0].getNumber() << hand[0].getSuit() << " ";
cout << hand.size() << endl;
}
else
{
for(std::vector<card>::size_type x = 0 ; x != hand.size() ; x++)
{
cout << hand[x].getNumber() << hand[x].getSuit() << " ";
}
}
}
現時点では、ディーラー側を扱っているだけなので、関数のディーラー ブランチに入り、エラーが発生します。
addHand() 関数で作成されたデータは、完了すると削除されるため、ここでポインターを使用する必要があったのではないでしょうか?