7
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

オセロAdvent Calendar 2020

Day 20

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

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

7
0
0

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
  3. You can use dark theme
What you can do with signing up
7
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?