この間、出来るかどうかわからないながらも、次の成果物の漠然としたイメージを持ち、(C++を弄っていること自体が楽しいこともあり、)少しづつ(または部品ずつ(注))書き進めています。
注:「『ずつ』と『づつ』は、どちらも同じ意味で使われる言葉ですが、現代では『ずつ』が正しい表域とされています。『づつ』は歴史的仮名遣いであり、現代の公的な場面やビジネス文書では『ずつ』を使うのが一般的です。」(Search Labo)
例えば、今考えているタイプのライフゲーム("cell")の「世界」はこんな風で、
(山が3つ、河が流れ、食料となるものが散在しています。これはどのようなエディターでも編集できます。)
そこに投げ出される(即ち「そこで誕生する」)生命体、"cell(注)"は乱数により、各種のパラメーターが決定されます。
注:ドラゴンボールに登場するあの「セル」とは全く関係がありません。
そんな感じで具体仕様を煮詰めてゆこうとしていたら、
ん?
エスケープシーケンスを使った「画面消去」(C++11なら、「std::cout << "\033[2J";」)で消えるはずのコンソール画面が消えません。(位置や色等の他のエスケープシーケンス機能は正常に動いているのに...)
え"え"え"~!
ということで、色々調べるも何らコードは間違っていない筈。仕方なく、Chat-GPT様にお伺いを立てます。
私:C++のプログラムで、文字表示位置や文字色や部リンクなどもエスケープシーケンスで表示できますが、std::cout << "\e[2J";でもコンソール画面が消去されません。考えられる原因を教えて。
(中間のやり取りは長いので結論だけを...)
Chat-GPT:
✅ 結論:はい、現代のWindowsコンソールはDOS時代のようには動きません
✅【昔:DOS時代の画面クリア(例:MS-DOSやPC-98のBIOS直下)】
-
ANSI.SYS ドライバが組み込まれている場合、
-
\033[2Jは文字通り「スクリーンバッファの内容全消去 + カーソル左上移動」でした。 -
実質的に「画面初期化」に近い処理。
-
「物理画面」と「バッファ」が事実上一体だった。
-
✅【今:Windows 10/11 のコンソール】
-
モダンな Windows Console Host(
conhost.exe)は以下のように動作:-
\033[2Jは「現在のバッファの内容を空白にするだけ」。 -
カーソルは移動しない(
Hを明示しない限り)。 -
スクリーンバッファの高さは画面サイズよりも大きい → スクロールが発生。
-
消しても、スクロールバック領域には履歴が残ることがある。
-
つまり、出力が「見えない」だけで「消えた」わけではない。
-
✅【技術的な違い】
| 比較点 | DOS(ANSI.SYS) | Windows 10/11のコンソール |
|---|---|---|
\033[2J の動作 |
完全な画面初期化 + カーソル左上 | 画面消去のみ(カーソルはそのまま) |
| カーソル移動 | 暗黙に(0,0)に戻ることが多い | 明示的に \033[H が必要 |
| バッファと画面 | ほぼ一致 | バッファは通常画面より大きい(=スクロール) |
| 表示の挙動 | 消去=実際に何も残らない | 消してもスクロールで空白が続くだけのように見える |
| カスタマイズ性 | ANSI.SYSに依存 | Windows API or VTシーケンスを組み合わせて制御 |
ということで、
「std::cout << "\033[2J";」 == 「カーソル位置からコンソールウィンドウ分の空白を出力するだけ」
昔のDOS時代のような動作をさせるなら「Windows APIの WriteConsoleOutput を使って仮想スクリーンバッファの書き換えを"CreateConsoleScreenBuffer"を使って、カーソルや文字属性を含めた画面の直接書き換えが可能」というような対応が必要で、
それってつまり、...
.
.
.
最初からウィンドウベースで書いた方が早いよね?
ということで、またどうしようか悩む日々が続きそうです。

