LoginSignup
0

More than 1 year has passed since last update.

コンソール作業にお疲れの皆様へ贈るオセロ

Last updated at Posted at 2020-12-19

仕事にお疲れの皆様へ

皆さん、コンソールを使って作業されることが多いですよね?
作業していてちょっと疲れた時に、気分転換にコーヒーを飲みながらコンソール上で軽くオセロがしたい、なんて思うことがありますよね。

でも、

  • 背景が白黒じゃ気分転換にならない。
  • f5ってタイプして打つのはめんどくさい。

image.png

そんな方へ、コンソール上でGUI風なオセロが出来る、CBOARDを贈ります!

CBOARD

早速お披露目。
ちゃんと盤に色が付いていて、マウスを操作して石をひっくり返ることができます。
ソースコードはこちら => cboard

CBOARD_SHORT.gif

マウスで操作にするために

コンソール上でマウスを使って操作するために、NCURSES libraryを使用しました。
まずは、コンソールの設定をします。

src/cboard.c
#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で座標を取得します。

src/cboard.c
void control_keyinput(int *x) {
  int ch = getch();
  MEVENT e;
  switch (ch) {
  case KEY_MOUSE:
    if (getmouse(&e) == OK) {
      // マウスイベントを受け取った時の処理。e.xとe.yにマウスの座標が入ります。
    }
    break;
  }
}

盤面に色をつける

背景色と文字色のペアを用意します。

src/cboard.c
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);  // 背景:緑、文字:白
}

あとは、設定したカラーペアをセットし、コンソールに出力するだけ。

src/cboard.c
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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0