1. ホーム
  2. c++

[解決済み] C++ブラックジャックプログラムを修正する方法を見つけ出す問題 [重複].

2022-02-09 11:40:42

質問

私は現在、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 が更新される(だから newTotaltotal をどこでも使えるようにすることです)。このように使うことで 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;
}