アクションゲームなどを作る場合は矢印キーなどが使えると 操作しやすいものになる。以下のプログラムは、上下左右の移動に k j h l キーと、矢印キーが使える。q で終了。
#include <curses.h>
int main()
{
int x=COLS/2, y=LINES/2;
int ch;
initscr();
cbreak();
noecho();
keypad(stdscr, TRUE);
while (1) {
mvaddch(y, x, '*');
move(y, x);
refresh();
ch = getch();
delch(); /* 文字を消す */
switch (ch) {
case KEY_LEFT:
case 'h':
x-=2;
break;
case KEY_RIGHT:
case 'l':
x+=2;
break;
case KEY_UP:
case 'k':
y--;
break;
case KEY_DOWN:
case 'j':
y++;
break;
case 'q':
x=999;
}
if (x == 999) break;
x = (x+COLS)%COLS; /* 必ず 0〜COLS-1 に納める */
y = (y+LINES)%LINES; /* 必ず 0〜LINES-1 に納める */
}
endwin();
}
このプログラムのように、入力した文字によって処理を切替える場合は、
switch 〜 case
構文を使うと良い。
switch (変数) {
case 値その1:
/* 変数の値が「値その1」に一致したときの処理内容 */
break;
case 値その2:
/* 変数の値が「値その2」に一致したときの処理内容 */
break;
case 値その3:
/* 変数の値が「値その3」に一致したときの処理内容 */
break;
default:
/* 上記の case どれにも一致しなかったときの処理内容 */
}
のように使う。break
を省略した場合、処理が
次のcase文に書かれているところに進行する。従って、getch()
で得られた文字コードによって処理を切替えたいときは、
switch (getch()) {
case 'h':
case 's':
case KEY_LEFT:
/* h または s または ← キーが押されたときの処理 */
break;
case 'j':
case 'x':
case KEY_DOWN:
/* j または x または ↓ キーが押されたときの処理 */
break;
:
:
default:
/* 上記どれでもないときの処理 */
}
のように複数のcaseを列挙すると、どれかに一致する場合の処理を 書くことができる。