質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

curses

cursesは、 UNIX 系列で使用される端末制御ライブラリです。CUI アプリケーションを作成するために使用されます。表示端末は多くの制御コードをサポートしており、カーソル移動や画面のスクロール、領域消去といった一般的な操作の実行が可能です。

Q&A

解決済

1回答

2094閲覧

ncursesでタイピングソフトを作成したい

PJwnOI

総合スコア39

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

curses

cursesは、 UNIX 系列で使用される端末制御ライブラリです。CUI アプリケーションを作成するために使用されます。表示端末は多くの制御コードをサポートしており、カーソル移動や画面のスクロール、領域消去といった一般的な操作の実行が可能です。

0グッド

0クリップ

投稿2020/07/24 03:31

編集2020/07/24 03:33

前提・実現したいこと

C言語とncursesでタイピング練習ソフトを作っています。
英単語が画面に表示されており、キーボードからその単語を入力すると赤文字に変化し、その単語の文字を全て入力し終わると次の文字が表示されるようにしたいです。

ex hogehogeと表示されていて、hoと入力したときの場合

hogehoge(hoが赤文字)

ソースコード

C

1#include <stdio.h> 2#include <ncurses.h> 3#include <stdlib.h> 4#include <string.h> 5#include <unistd.h> 6#include <locale.h> 7#include "type_pra.h" 8 9#define LEN 2048 10 11void start_type(void){ 12 int pra_x,pra_y; 13 FILE *fp; 14 char fname[] = "type.txt"; 15 char str[LEN]; 16 char pra_ch; 17 int i=0; 18 19 20 clear(); 21 refresh(); 22 noecho(); 23 getmaxyx(stdscr, pra_y, pra_x); 24 25 fp = fopen(fname,"r"); 26 27 if(fp == NULL){ 28 fprintf(stderr,"%s file not open\n", fname); 29 exit(EXIT_FAILURE); 30 } 31 32 i = 0; 33 while(fgets(str, LEN, fp) != NULL){ 34 mvprintw(pra_y/2-10, pra_x/2, "%s", str); 35 refresh(); 36 do{ 37 pra_ch = getchar(); 38 if(pra_ch == str[i]){ 39 i++; 40 addch(str[i]|COLOR_RED); 41 } 42 }while(pra_ch != ' '); 43 44 } 45 pra_ch = getchar(); 46 while(pra_ch != '0'){ 47 start_type(); 48 pra_ch = getchar(); 49 } 50 fclose(fp); 51}

試したこと

addch関数を用いて文字の色を赤にしようと試みましたが変わりませんでした。
ソースコードに貼ってあるコードは、スペースを押すと次の文字に遷移します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

足りなかった処理は、

  • 最初にinitscrを呼び出す
  • Enterキーをいちいち押さなくていいようにcbreakを呼び出す
  • 色を扱うならstart_colorを呼び出す
  • 文字色・背景色のペアをinit_pairで定義しておく
  • キー入力はgetchで行なう
  • 最後にendwinを呼び出す

などなど。

本題でないのでいじらなかったが、問題は最初に配列に格納しておくほうがいい。以下のコードでは、単語だけでなく文章の入力もできるようにしてある。

C

1#include <stdio.h> 2#include <ncurses.h> 3#include <stdlib.h> 4#include <string.h> 5#include <unistd.h> 6#include <locale.h> 7//#include "type_pra.h" 8 9#define LEN 2048 10void start_type(void); 11 12int main(void) 13{ 14 start_type(); 15 return 0; 16} 17 18void start_type(void) 19{ 20 char fname[] = "type.txt"; 21 22 FILE *fp = fopen(fname, "r"); 23 if (fp == NULL) { 24 fprintf(stderr,"%s file not open\n", fname); 25 exit(EXIT_FAILURE); 26 } 27 28 initscr(); 29 noecho(); 30 cbreak(); 31 32 start_color(); 33 init_pair(1, COLOR_BLACK, COLOR_WHITE); 34 init_pair(2, COLOR_RED, COLOR_WHITE); 35 bkgd(COLOR_PAIR(1)); 36 clear(); 37 38 int pra_x, pra_y; 39 getmaxyx(stdscr, pra_y, pra_x); 40 41 int center_x = pra_x / 2; 42 int center_y = pra_y / 2; 43 44 char str[LEN]; 45 while (fgets(str, sizeof(str), fp) != NULL) { 46 int i = 0; 47 int start_x = center_x - strlen(str) / 2; 48 int start_y = center_y; 49 50 move(start_y, 0); 51 clrtoeol(); 52 53 attron(COLOR_PAIR(1)); 54 mvprintw(start_y, start_x, "%s", str); 55 move(start_y, start_x); 56 57 refresh(); 58 59 do { 60 int pra_ch = getch(); 61 62 if (pra_ch == str[i]) { 63 move(start_y, start_x + i); 64 attron(COLOR_PAIR(2)); 65 addch(str[i]); 66 refresh(); 67 i++; 68 } 69 } while (str[i] != '\0'); 70 } 71 72 move(center_y, 0); 73 clrtoeol(); 74 attron(COLOR_PAIR(2)); 75 mvaddstr(center_y, center_x - 4, "GAME OVER"); 76 getch(); 77 78 79 endwin(); 80 81}

投稿2020/07/24 07:33

編集2020/07/24 07:35
Daregada

総合スコア11990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

PJwnOI

2020/07/25 05:34

解決しました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問