表題の通り、数字当てゲームを作りました。
数字当てゲームは正しく動きます。作った数字当てゲームはそのまま表記しておきます。
【やりたいこと】
ゲームが始まった時点でファイルを開く→
ゲーム1ラウンドが終わったらプログラム内でtotal(3ゲームで1セット、その1セットの得点)を持っておく→
ゲームは連続して行うことができる、2ラウンド目を開始orゲーム終了→
ゲームが続いたのであれば1ラウンド目と2ラウンド目をファイル内の順位と比較、大きい数値を先頭に置き2位以下の順位はずらしていく→
ゲームが終わったら順位をファイルに書き込み→ファイルを閉じる
どうかご教示ください。
よろしくお願い致します。
#include <stdlib.h> #include <time.h> #include <string.h> void MakeNumber(int answer[4]); void input(char* strinput, int* turn); void hantei(int* hitcount, int* blowcount, char* strinput, int answer[4]); void outputresult(int turn, int i, char str[10][5], int hitkeep[10], int blowkeep[10]); int main() { printf("**数字当てゲーム**\n" "4桁の数を当ててください。\n" "同じ数は1度しか使用されません。\n"); int answer[4]; //答えを格納するための変数 char strinput[10][5]; //入力値[i]番目を記憶しておくための配列 int turn = 0; //ターン格納変数 int hitcount = 0; int blowcount = 0; int i; int hitkeep[10]; int blowkeep[10]; MakeNumber(answer); for (i = 0; i < 10; i++) { input(strinput[i], &turn);//入力したstrの[i]番目を渡したい(strはstrinputに入っている) hantei(&hitcount, &blowcount, strinput[i], answer); hitkeep[i] = hitcount; blowkeep[i] = blowcount; if (hitcount == 4) { printf("正解。\n"); break; } outputresult(turn, i, strinput, hitkeep, blowkeep); if (turn == 10) { printf("ターン残数0、ゲームオーバー。答えは%d%d%d%dです。\n",answer[0],answer[1],answer[2],answer[3]); } } } /* file = fopen("rank.txt","a+");//ファイルを開く fscanf(fscanf(file, %d, &read);//ファイルを読み込む */ //4桁の乱数作成 void MakeNumber(int answer[4]) { int i; int count = 0; int num; srand((unsigned)time(NULL)); while (count < 4) { num = rand() % 10; for (i = 0; i < count; i++) { //重複がある場合 if (answer[i] == num) { break; } } //重複が無い場合 if (i >= count) { answer[count++] = num; } } } //キーボードから任意の数字を入力 //入力したものが数字じゃなかった場合と4桁じゃなかった場合ターンのカウントはせず、入力をやり直させる void input(char* strinput, int* turn) { char str[10]; int len = 0; //文字の長さを格納 int i; while (true) { gets_s(str,10); len = strlen(str); if (len != 4) { printf("4桁の数字を入力してください。\n"); continue; } for (i = 0; i < len; i++) { if (str[i] < '0' || str[i] > '9')//iが0または9より小さい場合ループを抜ける { break; } } if (i != 4) { printf("数字を入力してください。\n"); continue; } break; } strinput[0] = str[0]; strinput[1] = str[1]; strinput[2] = str[2]; strinput[3] = str[3]; strinput[4] = str[4]; (*turn)++; //入力ができたらターン数を加算D } //入力した数と答えの数を比較する //Hit,Blowを保管するための関数の宣言、複数の戻り値を返す関数を引数を使って実現する void hantei(int* hitcount, int* blowcount, char strinput[5], int answer[4]) { int hit = 0; int nothit = 0; int blow = 0; int i; int j; int inputNum[4]; int answercopy[4]; answercopy[0] = answer[0]; answercopy[1] = answer[1]; answercopy[2] = answer[2]; answercopy[3] = answer[3]; //char型から数値に変換 for (i = 0; i < 4; i++) { inputNum[i] = strinput[i] - '0'; } //ヒット判定 for (i = 0; i < 4; i++) { if (inputNum[i] == answercopy[i]) { hit++; answercopy[i] = -1; //hitが加算されたらanswerの[i]番目に使わない数字を代入しておく } } *hitcount = hit; //一個ヒットしたらブローとは判定されない //ヒットした以外の数値もブロー判定する for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { if (i != j && inputNum[i] == answercopy[j]) { blow++; answercopy[j] = -1; } } } *blowcount = blow; } //ヒットとブローの数を出力 void outputresult(int turn, int i, char strinput[10][5], int hitkeep[10], int blowkeep[10]) { for (i = 1; i <= turn; i++) { printf("%d回目 入力値:%s,Hit:%d Blow:%d\n", i, strinput[i-1], hitkeep[i-1], blowkeep[i-1]); } } コード
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/20 08:15