1

これは私が書こうとしている単純なゲームですが、期待したほど効率的ではありません... これが私の目的です。配列が正しく機能しておらず、全体的なロジックが不完全です。目的は、最初のサイコロの合計が 2、3、または 12 の場合、プレーヤーに負けたことを伝えることです。合計が 7 または 11 の場合、プレーヤーに勝ったことを伝えます。最初のロールが他の数字 (4、5、6、8、9、10) だった場合、プレーヤーはもう一度ロールする必要があると言われました。そのプログラムを次のように拡張します。プレーヤーが最初のロールの後に再度ロールするように指示された場合 (4、5、6、8、9、10 の場合)、その数字を保存して、それを「ポイント」と呼びます。次に、次の 2 つのうちのいずれかが発生するまでローリングを続けます。プレイヤーが「ポイント」番号を再度ロールする前に 7 をロールすると、プレイヤーは負けてターンは終了します。プレーヤーが 7 がロールされる前に「ポイント」を一致させると、プレーヤーが勝ち、ターンは終了します。7または「ポイント」以外の数字がロールされた場合、何も起こらず、プレーヤーはロールを続けます。勝ったか負けたか、各ロールの結果、結果を得るために何回ロールしたかをプレーヤーに伝えます。

ここに画像の説明を入力

#include <iostream>
#include <ctime>

using namespace std;

int main()
{
    int die1, 
        die2, 
        sum, 
        point,
        rollChoice;
    static int rollCount;

    int *rolls = new int[];

    rollCount=1;
    point=0;

    srand(time(0));

    cout<<"Enter 1 to roll: ";
    cin>>rollChoice;

    if(rollChoice==1)
    {

        for (int i=0; i<INT_MAX; i++)
        {
            die1=rand()%10;
            die2=rand()%10;

            sum=die1+die2;

            rolls[sum];

            if(rolls[i] == 2 || rolls[i] == 3 || rolls[i] == 12)
            {
                cout<<"\nYou have lost!"<<endl;

                rollCount++;

                cout<<"\n";
                cin>>rollChoice;
            }

            else if(rolls[i] == 7 || rolls[i] == 11)
            {
                cout<<"\nYou have won!"<<endl;

                rollCount++;

                cout<<"\n";
                cin>>rollChoice;
            }
            else if(rolls[i] == 4 || rolls[i] == 5 || rolls[i] == 6 || rolls[i] == 8 || rolls[i] == 9 || rolls[i] == 10)
            {
                cout<<"\nYou have lost, roll again.";

                point=rolls[i];

                cout<<"\n";
                cin>>rollChoice;

                rollCount++;

                if(rollCount==7)
                {
                    for(int i=0; i<7; i++)
                    {
                        cout<<"\nRoll "<<i<<". "<<rolls[i];
                    }
                }
            }
        }
    }

    cin.get();
    cin.get();

    return 0;
}



4

4 に答える 4

8
  • rollsサイズのない配列ですが、その中に何かを入れようとします。
  • あなたは何を期待for (int i=0; i<INT_MAX; i++)していますか?
  • rolls[sum]? それはNoOPです
  • iを使用してループ内で再定義することiは衝撃的な練習です。

C/C++ の本を掘り下げて基本を再確認し、問題が発生した場合は具体的な質問をすることをお勧めします。

于 2013-02-26T00:47:07.160 に答える
2

コードに関する説明がまったく、または十分に提供されていません (最初の for ループなど)。そのため、お客様の主な問題を解決するお手伝いをすることができません。ただし、その中でいくつかのエラーを指摘することができました。動的配列のサイズを設定しなかったのと同じように: ロール。使い終わったら、忘れずに削除してください。

しかし、少なくともあなたは目的を説明しました。そのため、そのためのクラスを書くことができました。基本的に、あなたは独自の「A Pair of Dice」ゲームを開発しようとしています。したがって、私があなたの目的を注意深く正確に読んだ場合、あなたの目的のための私の執筆クラスは正しく機能するはずです。以下に記載します。これらの有用なコメントを読むことを忘れないでください! そこから何か役に立つことを学んでいただければ幸いです。自由に使用して、必要に応じて微調整してください。

APairOfDice.h

#ifndef APAIROFDICE_H
#define APAIROFDICE_H

#include <string>
#include <iostream>
#include <ctime>

#define A_PAIR_OF_DICE_LOST     0
#define A_PAIR_OF_DICE_WON      1
#define A_PAIR_OF_DICE_RETRY    2

class APairOfDice
{
public:
    void Play( void );
private:
    ::UINT Roll( void );
    void Reset( void );
    void PrintHistory( void );
private:
    ::UINT m_nCount;
    ::UINT m_nValue;
    ::UINT m_nPoint;
    std::vector< ::UINT >m_vnHistory;
    bool bWin;
public:
    APairOfDice( void ) : m_nCount( 0 ), m_nValue( 0 ), m_nPoint( 0 ), bWin( false ) { }
    ~APairOfDice( void ) { }
};

#endif // APAIROFDICE_H

APairOfDice.cpp

