この間、出来るかどうかわからないながらも、次の成果物の漠然としたイメージを持ち、(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"を使って、カーソルや文字属性を含めた画面の直接書き換えが可能」というような対応が必要で、

 

それってつまり、...

     .

     .

     .

 

最初からウィンドウベースで書いた方が早いよね?

 

ということで、またどうしようか悩む日々が続きそうです。