質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

1回答

1120閲覧

数字当てゲームのランキングを別ファイルから読み込み、ランキング5位以下は書き込まない

hm1216

総合スコア6

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2019/12/20 05:59

編集2019/12/20 08:19

表題の通り、数字当てゲームを作りました。
数字当てゲームは正しく動きます。作った数字当てゲームはそのまま表記しておきます。

【やりたいこと】
ゲームが始まった時点でファイルを開く→
ゲーム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]); } } コード

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

まず,ファイル読書の処理に関して,使う関数等についてきちんと調べて適切に書いてください.
雰囲気とかで書いても意味はないので.


やること自体は,

  1. ファイルを開く→ファイルの内容(5つのデータ?)を読み出す→ファイルを閉じる
  2. ファイルから読みだしたデータに今回のデータを加えた集合(計6個のデータになるのかな)をソート
  3. ファイルを開く→上位5つのデータをファイルに書き出す→ファイルを閉じる

という3ステップに分けて考えると良いでしょう.
(追記モードとかでファイルを開く必要はないと考えます)

投稿2019/12/20 06:35

fana

総合スコア11658

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hm1216

2019/12/20 08:15

失礼しました。完全に雰囲気で書いていましたね。 ゲームが始まった時点でファイルを開く→ゲーム1ラウンドが終わったらプログラム内でtotalを持っておく→ゲームは連続して行うことができる、2ラウンド目を開始orゲーム終了→ゲームが続いたのであれば1ラウンド目と2ラウンド目をファイル内の順位と比較、大きい数値を先頭に置き2位以下の順位はずらしていく(このように比較していけばソートは必要ない?)→ゲームが終わったら順位をファイルに書き込み→ファイルを閉じる このようなイメージです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問