[解決済み] C++ブラックジャックプログラムを修正する方法を見つけ出す問題 [重複].
質問
私は現在、1人用で1~10までのカードしかない簡単なブラックジャックのプログラムを作ろうとしています。問題は、3回目に新しいカードを要求するたびに、カードが正しく合計されないことです。また、プログラムが正しく再起動しないこともあります。以下は出力の例です。
Welcome to Blackjack!
Here are your first cards: 10, 2
Your total is 12.
Would you like to draw another card? (y/n)
y
You got a new card with a value of 6.
Your total is now 18.
Would you like to draw another card? (y/n)
y
You got a new card with a value of 4.
Your total is now 16.
Would you like to draw another card? (y/n)
n
Welcome to Blackjack!
Here are your first cards: 6, 4
Your total is 10.
Would you like to draw another card? (y/n)
do-whileループを使用して、合計が< 21になるたびに新しいカードを要求するようにしてみましたが、結局同じようになります。どうすればいいのか困っています。
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
int getCard(int);
int main()
{
srand(time(0));
int total, card1, card2, newTotal = 0;
char choice, playAgain = 'y';
while (playAgain == 'y')
{
cout << "Welcome to Blackjack!\n";
card1 = rand() % 10 + 1;
card2 = rand() % 10 + 1;
total = card1 + card2;
cout << "Here are your first cards: " << card1 << ", " << card2 << endl;
cout << "Your total is " << total << "." << endl;
cout << "Would you like to draw another card? (y/n)\n";
cin >> choice;
while (choice == 'y')
{
newTotal = getCard(total);
if (newTotal > 21)
{
cout << "Bust!" << endl;
choice = 'n';
}
else if (newTotal < 21)
{
cout << "Would you like to draw another card? (y/n)\n";
cin >> choice;
}
else
{
cout << "Congratulations, you won!\n";
choice = 'n';
}
}
}
cout << "Would you like to play again? (y/n)\n";
cin >> playAgain;
return 0;
}
int getCard(int total)
{
int addCard, newTotal;
addCard = rand() % 10 + 1;
newTotal = total + addCard;
cout << "You got a new card with a value of " << addCard << "." <<
endl;
cout << "Your total is now " << newTotal << "." << endl;
return newTotal;
}
プログラムは、プレイヤーに2枚のカードでスタートし、もう1枚引くかどうかを尋ねることを想定しています。もし「y」と入力されれば、それを実行し、カードを再計上する。もし、「いいえ」と言われたら、そのままゲームが終了します。もし、「はい」と答えて、新しいカードが合計21枚になったら、「バスト」を返します。ゲーム終了時には、プレイヤーにもう一度プレイするかどうかを尋ねます。
解き方は?
ロジックに問題がある。
-
まず
newTotal = getCard(total);
であるべきです。total = getCard(total);
というようにtotal
が更新される(だからnewTotal
でtotal
をどこでも使えるようにすることです)。このように使うことでnewTotal
変数で定義されたものから始めると、常にwhileループ内の前の合計を破棄しtotal = card1 + card2;
ループの前に -
2つ目
while (playAgain == 'y')
を更新しないので、常に真になります。playAgain
このループの内側からは、ユーザーがもう一度再生したいかどうかを尋ねるコードには到達しません)。次の2行をこのループの中に移動してください。
cout << "Would you like to play again? (y/n)\n";
cin >> playAgain;
こんな感じで。
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
int getCard(int);
int main()
{
srand(time(0));
int total, card1, card2, newTotal = 0;
char choice, playAgain = 'y';
while (playAgain == 'y')
{
cout << "Welcome to Blackjack!\n";
card1 = rand() % 10 + 1;
card2 = rand() % 10 + 1;
total = card1 + card2;
cout << "Here are your first cards: " << card1 << ", " << card2 << endl;
cout << "Your total is " << total << "." << endl;
cout << "Would you like to draw another card? (y/n)\n";
cin >> choice;
while (choice == 'y')
{
total = getCard(total);
if (total > 21)
{
cout << "Bust!" << endl;
choice = 'n';
}
else if (total < 21)
{
cout << "Would you like to draw another card? (y/n)\n";
cin >> choice;
}
else
{
cout << "Congratulations, you won!\n";
choice = 'n';
}
}
cout << "Would you like to play again? (y/n)\n";
cin >> playAgain;
}
return 0;
}
int getCard(int total)
{
int addCard, newTotal;
addCard = rand() % 10 + 1;
newTotal = total + addCard;
cout << "You got a new card with a value of " << addCard << "." << endl;
cout << "Your total is now " << newTotal << "." << endl;
return newTotal;
}
関連
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み] std::vector にある項目が存在するかどうかを調べるには?
-
[解決済み] プログラムがクラッシュしたときにスタックトレースを自動的に生成する方法
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み】 while(cin) と while(cin >> num) の違いは何ですか?)
-
[解決済み】'std::cout'への未定義の参照