結局、机の前に座ってるのが居心地良すぎて、勉強を止められなくなりました~
結局、机の前に座ってるのが居心地良すぎて、勉強を止められなくなりました~
/* タイピング練習用プログラム */
#include<conio.h>
#include<ctype.h>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define DEF_LIFE 10 /* 制限時間内に入力できない回数の上限 */
#define QUES_NUM 51 /* ques[]の要素数 */
char str[26]="abcdefghijklmnopqrstuvwxyz"; /* アルファベット26文字を格納 */
char ques[QUES_NUM]; /* タイプしてもらうべき文字を格納 */
char high_score[16]; /* ハイスコアを格納するファイル名を格納 */
char wday_name[][3]={"日","月","火","水","木","金","土"};/* 曜日の名前を格納 */
/* 1行の最初の70文字だけ削除 */
void cls(void){
putchar('\r');
printf("%70s","");
putchar('\r');
}
int main(void){
int sel;/* 繰り返し実行するかどうか */
/* 乱数の種を実行したときの時間で設定 */
srand((unsigned)time(NULL));
/* ルールを表示 */
puts("これはタイピング練習用のプログラムです。");
puts("レベルは低いほど難しいですが、入力できるのは1以上です。");
puts("一番左の数が0になるとゲームオーバーです。");
puts("左の数は一文字あたり設定したレベルミリ秒以内に入力しないと減っていきます。");
printf("その数は初め%dに設定されています。\n",DEF_LIFE);
puts("数字の右にある文字を左から順にタイプしていってください。");
puts("ハイスコアとして残るのは入力文字数からミスタイプ数を引いたものです。");
puts("検討をお祈りしています。");
do{
int x; /* 乱数の格納 */
int count=0; /* 入力した文字数 */
int life=DEF_LIFE; /* ゲームオーバーの判定に使う */
char ch; /* getcharやfgetc,getch関数で読み込んだ値を格納 */
clock_t c1,c2; /* 1文字あたりの入力時間をカウントするための変数 */
clock_t start,end; /* そう入力時間をカウントするための変数 */
int i; /* for文などの繰り返しの制御に使う */
int LIM_TIME=-1; /* 一文字あたりの制限時間[msec] */
FILE *fp; /* ハイスコアを読み込んだり格納したりするためのファイル */
int score=-1; /* 新記録が出たかどうか確認(スコアが読み取れなかった時の為に-1で初期化) */
int year,month,mday,wday,hour,min,sec;/* high_scoreから日付を読み取る */
int times=1; /* トライした回数を格納 */
struct tm *local; /* ローカルタイムに直す */
time_t now; /* 時刻を読み取る */
int miss_type=0; /* ミスタイプ数をカウント */
/* ハイスコアを格納するファイル名を形成 */
printf("あなたの名前を入力してください。:");
scanf("%s",high_score);
if((fp=fopen(high_score,"r"))!=NULL){ /* オープン */
fscanf(fp,"%d%d%d%d%d%d%d%d%d%d",&year,&month,&mday,&wday,&hour,&min,&sec,&score,&LIM_TIME,×);
fclose(fp); /* クローズ */
}
/* レベルの設定 */
printf("\n\nレベルを設定します。表示される文字をタイプして下さい。\n");
printf("何かキーを押すと文字が表示されます。");
getch();
cls();
/* clock()がエラーを返したらプログラムの終了 */
if((c1=clock())==(clock_t)-1){
printf("\n何かキーを押すと終了します。");
getch();
return(0);
}
/* 問題の生成 */
for(i=0;i<QUES_NUM-1;i++){
x=rand()%26;
ques[i]=str[x];
}
ques[QUES_NUM-1]='\0';
do{
/* これから問題を表示する1行を消去 */
cls();
/* 問題を表示 */
printf("%s",ques);
/* 正解が入力されるまで入力待ち */
do{
ch=tolower(getch());
}while(ch!=ques[0]);
/* ques[]の配列を一つ前に詰めて、最後にNULL文字を格納 */
for(i=1;i<QUES_NUM-1;i++)
ques[i-1]=ques[i];
ques[QUES_NUM-2]='\0';
}while(ques[0]);
/* clock()がエラーを返したらプログラムの終了 */
if((c2=clock())==(clock_t)-1){
cls();
printf("エラーです。");
printf("\n何かキーを押すと終了します。");
getch();
return(0);
}
cls();
if(LIM_TIME==-1 || 1000*(c2-c1)/(QUES_NUM*CLOCKS_PER_SEC)<LIM_TIME)
LIM_TIME=1000*(c2-c1)/(QUES_NUM*CLOCKS_PER_SEC);
printf("レベルは%dに設定されました。\n\n",LIM_TIME);
/* 問題の生成 */
for(i=0;i<QUES_NUM-1;i++){
x=rand()%26;
ques[i]=str[x];
}
ques[QUES_NUM-1]='\0';
printf("何かキーを押すと始まります。");
getch();
cls();
putchar('\n');
start=clock();
/* ゲームオーバーになるか、エラーが出るまで繰り返し */
do{
/* これから問題を表示する1行を消去 */
cls();
/* 問題を表示 */
printf("%d %s %d %d",life,ques,count,miss_type);
/* clock()がエラーを返したらプログラムの終了 */
if((c1=clock())==(clock_t)-1){
cls();
printf("\n何かキーを押すと終了します。");
getch();
return(0);
}
/* 正解が入力されるまで入力待ち(ミスタイプもカウント) */
while(1){
ch=tolower(getch());
if(ch!=ques[0])
miss_type++;
else
break;
}
/* ques[]の配列を一つ前に詰めて、最後に新しくアルファベットを格納 */
for(i=1;i<QUES_NUM-1;i++)
ques[i-1]=ques[i];
x=rand()%26;
ques[QUES_NUM-2]=str[x];
/* clock()がエラーを返したらプログラムの終了 */
if((c2=clock())==(clock_t)-1){
cls();
printf("エラーです。");
printf("\n何かキーを押すと終了します。");
getch();
return(0);
}
/* 入力が制限時間を超えていたら、ライフを一つ減らす */
if(1000*(c2-c1)/CLOCKS_PER_SEC>LIM_TIME){
printf("\a");
life--;
}
/* 入力文字数を数えていく */
count++;
}while(life);
end=clock();
cls();
/* 成績を表示 */
printf("入力文字数:%d\n",count);
printf("ミスタイプ:%d\n",miss_type);
printf(" 正確さ :%.3f%%\n",(double)count/(count+miss_type)*100);
printf(" 所有時間 :%.1f\n",(double)(end-start)/CLOCKS_PER_SEC);
printf("%.3f[word/sec]\n",(double)count*CLOCKS_PER_SEC/(end-start));
printf("%.3f[sec/word]\n",(end-start)/((double)count*CLOCKS_PER_SEC));
count-=miss_type;/* countをスコアとして使えるようにする */
printf("今回は%d回目の挑戦です。\n",times++);
if(score<=count){
time(&now);
local=localtime(&now);
year=local->tm_year+1900;
month=local->tm_mon+1;
mday=local->tm_mday;
wday=local->tm_wday;
hour=local->tm_hour;
min=local->tm_min;
sec=local->tm_sec;
score=count;
printf("ハイスコアおめでとうございます。\n");
}
if((fp=fopen(high_score,"w"))!=NULL){ /* オープン */
fprintf(fp,"%d %d %d %d %d %d %d %d %d %d",year,month,mday,wday,hour,min,sec,count,LIM_TIME,times);
fclose(fp); /* クローズ */
}
printf("ハイスコアは%4d/%02d/%02d/(%s)%02d:%02d:%02dに記録した%dです。",year
,month
,mday
,wday_name[wday]
,hour
,min
,sec
,score);
printf("\nもう一度?【Yes…9/No…0】:");
scanf("%d",&sel);
}while(sel);
return(0);
}
ついに完成。
ソースはっ付けとくから分かる人どうぞ
/* タイピング練習用プログラム */
#include<conio.h>
#include<ctype.h>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define LIM_TIME 1000 /* 一文字あたりの制限時間[msec] */
#define DEF_LIFE 10 /* 制限時間内に入力できない上限 */
#define QUES_NUM 50 /* ques[]の要素数 */
char str[26]="abcdefghijklmnopqrstuvwxyz";
char ques[QUES_NUM];
void cls(void){
putchar('\r');
printf("%70s","");
putchar('\r');
}
int main(void){
int x;
int count=0;
int life=DEF_LIFE;
char ch;
clock_t c1,c2;
clock_t start,end;
int i;
srand((unsigned)time(NULL));
for(i=0;i<QUES_NUM-1;i++){
x=rand()%26;
ques[i]=str[x];
}
ques[QUES_NUM-1]='\0';
printf("何かキーを押すと始まります。");
getch();
cls();
start=clock();
do{
cls();
printf("%d %s",life,ques);
if((c1=clock())==(clock_t)-1){
cls();
printf("\n何かキーを押すと終了します。");
getch();
return(0);
}
do{
ch=getch();
}while(ch!=ques[0]);
for(i=1;i<QUES_NUM-1;i++)
ques[i-1]=ques[i];
x=rand()%26;
ques[QUES_NUM-2]=str[x];
if((c2=clock())==(clock_t)-1){
cls();
printf("エラーです。");
printf("\n何かキーを押すと終了します。");
getch();
return(0);
}
if(1000*(c2-c1)/CLOCKS_PER_SEC>LIM_TIME){
printf("\a");
life--;
}
count++;
}while(life);
end=clock();
cls();
printf("入力文字数:%d\n",count);
printf(" 所有時間 :%.1f\n",(double)(end-start)/CLOCKS_PER_SEC);
printf("%.3f[word/sec]",(double)count*CLOCKS_PER_SEC/(end-start));
printf("\n何かキーを押すと終了します。");
getch();
cls();
return(0);
}
コメント文が少ないから読みにくいかもね。