パソコンにナンプレを解かせたい。
前回は中心部分のプログラムを振り返ってみました。今回はセッティングについて
セッティング
ヘッダファイル
#define YOKO 77 /* マスの横幅 */ #define TATE 37 /* マスの行数 */ #define YOKO_ALL (YOKO+1) /* 必要な横幅 */ #define TATE_ALL (TATE+3) /* 必要な行数 */
#define colorBLACK 0 #define colorRED 9 #define colorGREEN 10 #define colorWHITE 231
ncursesで色の設定をする時に使う定数。確か
BLACK
とかはすでにncurses.hで定義されているので、被らないように。追記:なんやかんやして(省略)ncurses.hを見つけて覗いたらdefineしてるところを見つけました。以下のようになってました。
/* colors */ #define COLOR_BLACK 0 #define COLOR_RED 1 #define COLOR_GREEN 2 #define COLOR_YELLOW 3 #define COLOR_BLUE 4 #define COLOR_MAGENTA 5 #define COLOR_CYAN 6 #define COLOR_WHITE 7
setting.c
- void startGame() === ゲーム開始時の各設定。ncursesで必要なものが結構ある。
void startGame(){ /* setting */ initscr(); cbreak(); noecho(); idlok(stdscr, TRUE); scrollok(stdscr, TRUE); keypad(stdscr, TRUE); /* color setting */ start_color(); colorSetting(); bkgd(COLOR_PAIR(1)); getmaxyx(stdscr, winy, winx); }
- initscr() === ncursesで画面制御を開始するのに必要
・入力設定
cbreak() === これを呼び出すと、キーで叩いたのが即座にプログラムに渡される(入力の後に
Enter
を押す必要がない)。1回のキー入力ですぐ反応させたい時(マップ移動みたいな)時に使える。一方で
nocbreak()
を使うとEnter
が必要になる。普通の(?)プログラムと同じ感じ- noecho() === キーボードの入力が画面に反映されない。
echo()
を使うとタイプしたキーが表示される。- keypad(stdscr, TRUE) === これを
TRUE
で呼び出すとファンクションキーを押した時に定数が返ってくる。今回は上下左右キーを使うのに利用した。・出力設定
一時的に動作確認する時に使ったけど最終的には要らんな……
- idlok(stdscr, TRUE)
- scrollok(stdscr, TRUE) ===
stdscr
は操作するwindowを示す。idlok()
は行の挿入削除の可否を指定。画面スクロールするscrollok()
を利用するために必要。・色設定
- start_color() === 色の設定を使うのに必要
- colorSetting() === 独自にまとめた
void colorSetting(){ init_pair(1, colorBLACK, colorWHITE); init_pair(2, colorRED, colorWHITE); init_pair(3, colorGREEN, colorWHITE); }
init_pair(int num, int front, int back) === 色番号
num
を、文字色front
背景back
にする。色はintで指定するが今回はインクルードファイルに定数で書いたbkgd(COLOR_PAIR(1)) ===
init_pair()
で設定した色番号num
の背景back
を画面の背景にする(VScodeとか背景が黒いのを(今回は)bkgd(COLOR_PAIR(1))
でもって白にする)。文字色のデフォルトもnum
のfront
に従う。・その他
- getmaxyx(stdscr, winy, winx) === 画面の行数を
winy
に、幅をwinx
に代入する。&winy
とかを使ってるんじゃないってことはマクロなんかな?まあなんでもええわ
int checkWindowSize() === 現在の画面サイズ(
getmaxyx()
で取得)が必要なサイズ(YOKO_ALL * TATE_ALL
)以上あるか確認する。足りなければエラーメッセージを表示してエラーカウントを増やすrt++
。エラーがあればその数を返す。エラーカウントが0なら0を返す。void endGame() === 終了時に使う。肝要なのは
endwin()
。ncursesでの制御を終えるのに必要。endwin()
を呼び出さないとその後ターミナルの表示が変になる。void reverse(int OnOff)
void reverse(int OnOff){ if(OnOff)attron(A_REVERSE); if(!OnOff)attrset(0); }
attron()
は文字の属性をオンにする。0
を入れるとデフォルトに戻る。attroff()
もあったので0
を入れる代わりにそっちを使った方がわかりやすい
次回、最終回(2020/5/15追記:最終回と思ってましたがかなりパワーアップした続編ができてます)