ページ

2010年3月8日月曜日

C#勉強中 rainプログラム

週末でしたので、いままで勉強してきた知識でプログラムをひとつ書いてみました。いままで読んできたコードの大半は入出力には.NetのConsoleを使用しています。Consoleの仕様を見てみると、コマンドプロンプトへの単純な入出力だけでなく、文字ベースでの画面制御機能がひと通り含まれています。ということは、unixのcurse(あるいはOS/2でのVIO)相当のことが実現できるはずです。というわけで、Consoleでの画面制御機能を使ったプログラムを書いてみました。→アーカイブ

元ネタはunixのrainというプログラムで、Ascii Artで雨粒の様子を表現するという、何の役にも立たないものです。多分、cursesのサンプル、といったプログラムかと思います。調べたらNetBSDにはまだ含まれいるのですね。NetBSD版では循環バッファを使って雨粒の位置と状況(段々と波紋が広がっていく様子)を保持しています。バッファ自体には雨粒の位置が記録され、循環バッファ上の位置(現在位置からのオフセット)が状況に対応していて、その状況に応じたAAが表示されています。これはコンパクトな実装ですが、雨粒の数は固定的になっていますし、あまり読み易いコードとはいえません。

C#のようなオブジェクト指向言語で実装するなら、雨粒をオブジェクトで表現し、任意数の雨粒をリストでFIFO管理すると簡単に読み易く実現することができます。雨粒はRainDropクラスで表現しています。これは位置と生成されてからの時間経過を保持していて、時間経過に伴って、AAが表示され世代が古くなっていきます。プログラムの本体はRainクラスで表現し、複数の雨粒をRainDropのリストで保持してみました。時間とともに新しい雨粒が生成されてリストに追加され、一定時間を過ぎた(Expired)雨粒はリストから排除されていきます。

なお、rainプログラムのAAはUS-ASCIIを想定しているので日本語のコマンドプロンプトではあまり綺麗に表現されません(バックスラッシュと円記号の問題)。Consoleには表示される文字のエンコードを属性で参照/設定することができます(Console.OutputEncoding)。そこで、Rain生成時にエンコーディングをUS-ASCII(Encoding.ASCII)に設定し、廃棄時に(IDisposable実装)元のエンコーディング戻す機能も入れてみました。しかし、コマンドプロンプトから実行した場合にはエンコーディングは変更されないようです。ですが、start で別セッションとして起動した場合にはASCII表示に切り替えられます。

0 件のコメント:

コメントを投稿