アットウィキロゴ

cursesサンプル記号タイピング

概要

curses ライブラリの習作として作ってみた。
ランダムに表示される記号を打つだけ。
出題が難しいときやバグで入力できなくなったときはrを打つと再度出題される。
合格ラインは 100点。

あうざー

harada(5S)
2009/08/17
2時間くらい。
キー入力が反応しなくなるバグで困った。バグの解決はあきらめた。多分キーカスタマイズしてるときしか起こらないので放置。
「windowsでコンパイルするとタイムアウトが動作しなくてゲームになってない」という問題があったが、ライブラリの最新バージョンを使うと直った。プログラマーは英語のgoogleを使おう!(調べる情報がマイナー過ぎ?)


コンパイル

winだとstype.cpp をShift_JISに変換したあと、
i586-mingw32msvc-g++ stype.cpp -lpdcurses
linux だとstype.cpp をUTF-8 に変換したあと、
g++ stype.cpp -lncursesw

データ


#include <curses.h>
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
  #include <time.h>
  #include <locale.h>
 
 
  const int gpx = 0;
  const int gpy = 10;
 
 
  const char buf[] = {"@!`=$~({[?*&\"-#^)}]+|'_%:;,.<>/\\*+"};
 
  const char disp[][40] ={
  {"1! 2\" 3# 4$ 5% 6& 7' 8( 9) 0  -= ^~ \\|" },
  {"qQ wW eE rR tT yY uU iI oO pP @` [{"},
  {"aA sS dD fF gG hH jJ kK lL ;+ :* ]}"},
  {"zZ xX cC vV bB nN mM ,< .> /? \\_"}}; 
  const char reset_char = 'r';
 
  bool fguide=true;
 
  void dispguide(char ch)
  {
    if(!fguide)return;
    char cd;
    for(int l=0;l<4;l++)
    {
      for(int n=0;cd=disp[l][n];n++)
      {
        if(cd == ch)attrset(A_REVERSE);
        mvaddch(gpy + l,gpx + n,cd);
        attrset(A_NORMAL);
      }
    }
  }
 
  int main(int argc,char **argv,char **arge)
  {
    int point=10;
    int score = 0;
    int tot= 2000;
    char qc,ic;
    setlocale(LC_ALL,"");
    initscr();
    cbreak();
    srand(time(NULL));
    noecho();
    for(int n=0;argv[n];n++)
    {
      if(strcmp(argv[n],"-g"))fguide=false;
    }
  reset:
    qc = buf[rand()%sizeof(buf)];
    dispguide('\0');
    while(true)
    {
      mvprintw(1,1,"time :%4d",tot);
      mvprintw(2,1,"score:%8d",score);
      mvprintw(3,1,"point:%8d",point);
      mvprintw(6,1,"%c%4x",qc,qc);
      move(6,1); ic = getch();
      if(ic == reset_char)goto reset;
      if(ic == qc)
      {
        score++;
        point++;
        qc = buf[rand()%sizeof(buf)];
        dispguide(qc);
        timeout(tot=tot*143/145);
      }else{
        point--;
      }
      if(point == 0) break;
    }
 
    endwin();
    printf("score:%d\n",score);
    if(score<60)
      printf("落ち着いてタイプしましょう。\n");
    else if(score<70)
      printf("もっとがんばりましょう。\n");
    else if(score<80)
      printf("練習あるのみです。\n");
    else if(score<100)
      printf("まだまだがんばりましょう。\n");
    else if(fguide)
      printf("キーの位置は覚えられましたか?\
  -g オプションを付けてガイドなしでやってみましょう。\n");
    else
      printf("よくできました。これからも精進しましょう。\n");
    exit(0);
  }
 
最終更新:2009年08月17日 21:50
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。
添付ファイル