投稿二つ目!夏休みプチプログラミングコンテスト2018

夏休みプチプログラミングコンテスト2018への投稿です。二つ目!

一つ目はこちらです。
投稿!夏休みプチプログラミングコンテスト2018

今回のプログラムは、「2018夏休み 自由研究」!
「1個のみかんの皮、どこまで伸ばせるのか研究」です。

みかん好きなクエリちゃんが小学生で自由研究をしたら、というところからの考案です。

動作の内容は、mi ka n のいずれかを入力してエンターキー。制限時間内に入力されたmikanの数で、研究結果(長さ)が決まるゲームのようになってます。

ソースはここに載せておきます。改変して利用などもご自由にどうぞ!
スレッド利用やタイマー、入力待ちの使い方など、小さめだけど濃い目です。
無限ループのforとwhileの使い分けは、あとで回数や条件を付けれるようにとかそういう感覚です。
たまたま2つ使ってるので一応書いておきます。

右クリックからダウンロード
https://cocoamix.jp/puttti2018/mikan.c

macではそのまま、
cc mikan.c
./a.out
で動作すると思います。

中身のほぼほぼ全般

// defines
int gamejikan =10; //入力時間
int mikanSize = 5;//1MiKaNでの長さ
char *title = "⭐️ 2018夏休み 自由研究! ⭐\n「1個のみかんの皮、どこまで伸ばせるのか研究」\n";
char *subtitle = "mi ka n のいずれかを入力してEnter。mikanの数で長さが決まります。制限時間: %d秒\n- Enterで開始 -";
char *msgTimeup = "\n時間で〜〜す!!\n- Enterで結果表示 -\n";
char *mikan[] =
{
		"mi",
		"ka",
		"n",
};
char *kekka_head = "⭐️ 研究の成果 ⭐️ \n\n🍊";
char *msgTrophy[] =
{
		"先生「努力が足りません。」",
		"先生「頑張りましたね!!!」",
		"先生「これは世界新記録かもしれませんよ!」",
		"先生「チートいけません」",
};
char *msgEnd = "--- 自由研究 終了 ---";
//////////////////////////////////////////////////////
// globalな変数
// Mi Ka N カウント保持
int countMi = 0;
int countKa = 0;
int countN = 0;

int endFlug = 0;	//スレッド終了用flug
//////////////////////////////////////////////////////

int inputMain();
void *inputting();

//
// メイン
int main(void){	
	inputMain();
	return 0;
}

//
// 入力ループなスレッドfunc
void *inputting(){
	char buff[256];
	for(;;){
		// 入力読み込み
		memset(buff,0x00,sizeof(buff));
		fgets(buff, sizeof(buff), stdin);
		if(strlen(buff)>0)buff[strlen(buff) - 1] = 0x00;//改行消し

		if(endFlug == 1){
			// 入力ループ、thread終了
			break;
		}
		// Mi or Ka or N
		int len = strlen(buff);
		if(len >= 2){
			if(strncasecmp(buff, mikan[0],strlen(mikan[0])) == 0){
				countMi++;
			}else if(strncasecmp(buff, mikan[1],strlen(mikan[1])) == 0){
				countKa++;
			}
		}else{
			if(strncasecmp(buff, mikan[2],strlen(mikan[2])) == 0){
				countN++;
			}
		}
		//printf("%d %d %d",countMi,countKa,countN);
	}
	return 0;
}

//
// みかんチャレンジ
int inputMain(){
	int ret = 0;
	// タイトル表示
	printf("%s",title);
	printf(subtitle,gamejikan);
	char buff[4];
	fgets(buff, 4, stdin);//enter待ち用に

	// 入力スレッド生成
	pthread_t inputThread;
	pthread_create( &inputThread, NULL, &inputting, NULL);
	
	// タイマー
	double timeStart =0;
	double timeWk =0;
	double keika =0;
	double jikan =gamejikan;
	timeStart = clock() / CLOCKS_PER_SEC ;
	while(1){
		if(keika > jikan)break;
		timeWk = clock() / CLOCKS_PER_SEC ;
		keika = timeWk - timeStart;
	}
	// 入力終了
	printf("%s", msgTimeup);
	endFlug = 1;
	pthread_join(inputThread, NULL); //スレッド終了待ち	
		
	// 結果表示
	int kekkaCount = countMi;
	if(kekkaCount > countKa) kekkaCount = countKa;
	if(kekkaCount > countN) kekkaCount = countN;
	printf("%s", kekka_head);
	sleep(1);
	for(int i=0; i< kekkaCount;i++){
		printf("-");
	}
	printf("\n\n%dセンチまで伸ばせました!\n",kekkaCount*mikanSize);
	if(kekkaCount < 3){
		printf("%s\n\n",msgTrophy[0]);
	}else if(kekkaCount < 10){
		printf("%s\n\n",msgTrophy[1]);
	}else if(kekkaCount < 20){
		printf("%s\n\n",msgTrophy[2]);
	}else{
		printf("%s\n\n",msgTrophy[3]);
	}
	
	printf("入力した数 Mi: %d Ka: %d N: %d\n\n",countMi,countKa,countN);

	sleep(1);
	printf("%s\n\n",msgEnd);
	return ret;
}