keypad関数の実験

アクションゲームなどを作る場合は矢印キーなどが使えると 操作しやすいものになる。以下のプログラムは、上下左右の移動に k j h l キーと、矢印キーが使える。q で終了。

keypad.c

#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を列挙すると、どれかに一致する場合の処理を 書くことができる。


目次