[英]Make std::cout output multiple string in the same row one after the other
標題是亂七八糟的,看到代碼可能要快得多
p1_dado = rand() % 6 + 1;
switch (p1_dado) {
case 1:
cout << ".-----." << endl;
cout << "| |" << endl;
cout << "| o |" << endl;
cout << "| |" << endl;
cout << "._____." << endl << endl;
p1_somma = p1_somma + p1_dado;
break;
case 2:
cout << ".-----." << endl;
cout << "| o |" << endl;
cout << "| |" << endl;
cout << "| o |" << endl;
cout << "._____." << endl << endl;
p1_ndadi--;
break;
case 3:
cout << ".-----." << endl;
cout << "|o |" << endl;
cout << "| o |" << endl;
cout << "| o|" << endl;
cout << "._____." << endl << endl;
p1_somma = p1_somma + p1_dado;
break;
case 4:
cout << ".-----." << endl;
cout << "| o o |" << endl;
cout << "| |" << endl;
cout << "| o o |" << endl;
cout << "._____." << endl << endl;
p1_somma = p1_somma + p1_dado;
break;
case 5:
cout << ".-----." << endl;
cout << "| o o |" << endl;
cout << "| o |" << endl;
cout << "| o o |" << endl;
cout << "._____." << endl << endl;
p1_ndadi--;
break;
case 6:
cout << ".-----." << endl;
cout << "| o o |" << endl;
cout << "| o o |" << endl;
cout << "| o o |" << endl;
cout << "._____." << endl << endl;
p1_somma = p1_somma + p1_dado;
break;
}
我還要提一下,這段代碼在for循環中,因此switch case將運行4-5次。 這個輸出的方式是彼此重疊的所有骰子,有沒有辦法在1“行”中顯示所有骰子? 喜歡:
1 2 3 4 5
代替:
1
2
3
4
5
謝謝您的幫助 :)
假設您安裝了攔截和重新排列輸出的東西,實際輸出可以保持不變。 由於我傾向於從流的刷新中鍵入發送編譯行,唯一真正需要的改變是使用'\\n'
替換過度使用std::endl
。 無論如何,這是我強烈建議的(有關解釋,請查看鏈接 )。
因此,假設有一個名為dicebuf
的東西定義, main()
函數可能看起來像這樣(有趣的部分是函數內的第一個定義):
int main()
{
dicebuf buf(std::cout);
for (int i = 0; i != 5; ++i)
{
int p1_dado = rand() % 6 + 1;
switch (p1_dado) {
case 1:
std::cout << ".-----." << '\n';
std::cout << "| |" << '\n';
std::cout << "| o |" << '\n';
std::cout << "| |" << '\n';
std::cout << "._____." << '\n' << '\n';
break;
case 2:
std::cout << ".-----." << '\n';
std::cout << "| o |" << '\n';
std::cout << "| |" << '\n';
std::cout << "| o |" << '\n';
std::cout << "._____." << '\n' << '\n';
break;
case 3:
std::cout << ".-----." << '\n';
std::cout << "|o |" << '\n';
std::cout << "| o |" << '\n';
std::cout << "| o|" << '\n';
std::cout << "._____." << '\n' << '\n';
break;
case 4:
std::cout << ".-----." << '\n';
std::cout << "| o o |" << '\n';
std::cout << "| |" << '\n';
std::cout << "| o o |" << '\n';
std::cout << "._____." << '\n' << '\n';
break;
case 5:
std::cout << ".-----." << '\n';
std::cout << "| o o |" << '\n';
std::cout << "| o |" << '\n';
std::cout << "| o o |" << '\n';
std::cout << "._____." << '\n' << '\n';
break;
case 6:
std::cout << ".-----." << '\n';
std::cout << "| o o |" << '\n';
std::cout << "| o o |" << '\n';
std::cout << "| o o |" << '\n';
std::cout << "._____." << '\n' << '\n';
break;
}
}
}
這里的想法是dicebuf
構造函數注入一個聚合行的自定義流緩沖區。 它只是不輸出東西,只是添加字符到當前行。 如果遇到換行符( '\\n'
),它將轉到下一行。 如果遇到連續的兩個換行符,則會假定有時間返回到頂部並繼續添加到當前行。
通過實現合適的流緩沖區(即,從std::streambuf
派生的類)來創建攔截輸出的這種實用程序。 這是一個示例實現:
#include <utility>
#include <iostream>
#include <iterator>
#include <algorithm>
#include <string>
#include <vector>
struct dicebuf
: std::streambuf
{
std::ostream& out;
std::streambuf* sbuf;
std::vector<std::string> rows;
std::vector<std::string>::size_type row;
public:
dicebuf(std::ostream& out)
: out(out)
, sbuf(out.rdbuf())
, rows(1)
, row(0) {
out.rdbuf(this);
}
~dicebuf() {
this->sync();
this->out.rdbuf(this->sbuf);
}
int overflow(int c) {
if (c != std::char_traits<char>::eof()) {
if (c == '\n') {
if (this->rows[this->row].empty()) {
this->row = 0;
}
else {
++this->row;
if (this->rows.size() == this->row) {
this->rows.push_back(std::string());
}
}
}
else {
this->rows[this->row].push_back(c);
}
}
return std::char_traits<char>::not_eof(c);
}
int sync() {
std::ostream out(this->sbuf);
std::copy(this->rows.begin(), this->rows.end(),
std::ostream_iterator<std::string>(out, "\n"));
this->sbuf->pubsync();
this->row = 0;
this->rows.resize(0);
this->rows.push_back(std::string());
return 0;
}
};
與上面的main()
一起,它應該根據需要產生輸出。 如果你想要多行結果,你只需注入一個刷新,例如,使用
std::flush;
在戰略要點。
代碼段:
char* hline = ".-----.";
char* dice[6][3] = { {"| |", "| o |", "| |" }, { ... }}; // 3 middle lines for each dice
for (int l=0; l < 5; ++l) {
for(int i=0; i < 6; ++i) // or any random dice sequence with index = dice value - 1
cout << (l == 0 || l == 4) ? hline : dice[i][l-1] << " ";
cout << "\n";
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.