我开始写一个视频扑克计划,我遇到了一些问题。
我有一个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;
}
}
}
}
答案 0 :(得分:1)
你没有展示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";
}
答案 1 :(得分:0)
Stricto sensu,std::cout
和其他C ++标准流没有任何颜色或字体。
ANSI escape codes上有一个标准,用于定义如何更改字体&amp;基于旧字符的终端(以及当前终端模拟器,如xterm和更新的克隆)上的颜色。
但是如果您关心基于终端的I / O,我建议使用类似ncurses
的库。