ページ 11

画面消去"0x1b[2J"について

Posted: 2010年5月14日(金) 12:45
by 山崎
いつもお世話になっております、山崎です。
今回は、エスケープシーケンスを使って画面の文字を消去する方法について伺いに参りました。

OSはXP、VisualStudio2010プロフェッショナルを使っております。
使用言語はC++です。

現在、ライブラリを用いずに、コマンドプロンプト上で動くような
簡単なゲームを作ってみようかなと考えております。
画像ファイルを用いずに、文字だけで表現する感じです。

そこで、一度標準出力した文字を画面から消すというプログラムを試すために
以下のようなコードを書いて実行してみたのですが、どうも消去されません。
#include <stdio.h>
#include <conio.h>    //getch()のため

int main()
{
    char Letter;    //入力したキーの文字コード
    bool ProgramEnd=false;

    while(ProgramEnd==false)
    {
        Letter=getch();

        if(Letter=='q')
            ProgramEnd=true;

        if(Letter=='c')
            printf("0x1b[2J");    //画面に描いた文字を消去したい!

        printf("%c\n",Letter);    //入力したキーの文字を表示する
    }

    return 0;
}

実行すると、以下のように"0x1b[2J"がそのまま標準出力され、
画面消去されません。(試しにaとsとdを入力しております)

------------------------実行結果-------------------------
a
s
d
0x1b[2Jc
---------------------------------------------------------

printf("0x1b[2J");
の部分ですが、
printf("\0x1b[2J");
に変えても駄目でした。

調べてみたところ、0x1b[2Jというエスケープシーケンスを使えるかどうかは環境に依る、
というような感じのことが書かれておりました…。
プログラム初心者にこのあと手ほどきしたいと思っているので、
APIに深く突っ込んだりパスを変えたりせず、
なるべく簡単なコードでなんとかならないかと思案しております。

環境を変えたりAPIに深く踏み込んだりせずに、
標準出力した文字を消去する方法はあるでしょうか。

Re:画面消去

Posted: 2010年5月14日(金) 12:49
by たかぎ
> 環境を変えたりAPIに深く踏み込んだりせずに、
> 標準出力した文字を消去する方法はあるでしょうか。

APIに深く踏み込むというのがどの程度のことかわかりませんが...
Windows APIを直接使わないということであれば、

system("cls");

とすれば、画面を消去できると思います。

Re:画面消去

Posted: 2010年5月14日(金) 12:54
by softya
エスケープシーケンスはMS-DOS系(WindowsMEまで)なら有効でしたが、NT系であるWindows2000/XP/Vista/7では基本的には利用できません。
たかぎさんの方法を私も推薦します。

Re:画面消去

Posted: 2010年5月14日(金) 13:00
by 山崎
たかぎさん softyaさん
非常に素早いご返信、ありがとうございます。
ちょっと下の階に行っている間に… ^^;

たかぎさんの
system("cls");
を使った方法を試してみたところ、あっけなくやりたいことができました。
これを知らなかったとはお恥ずかしいです…
ありがとうございました。

お二人のお勧めの方法を是非とも採用させていただきます。
素早いご返信、誠にありがとうございました。

Re:画面消去

Posted: 2010年5月14日(金) 14:07
by バグ
ちなみにWINAPIを使用するならば、FillConsoleOutputAttribute関数とかFillConsoleOutputCharacter関数辺りを調べてみるとよいかと思います。