curses プログラミングでありがちな問題と解決策

お手本のプログラムでさえ正常に動作しません.
MacOS の場合...多分,MacOS の「ターミナル」特有の問題です. 透明化などのフザケた設定を施していると, curses は正常に機能しないようです. (標準設定に戻せ.)

画面内の表示が変化しません.
多分,refresh( ) を忘れています.

画面がチラつきます.
多分,clear( ) を使っています. 代わりに erase( ) を使うべき.
また,次の問題と同じ原因かもしれません.

画面上にゴミが残ってしまうことがあります.
多分,表示処理が複数の場所に分散しています. 表示処理を一箇所にまとめて,その前に erase( ), その後に refresh( ) を付けましょう. (それでも直らない場合,多分,端末ソフトの不具合なので諦めよう.)

何かキーを押さないと画面が変わりません.
多分,timeout(-1) とかになっています. timeout(0) とかにする.

何もキーを押していないのに画面が変わってしまいます.
多分,timeout(0) とかになっています. timeout(-1) とすればよい.
または,端末のサイズを変更しても, キー入力として認識されます.

キーを押し続けていると入力されない場合があります.
多分,プログラムの動作速度(キー入力受付の周期)と キーボードの動作速度(キーリピートの周期)がうまくかみ合っていません. この現象は,timeout( ) の数値とキーボードの設定を変更すれば, 多少は緩和されます.が,完全には解消できません. (シビアなキー入力を要求しないように,プログラムの仕様を工夫しよう.)

日本語表示が文字化けしてしまいます.
多分,ソースファイルと端末の文字コード(エンコーディング)を UTF-8 へ変更し, ソースコードの先頭付近に setlocale(LC_ALL, "") を追加すると直ります. さらに,コンパイル時に ncursesw をリンクしましょう. (それでも直らない場合,多分,端末ソフトの不具合なので諦めよう.) ...が,英語表示にとどめておくのが無難. (この説明を理解できない場合,日本語使用禁止.)
端末画面のサイズを変えたいんですが...
curses は端末内部の世界だけで動いているので, 端末外部の状況を変えることはできません. (要するに,ユーザが手動で変更するしかない. ただ,getmaxyx( ) で現在のサイズを知ることはできるので, 「小さすぎる」とか「大きすぎる」とか 「このサイズじゃなきゃダメ」とか ユーザへヒントを表示するとよい.) なお,端末サイズの標準は 80文字×24行です. 極端に大きな画面を要求しないこと.
複数のキーを同時に入力したいんですが...
できません. 複数キーを同時に押した場合,どれか1個だけしか検出されません. (同時キー入力について,PC 自体(端末外部)では対応しているが, 端末内部では対応していない.)

(c) 2014, yanagawa@kushiro-ct.ac.jp