void APairOfDice::Play( void )
{
    // DECLARATION
    ::UINT nRollResult = Roll( );

    // DO WHATEVER
    // *This is the main loop of the game:
    while( true )
    {
        //* Is this is first roll? If so, do this:
        if( m_nCount == 1 )
        {
            // *If m_nValue is equal to either of the following
            // values: 2, 3, and 12, the player has lost.
            // So, bWin is set to false and the loop will break.
            if( nRollResult == A_PAIR_OF_DICE_LOST ) {
                bWin = false;
                break;
            }

            // *Else if m_nValue is equal to either 7 or 11,
            // the player has won. Therefore, bWin is set as
            // true and the loop will break.
            else if( nRollResult == A_PAIR_OF_DICE_WON ) {
                bWin = true;
                break;
            }

            // *Else m_nValue is equal to either of the following
            // numbers: 1, 4, 5, 6, 8, 9, 10
            // change the value of m_nPoint to m_nValue (saved it).
            else
                m_nPoint = m_nValue;
        }
        //* If not, do this:
        else
        {
            // *If m_nValue is equal to 7, the player will
            // lose. If so, set bWin as false and break
            // the loop. Game over.
            if( m_nValue == 7 ) {
                bWin = false;
                break;
            }

            // *Else if m_nValue is equal to m_nPoint, the player
            // will win. If so, set bWin as true and break
            // the loop. Game over. Good game.          
            else if( m_nValue == m_nPoint ) {
                bWin = true;
                break;
            }
        }

        //* Remove the next two lines to prevent the loop from pausing.
        std::cout << "Enter any key to roll again!\n";
        ::getchar( );

        // Roll again.
        Roll( );
    }

    // PRINT
    PrintHistory( );

    // ASK FOR REPLAY
    std::cout << "Would you like to play again? Enter 'y' for yes and any other key is for no.\n";
    if( ::getchar( ) == 'y' || ::getchar( ) == 'Y' )
    {
        Reset( );
        Play( );
    }
};
::UINT APairOfDice::Roll( void )
{
    // DECLARATION

    // INITIALIZATION
    // *Increase the value of m_nCount.
    m_nCount ++;

    // *Initialize random number generator
    // with std::time as the seed.
    std::srand( ( ::UINT )std::time( 0 ) );

    // *Set the value of m_nValue as the result of
    // std::rand % highest value + lowest value.
    // *This isn't the best way to generate a value.
    m_nValue = std::rand( ) % 12 + 1;

    // *Save the old m_nValue.
    m_vnHistory.push_back( m_nValue );

    // *Check and return values.
    if( m_nValue == 2 || m_nValue == 3 || m_nValue == 12 )
        return( A_PAIR_OF_DICE_LOST );
    else if( m_nValue == 7 || m_nValue == 11 )
        return( A_PAIR_OF_DICE_WON );
    else
        return( A_PAIR_OF_DICE_RETRY );
};

void APairOfDice::Reset( void )
{
    //* Reset all class variables and members.
    this->m_nCount = 0;
    this->m_nValue = 0;
    this->m_nPoint = 0;
    this->m_vnHistory.clear( );
    this->bWin = false;
};

void APairOfDice::PrintHistory( void )
{
    // DECLARATION
    ::UINT nRollCount = 2;

    // *Print win or lose message.
    if( bWin )
        std::cout << "Yay! You've won!!!\n";
    else
        std::cout << "Aw! You've lost...\n";

    // *Print the value of m_nPoint.
    std::cout << "Roll 1 - " << "your \"point\" is " << m_nPoint << std::endl;

    // *Print each value within m_vnHistory except for the first one
    // why not the first one? Well, because thats the value of m_nPoint.
    for( std::vector< ::UINT >::const_iterator nIndex = m_vnHistory.begin( ) + 1;
         nIndex != m_vnHistory.end( );
         ++ nIndex, ++ nRollCount )
    {
        std::cout << "Roll " << nRollCount << ". " << "\tRolled: " << *nIndex << std::endl;
    }
};

テスト済み:

Enter any key to roll again!

Enter any key to roll again!

Enter any key to roll again!

Enter any key to roll again!

Enter any key to roll again!

Enter any key to roll again!

Enter any key to roll again!

Enter any key to roll again!

Enter any key to roll again!

Aw! You've lost...
Roll 1 - your "point" is 6
Roll 2.         Rolled: 10
Roll 3.         Rolled: 10
Roll 4.         Rolled: 10
Roll 5.         Rolled: 1
Roll 6.         Rolled: 1
Roll 7.         Rolled: 1
Roll 8.         Rolled: 4
Roll 9.         Rolled: 4
Roll 10.        Rolled: 7
Would you like to play again? Enter 'y' for yes and any other key is for no.

エラーがある場合は、お知らせください。フィードバックや提案は無視されません!

于 2013-02-26T08:00:23.143 に答える
1

ロールのサイズを設定するのを忘れたようです。忘れてしまったかもしれないもう1つのタスクは、ロールを完全に使い終わった後でロールを削除することです。クリーンアップするのは常に良い習慣です!

この部分はとても恐ろしいように見えます:

else if(rolls[i] == 4 || rolls[i] == 5 || rolls[i] == 6 || rolls[i] == 8 || rolls[i] == 9 || rolls[i] == 10)
{
    // ...
}

その部分を次のように変更します。

else if( rolls[ i ] => 4 && rolls[ i ] <= 10 && rolls[ i ] != 7 )
{
    // ...
}

宣言時にローカル変数の値を明示的に割り当てる必要があります。これを変える:

int die1, 
        die2, 
        sum, 
        point,
        rollChoice;
    static int rollCount;

    // Why initialize the value of rollCount and point now?
    rollCount=1;
    point=0;

これに:

int die1 = 0;
int die2 = 0;
int sum = 0;
int point = 0;
int rollChoice = 0;
static int rollCount = 1;
于 2013-02-26T01:29:35.277 に答える
0

それらは本当に10面サイコロですか?rolls[sum];を使用してロールにデータを入れていません。ということrolls[i]=sum;ですか?

于 2013-02-26T00:46:43.773 に答える