Видео покер на С ++ - PullRequest
       5

Видео покер на С ++

1 голос
/ 06 декабря 2011

Я начинаю писать программу для видео покера и сталкиваюсь с некоторыми проблемами.

У меня есть функция Hold, как вы можете видеть ниже:

void Game::Hold( bool& choice )
{
    if( choice == true )
        {
            Console::BackgroundColor(Red);
            Console::ForegroundColor(Black);
            cout << "HOLD";
            Console::BackgroundColor(Black);
            Console::ForegroundColor(Red);
        }
        else
            cout << "HOLD"; 
}

Эта функция позволяет мне заблокировать текст, чтобы игрок знал, какие карты выбраны, а какие нет. Проблема, с которой я столкнулся, заключается в том, что первый и последний "Holds" не будут блокироваться, если их удерживать.

Пока что - это мой код, который вызывает функцию Hold:

void Game::Play( void )
{

    Menu();

    Console::Clear();
    Deck nGame;
    nGame.Shuffle();
    Game Hand;
    Card currentHand[ 5 ]; 
    bool p_Hold[ 5 ] = { 0 , 0 , 0, 0, 0 };


    for( int i = 0; i < 5; i++ )
        currentHand[ i ] = nGame.Draw();

    cout << "Type in which cards you would like to hold. Type \"d\" when done.\n\n";
    char uChoice[ 5 ] = {};

    for( int i = 0; i < 5; i++ )
    {
        if( uChoice[ i ] == 'd' ) 
            break;

        for( int i = 0; i < 5; i++ )
            cout << "    " << currentHand[ i ] << "   ";

        cout << endl;

        for( int i = 0; i < 5; i++ )
        {
            cout << "  ";
            Hand.Hold( p_Hold[ i ] ); 
            cout << "   ";  
        }

        cout << "\n\n\nWould you like to hold Card " << i + 1 << "? (1 = Yes/0 = No): ";

        cin.get( uChoice[ i ] );
        cin.clear();

        cin.ignore( INT_MAX, '\n' );

        cout << endl;

        if( cin.good() )
        {
            for( int i = 0; i < 5; i++ )
            {
                if( uChoice[ i ] == '1' )
                    p_Hold[ i ] = true;
                else
                    p_Hold[ i ] = false;
            }
        }
    }
}

Ответы [ 2 ]

1 голос
/ 06 декабря 2011

Вы не показали, что на самом деле делает Console::BackgroundColor(), поэтому трудно быть уверенным.Однако ...

Обычно cout буферизует его вывод на потом.Из-за этого Console::BackgroundColor() может изменить что-то, что вступает в силу немедленно, затем буферизуется cout << "HOLD", затем вы сбрасываете цвет, прежде чем текст "HOLD" получит возможность быть отправленным на консоль.

Возможно, вам нужно очистить вывод непосредственно перед изменением цвета:

void Game::Hold( bool& choice )
{
    if( choice == true )
        {
            cout.flush();
            Console::BackgroundColor(Red);
            Console::ForegroundColor(Black);
            cout << "HOLD";
            cout.flush();
            Console::BackgroundColor(Black);
            Console::ForegroundColor(Red);
        }
        else
            cout << "HOLD"; 
}
0 голосов
/ 06 декабря 2011

Stricto sensu, std::cout и другие стандартные потоки C ++ не имеют цветов или шрифтов.

Существует стандарт управляющих кодов ANSI , определяющий, как изменять шрифты и цвета на старых символьных терминалах (и текущих эмуляторах терминала, таких как xterm и более новые клоны).

Но если вы заботитесь о терминальном вводе / выводе, я предлагаю использовать библиотеку для этого, например ncurses

...