じゃまする

C言語初心者学習記Part10

謎のジャンケンゲームVer2.0へ…

ジャンケンゲーム(仮)を作り終えて、

「なんか味気ないなぁ~」

などと思っていた私はこいつに要らぬ機能を実装しようと考えましたw

それは、今までの戦績を表示するシステム。

勉強にはなったのですが、「あってもなくても…正直、どうでもいい。」という。

謎のジャンケンゲームVer2.0の概要

ジャンケンゲームに今までの戦績を保存・表示する事にしました。

そのために、

1、他ファイルで戦績を保存・入出力

2、ある試行内の戦績を管理

3、その戦績をファイルに入れて更新

しないといけないことに…

しかし、それが悪夢の始まりでした…

 

謎のジャンケンゲームVer2.0のコード

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

/*プロトタイプ宣言*/
void trans(int);
void judge(int,int);

/*変数*/
int hand;
int comhand;
hand=0;
comhand=0;

/*フラグ変数*/
int signal=0;

/*戦績用変数*/
int total,win,lose,draw,foul;
total=0;
win=0;
lose=0;
draw=0;
foul=0;

int main(void)
{
	/*ファイル操作*/
	FILE *file;
	char *fname="result.txt";
	int total1,win1,lose1,draw1,foul1;
	total1=0;
	win1=0;
	lose1=0;
	draw1=0;
	foul1=0;
	
	if((file=fopen("result.txt","a+"))==NULL){
		printf("%sはひらけませんでした\n",fname);
		return -1;
	}
	fclose(file);
	
	if((file=fopen("result.txt","r"))==NULL){
		printf("%sはひらけませんでした\n",fname);
		return -1;
	}
	
	int i;
	int data[5];
	char txt[256];
	char *ch;
	memset(data,0,sizeof(data));
	memset(txt,0,sizeof(txt));
	ch=NULL;
	
	while(fgets(txt,sizeof(txt),file)!=NULL){
	}
	
	ch=strtok(txt,",");
	for(i=0;i<5;i++){
		if(ch==NULL){
			break;
		}else{
			data[i]=atoi(ch);
		}
		ch=strtok(NULL,",");
	}
	
	total1=data[0];
	win1=data[1];
	lose1=data[2];
	draw1=data[3];
	foul1=data[4];
	fclose(file);
	
	
	/*タイトル*/
	printf("\n*===ジャンケンゲーム===*\n");
	printf("\n");
	printf("\t====今までの戦績====\n\t総試合数:%d\n\t勝利回数:%d\n\t敗北回数:%d\n\t引き分け回数:%d\n\tズルした回数:%d\n\n\n",total1,win1,lose1,draw1,foul1);
	
	/*ジャンケンゲーム本体(あいこ、予期せぬ入力でここに戻る)*/
	file=fopen("result.txt","w");
	do{
		total++;
		
		/*導入部分*/
		printf("ジャン\a\n");
		printf("ケン\a\n");
		printf("出す手を決めて数字を半角で入力\n【1:グー2:チョキ3:パー】\n:");
		
		/*入力部分*/
		char str[2];
		
		fgets(str,sizeof(str),stdin);
		hand=atoi(str);
		
		/*出力部分*/
		printf("ポン!\a\n");
		printf("\n");
		printf("貴方の手:");
		trans(hand);
		
		srand((unsigned int)time(NULL));
		comhand=rand()%3+1;
		printf("コンピューターの手:");
		trans(comhand);
		
		/*結果出力*/
		judge(hand,comhand);
		
	}while(signal==1,signal--);
	
	fprintf(file,"%d,",total+total1);
	fprintf(file,"%d,",win+win1);
	fprintf(file,"%d,",lose+lose1);
	fprintf(file,"%d,",draw+draw1);
	fprintf(file,"%d,",foul+foul1);
	
	fclose(file);
	
	return 0;
}

/*変換関数*/
void trans(int hand)
{
	switch(hand){
		case 1:
			printf("グー\n");
			break;
			
		case 2:
			printf("チョキ\n");
			break;
			
		case 3:
			printf("パー\n");
			break;
			
		default:
			printf("ズルはしないでいただきたい!\n");
			break;
	}
}

/*勝敗判別関数*/
void judge(int hand,int comhand)
{
	if(hand!=1^hand!=2^hand!=3){
		printf("やりなおし!\n");
		signal++;
		foul++;
	}else{
		if(hand==comhand){
			printf("あいこだ!\n「貴様…なかなかやるな…」\n");
			signal++;
			draw++;
		}else{
			if(hand==1){
				if(comhand==2){
					printf("貴方の勝ち!\n「貴様…ジャンケン道を極めたようだな…」\n");
					win++;
				}else{
					printf("貴方の負け…\n「ジャンケン道、其即、阿修羅道也!」\n");
					lose++;
				}
			}
			if(hand==2){
				if(comhand==3){
					printf("貴方の勝ち!\n「貴様…ジャンケン道を極めたようだな…」\n");
					win++;
				}else{
					printf("貴方の負け…\n「ジャンケン道、其即、阿修羅道也!」\n");
					lose++;
				}
			}
			if(hand==3){
				if(comhand==1){
					printf("貴方の勝ち!\n「貴様…ジャンケン道を極めたようだな…」\n");
					win++;
				}else{
					printf("貴方の負け…\n「ジャンケン道、其即、阿修羅道也!」\n");
					lose++;
				}
			}
		}
	}
}

色々改変して大変でした。

特にファイルが絡んだ時に非常に苦労しました…

確実に無駄が含まれてそうですがとりあえずこれで戦績機能が付きました。

次回からはこのコードの反省点についてお話していきます。

 

 


 

【前→C言語初心者学習記 part9

【後→C言語初心者学習記 part11】


0

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA