ゲームなど、対話的なプログラムを作る場合、入力操作で即座にキーに反応 すると楽しいものが作れる。ここでは、対話的なキー入力と、自由度の高い画面 出力を行なえる curses ライブラリの使い方を紹介する。
C言語の標準関数であるfgets
などでは、一行をまとめて入力し、
最後にリターンキーを押さないとプログラムにデータを送り込むことができない。
これは、データ処理を行なう場合には都合が良いが、ゲームなどのプログラムを
作成する場合には、キーを1文字タイプしたら即座に入力したキーを読み込める
と即時性のあるものを作れる。
cursersライブラリには、以下のような事を可能にする関数群が用意されている。
cursesライブラリには、いくつもの関数が用意されている。これらを使うに は、プログラムの構成を以下のようにする。
#include <curses.h>
int main()
{
initscr(); /* curses初期化、画面も消去*/
noecho(); /* 入力文字を画面に出さない */
cbreak(); /* リターンキーなしでも入力可能に */
}
また、このプログラムをコンパイルするときには、cursesライブラリを
リンクするように、コンパイルのコマンドラインの最後に
-lcurses
を付加する(gccの-lオプションはリンクするライブラリ
を指定するためのもの)。
便利と思われる関数を抜粋した。
initscr()
cursesによる画面/入力制御を行なう前に必ず必要。
endwin()
cursesによる画面/入力制御を終了する。
noecho()
デフォルトではキー入力した文字を画面にそのまま出すが、これを
無効化する。アクションゲームなどでは、押したキーに対応する文字を画
面に出さない方が良いので、noecho()
を読んだ方が良いだ
ろう。
cbreak()
デフォルトでは、普通の文字を押してもリターンキーを押すまで
プログラムに入力したものが送られないが、cbreak()
を
呼ぶと、キーを押したらすぐにその文字がプログラムから読み取れるよう
になる。
addch(int 文字)
文字で指定された文字コードの文字を画面に出力する。
addstr(char* 文字列)
文字列を画面に出力する。
move(int 座標Y, int 座標X)
文字で数えた座標(X, Y) にカーソルを移動する。
次に呼ぶ addch, addstr
などは、この座標位置に
出力される。画面の左上隅が座標(0,0)である。
mvaddch(int Y, int X, int 文字)
座標 (X, Y)に文字を出力する。
mvaddstr(int Y, int X, char*文字列)
座標 (X, Y)に文字列を出力する。
refresh()
これまで出力した文字などを全て画面に反映させる。
addstr()
などを行なっただけでは実際に画面には現れない。
refresh()
を呼ぶことで初めて画面に反映される。
printw(char* "書式", ……)
printfと同様に書式つき文字列を出力。refresh()
が必要。
mvprintw(int Y, int X, char* "書式", ……)
座標 (X, Y) の位置に、printfと同様に書式つき文字列を出力。
refresh()
が必要。
beep()
ビープ音を鳴らす。
getch()
キーボードから1文字入力し、その文字コードを返す。cbreak()
を読んだ後ならば、1文字タイプするとすぐに値が返る。
そうでない場合はリターンを押してからまとめて入力が行われる。
→cbreak
の実験
timeout(int 入力タイムアウト)
getch()
での入力待ち時間を指定する。
入力タイムアウトで指定した数値を「ミリ秒」として
入力待ちし、入力がなければ特殊コードERR
を返す。
ただし、タイムアウトは0.1秒単位でしか設定できない。つまり、
数値的には 0, 100, 200, 300, ... という区切りで指定する。
→timeout
の実験
keypad()
矢印キーやファンクションキーなどの特殊キーを利用可能にする。
initscr();
keypad(stdscr, TRUE);
とすると、特殊キーを getch()
関数1回で読むことがで
きる。この場合、getch()
で得られる値は、
となる。
→keypadの実験
以下のグローバル変数が自動的に定義される。
LINES
現在の端末(kterm)の行数
COLS
現在の端末の桁数
move()
関数で座標できる範囲はX座標は 0からCOLS-1まで、
Y座標は 0からLINES-1までとなる。