おはやし日記

テーマ……バイク←プログラミング←旅

プログラムにナンプレを解かせたい - その2

パソコンにナンプレを解かせたい。

前回は中心部分のプログラムを振り返ってみました。今回はセッティングについて

o-treetree.hatenablog.com

セッティング

sudoku/ver.1/setting

ヘッダファイル

#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))でもって白にする)。文字色のデフォルトもnumfrontに従う。

・その他

  • 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追記:最終回と思ってましたがかなりパワーアップした続編ができてます)

o-treetree.hatenablog.com

プライバシーポリシー ・お問い合わせはこちら