仕事にお疲れの皆様へ
皆さん、コンソールを使って作業されることが多いですよね?
作業していてちょっと疲れた時に、気分転換にコーヒーを飲みながらコンソール上で軽くオセロがしたい、なんて思うことがありますよね。
でも、
- 背景が白黒じゃ気分転換にならない。
- f5ってタイプして打つのはめんどくさい。
そんな方へ、コンソール上でGUI風なオセロが出来る、CBOARDを贈ります!
CBOARD
早速お披露目。
ちゃんと盤に色が付いていて、マウスを操作して石をひっくり返ることができます。
ソースコードはこちら => cboard
マウスで操作にするために
コンソール上でマウスを使って操作するために、NCURSES libraryを使用しました。
まずは、コンソールの設定をします。
#include <ncurses.h>
void ui_init_cboard(UI *ui) {
initscr(); // 端末の初期化
noecho(); // キーボードの入力をコンソールに表示しない
curs_set(0); // カーソルを非表示に
keypad(stdscr, TRUE); //マウスの入力を、キーコード(KEY_MOUSE)として受け取る
mousemask(ALL_MOUSE_EVENTS, NULL); //マウスのイベントを有効にする
}
// スクリーンをリセット
void ui_free_cboard(UI *ui) { endwin(); }
マウスイベントの受け取り
getch
でイベントを受け取り、getmouse
で座標を取得します。
void control_keyinput(int *x) {
int ch = getch();
MEVENT e;
switch (ch) {
case KEY_MOUSE:
if (getmouse(&e) == OK) {
// マウスイベントを受け取った時の処理。e.xとe.yにマウスの座標が入ります。
}
break;
}
}
盤面に色をつける
背景色と文字色のペアを用意します。
void ui_init_cboard(UI *ui) {
initscr();
start_color();
init_pair(1, COLOR_WHITE, COLOR_BLACK); // 背景:黒、文字:白
init_pair(2, COLOR_BLACK, COLOR_GREEN); // 背景:緑、文字:黒
init_pair(3, COLOR_WHITE, COLOR_GREEN); // 背景:緑、文字:白
}
あとは、設定したカラーペアをセットし、コンソールに出力するだけ。
void print_board(Play *play) {
attron(COLOR_PAIR(2));
mvprintw(2, 0, COLUMN_LABEL);
}
オセロの機能部分を実装
機能部分はedaxから必要な部分を取ってきました。既に実装されてるから、簡単に実装できるっていうのが一つの理由ですが、もう一つはedaxのUIとして組み込めたらいいな、なんて思ったからです。edaxの学習がボタン操作で全部できたり、定石の研究、盤面検討までコンソール上でできたりするかも?
もう少しちゃんとedaxとのインタフェース部分を作り込めば、組み込めるはずです。
最後に
あの有名なslコマンドをみて、コンソール上で動く物を何か作ってみたいなと思い、cboardを考えました。slコマンドみたいにオプションを付けてみたり、もっといろんな動きを付けても面白いかなって思います。
ncursesは、シンプルな実装で、簡単に動くものが作れました。初めてアプリを作ろうと思っている人にぴったりな気がしました。
Advent Calendarも残りわずかですが、楽しみましょう!
ちなみに、オセロは角を取ったら強いので、5日と20日に投稿させていただきました。w