C言語でncursesの使い方を教えて!
こういった悩みにお答えします.
本記事の信頼性
- リアルタイムシステムの研究歴12年.
- 東大教員の時に,英語でOS(Linuxカーネル)の授業.
- 2012年9月~2013年8月にアメリカのノースカロライナ大学チャペルヒル校(UNC)コンピュータサイエンス学部で客員研究員として勤務.C言語でリアルタイムLinuxの研究開発.
- プログラミング歴15年以上,習得している言語: C/C++,Python,Solidity/Vyper,Java,Ruby,Go,Rust,D,HTML/CSS/JS/PHP,MATLAB,Assembler (x64,ARM).
- 東大教員の時に,C++言語で開発した「LLVMコンパイラの拡張」,C言語で開発した独自のリアルタイムOS「Mcube Kernel」をGitHubにオープンソースとして公開.
- 2020年1月~現在はアメリカのノースカロライナ州チャペルヒルにあるGuarantee Happiness LLCのCTOとしてECサイト開発やWeb/SNSマーケティングの業務.2022年6月~現在はアメリカのノースカロライナ州チャペルヒルにあるJapanese Tar Heel, Inc.のCEO兼CTO.
- 最近は自然言語処理AIとイーサリアムに関する有益な情報発信に従事.
- (AI全般を含む)自然言語処理AIの論文の日本語訳や,AIチャットボット(ChatGPT,Auto-GPT,Gemini(旧Bard)など)の記事を50本以上執筆.アメリカのサンフランシスコ(広義のシリコンバレー)の会社でプロンプトエンジニア・マネージャー・Quality Assurance(QA)の業務委託の経験あり.
- (スマートコントラクトのプログラミングを含む)イーサリアムや仮想通貨全般の記事を200本以上執筆.イギリスのロンドンの会社で仮想通貨の英語の記事を日本語に翻訳する業務委託の経験あり.
こういった私から学べます.
C言語を独学で習得することは難しいです.
私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.
私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!
独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!
目次
【C言語】ncurses
ncursesは,C言語のテキストユーザインタフェース (TUI) ライブラリです.
ncursesを利用するとTUIで柔軟な操作が可能になり,コンソールアプリケーションが開発できるようになります.
Ubuntuでncursesをインストールするためには,以下のコマンドを実行して下さい.
1 |
$ sudo apt-get install libncurses5-dev libncursesw5-dev ncurses-doc |
ncursesでよく利用する関数
ncursesでよく利用する関数を紹介します.
initscr/endwin関数
1 2 |
WINDOW *initscr(void); int endwin(void); |
initscr/endwin関数を紹介します.
initscr関数は通常,プログラムを初期化する際に最初に呼び出されるncursesルーチンです.
endwin関数はncursesモードを一時的に終了またはエスケープする前に呼び出されます.
endwin関数は,ncursesモードを復元し,カーソルを画面の左下隅に移動させ,端末を適切な非ビジュアルモードにリセットします.
printw関数
1 |
int printw(const char *fmt, ...); |
printw関数はprintf関数と似ている関数です.
ncursesモードでprintw関数を利用すると,printf関数で出力する文字列が代わりに出力されます.
refresh関数
1 |
int refresh(void); |
refresh関数はprintw関数等での出力を実際にncursesモードで表示するために呼び出される関数です.
※環境によってはrefresh関数を呼び出さなくても表示される場合があります.
getch関数
1 |
int getch(void); |
getch関数は,ncursesモードの端末から文字を読み取ります.
また,getch関数の文字を読み取る性質を利用して,printw関数の出力結果をユーザが読むために利用します.
この理由は,プログラムが終了するとncursesモードも終了し,そこで出力した結果が見れなくなってしまうからです.
ncursesモードのprintw関数で「Hello World!」を表示
ncursesモードのprintw関数で「Hello World!」を表示するコードを紹介します.
このコードの特徴は以下になります.
- printf関数のプロトタイプ宣言があるstdio.hをインクルードしないこと
- initscr/printw/refresh/getch/endwin関数を呼び出すこと
コードは以下になります.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <ncurses.h> int main(void) { initscr(); printw("Hello World!\n"); refresh(); getch(); endwin(); return 0; } |
実行結果は以下になります.
1 2 3 4 5 6 |
$ gcc ncurses.c -lncurses $ a.out [ncursesモード開始] Hello World! [何か文字を入力してncursesモード終了] $ |
ncursesを利用したコンソールアプリケーション(ゲーム)
ncursesを利用したコンソールアプリケーション(ゲーム)を紹介します.
アプリケーション内でncursesがどのように利用されているのかコードを解析しつつ遊びましょう!
テトリス
ncursesを利用したコンソールアプリケーションとしてテトリスがあります.
テトリスのコードはたくさんありますが,代表的なテトリスのコードはこちらになります.
1 |
$ git clone https://github.com/brenns10/tetris |
Makefileの18行目のSDL=yesと設定されているため,SDLをインストールしていないと「unable to initialize SDL_mixer」という実行時エラーが発生します.
MakefileのSDL=yesをSDL=noにしましょう.
※Ubuntu 22.04 LTSでSDLをインストールする方法も試したのですが,うまくいきませんでした...
無事実行できたらテトリスで遊びましょう!
ブロック崩し
ncursesを利用したC言語のブロック崩しを紹介します.
ブロック崩しのコードはたくさんありますが,代表的なブロック崩しのコードはこちらになります.
1 |
$ git clone https://github.com/pokohide/BreakOut |
無事実行できたらブロック崩しで遊びましょう!
まとめ
C言語でテキストユーザインタフェース (TUI) ライブラリncursesの使い方を紹介しました.
また,ncursesを利用したコンソールアプリケーション(ゲーム)としてテトリスとブロック崩しを解説しました.
ncursesを深く学びたいあなたは,以下の記事がおすすめです.
C言語でじゃんけんゲームを作成したいあなたはこちらからどうぞ.
C言語を独学で習得することは難しいです.
私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.
私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!
独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!