2
#include "stdafx.h"
#include <iostream>
#include <string>
#include <windows.h>
#include <time.h>

unsigned long n = 1;

int main()
{
    int i = 0;
    std::string text = "I whip my hair back and forth";
    std::string wipIt = " ";
    size_t sz;
    sz = wipIt.size();
    srand(time(0));

    do{
        for(i = 0; i < 10; i++)
        {
            int randomNumber = rand() % 15 + 1;
            Sleep(50);
            wipIt.resize (sz++,' ');
            std::cout << wipIt;
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), randomNumber);
            std::cout << text << "\n";
        }
        for(i = 10; i > 0; i--)
        {
            int randomNumber = rand() % 15 + 1;
            Sleep(50);
            wipIt.resize (sz--,' ');
            std::cout << wipIt;
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), randomNumber);
            std::cout << text << "\n";
        }
    }
    while (n != 0);
    return 0;
}

この投稿を台無しにしてしまった場合、これは私の 2 回目の投稿のようなものであることをお詫びします。

文字列全体を同じ色にするのではなく、文字列内のすべての文字を異なる色にする最も簡単な方法は何でしょうか。

片付けのヒントもいただければ幸いです:P

編集: 少し片付けて、ランダムがうまくいきました。ありがとうございました ^_^ 文字ごとの色についてはどうですか?

4

3 に答える 3

1

なぜランダムに見えないのですか?そうではないので。コンピューターは、疑似乱数ジェネレーターを使用して、実際にはよく知られていて決定的な一見乱数を生成します。

疑似乱数ジェネレータの初期状態は「シード」と呼ばれます。よりランダムに近い結果を生成するには、毎回異なる値に設定する必要があります。Cでは、次のように実行できます。

srand(time(NULL));

これにより、呼び出しごとにシードが秒単位の実際の時間に設定されます。

于 2012-08-01T15:34:16.887 に答える
1

文字ごとに色付けするには、文字列の文字を手動で反復処理し、各文字を出力する前に色属性を設定する必要があります。

(以下のコードは によって反復しcharます。これは、実際にマルチバイト エンコーディングを使用する文字セットでは機能しません。それらをサポートするには、API を使用して、 ではなく実際のユーザーが認識した文字によって文字列を反復処理する必要がありますchar。)

このコードには他にもいくつかの変更があります。

#include <iostream>
#include <string>
#include <random>

#include <Windows.h>

void colorize(size_t spacing, std::string const &s, std::mt19937 &eng) {
    std::cout << std::string(spacing, ' ');
    std::uniform_int_distribution<> dist(1,15);
    for (size_t i=0; i<s.size(); ++i) {
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), dist(eng));
        std::cout << s[i];
    }
    std::cout << '\n';
}

int main() {
    std::string text = "I whip my hair back and forth";
    int sz = 0;

    std::random_device r;
    std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()};
    std::mt19937 eng(seed);

    while (true) {
        int spacing = 11 - abs(10 - sz);
        sz = (sz+1) % 20;
        Sleep(50);
        colorize(spacing, text, eng);
    }
}

<random>よりも優れているため、乱数には C++11 ライブラリを使用していrand()ます。多くの既製のディストリビューションを提供し、間違いを犯しにくい (高品質であってrand() % 15 + 1もわずかな偏りがありますが、おそらくそうではありません)。rand()

重複を排除するために、繰り返されるコードを関数に抽出しました。次に、2 つの for ループを、2 つの for ループが sz で行っていたことと完全に一致するジグザグ出力を持つ関数に置き換えました。

do {} while()無限ループを、より読みやすく慣用的なに置き換えましたwhile(true){}

一時的な各反復を構築するために、間隔のためにサイズ変更されていた文字列変数を削除しました。これは、単純なサイズ変更ではなく、反復ごとに割り当てが行われる可能性があることを意味します (ただし、小さな文字列の最適化によりおそらく回避されます) が、この場合のパフォーマンスは無関係です。

于 2012-08-01T16:48:19.683 に答える
0

最初に使用する前に、乱数ジェネレーターのシードを提供する必要があります。

srand を使用して乱数ジェネレーターを初期化する例は次のとおりです。

/* srand example */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main ()
{
  printf ("First number: %d\n", rand() % 100);
  srand ( time(NULL) );
  printf ("Random number: %d\n", rand() % 100);
  srand ( 1 );
  printf ("Again the first number: %d\n", rand() %100);

  return 0;
}
于 2012-08-01T15:30:07.423 に答える