質問編集履歴

1

改善目的

2019/12/20 08:19

投稿

hm1216
hm1216

スコア6

test CHANGED
File without changes
test CHANGED
@@ -1,34 +1,22 @@
1
1
  表題の通り、数字当てゲームを作りました。
2
2
 
3
- 数字当てゲームは正しく動で今回はコードを省略します。
3
+ 数字当てゲームは正しく動きます。作った数字当てゲームはそまま表記ておきます。
4
+
5
+
4
6
 
5
7
  【やりたいこと】
6
8
 
9
+ ゲームが始まった時点でファイルを開く→
10
+
11
+ ゲーム1ラウンドが終わったらプログラム内でtotal(3ゲームで1セット、その1セットの得点)を持っておく→
12
+
7
- 1ラウンド(3ゲーム)のランキング順位を1ラウンドわったら画面に表示。
13
+ ゲームは連続して行うことができる、2ラウンド目を開始orゲーム終了→
8
-
9
- 1ラウンドの合計点はtotal.
14
+
10
-
11
- ファイルの中に入ってる別回の総合得点と今回の1ラウンドを比較
15
+ ゲームが続であれば1ラウンド目と2ラウンド目ファイル内の順位と比較、大きい数値を先頭に置き2位以下の順位はずらしていく→
12
-
13
- ランキングは5位まで保存。
16
+
14
-
15
- 5以下はファイルに保存せず、書き込みもしない。
17
+ ゲームが終わったら順ファイルに書き込み→ファイルを閉じる
16
-
17
- ランキング5位以下の場合、画面には「ランキング外」と表示。
18
+
18
-
19
-
20
-
21
- ちなみにソートのやり方もおぼろげです。
19
+
22
-
23
- URLのやりかたをそのまま写しただけです。[リンク内容](https://webkaru.net/clang/array-sort-descending-order/)
24
-
25
-
26
-
27
- 別ファイルを使うことは初めてで、それ以上にその中身をソートさせ、そのうえ5位以下をはじくなんて...難しすぎます。
28
-
29
-
30
-
31
- 一応書いてみましたがめちゃくちゃだと思います。
32
20
 
33
21
 
34
22
 
@@ -36,9 +24,7 @@
36
24
 
37
25
  よろしくお願い致します。
38
26
 
39
-
40
-
41
- ```ここに言語を入力```#include <stdio.h>
27
+ ```#include <stdio.h>
42
28
 
43
29
  #include <stdlib.h>
44
30
 
@@ -58,12 +44,6 @@
58
44
 
59
45
  void outputresult(int turn, int i, char str[10][5], int hitkeep[10], int blowkeep[10]);
60
46
 
61
- int game; //ゲーム一回分の関数、今回は表記省略
62
-
63
- int rank(total);
64
-
65
-
66
-
67
47
  int main()
68
48
 
69
49
  {
@@ -92,10 +72,6 @@
92
72
 
93
73
  int blowkeep[10];
94
74
 
95
- int score = 100;
96
-
97
- int total; //3ゲーム(1ラウンド)の合計得点
98
-
99
75
 
100
76
 
101
77
 
@@ -104,23 +80,21 @@
104
80
 
105
81
 
106
82
 
107
- int game;
108
-
109
83
  for (i = 0; i < 10; i++)
110
84
 
111
85
  {
112
86
 
113
87
  input(strinput[i], &turn);//入力したstrの[i]番目を渡したい(strはstrinputに入っている)
114
88
 
115
- hantei(&hitcount, &blowcount, strinput[i], answer); //ヒットかブローの判定
89
+ hantei(&hitcount, &blowcount, strinput[i], answer);
116
-
90
+
117
- hitkeep[i] = hitcount; //ヒット数をカウントする関数
91
+ hitkeep[i] = hitcount;
118
-
92
+
119
- blowkeep[i] = blowcount; //ブロー数をカウントする関数
93
+ blowkeep[i] = blowcount;
120
-
121
-
122
-
94
+
95
+
96
+
123
- if (hitcount == 4) //ヒットが4つあればゲーム終了
97
+ if (hitcount == 4)
124
98
 
125
99
  {
126
100
 
@@ -130,101 +104,79 @@
130
104
 
131
105
  }
132
106
 
133
- outputresult(turn, i, strinput, hitkeep, blowkeep); //ヒットが4つ以外であればターン数、今回入力した文字、ヒット数、ブロー数を表示
107
+ outputresult(turn, i, strinput, hitkeep, blowkeep);
134
-
108
+
109
+
110
+
135
- score - 10;
111
+ if (turn == 10)
136
-
137
-
138
-
139
- if (turn == 10) //ターンが10回でゲーム終了
112
+
140
-
141
- {
113
+ {
142
-
114
+
143
- printf("ターン残数0、ゲームオーバー。答えは%d%d%d%dです。\n", answer[0], answer[1], answer[2], answer[3]);
115
+ printf("ターン残数0、ゲームオーバー。答えは%d%d%d%dです。\n",answer[0],answer[1],answer[2],answer[3]);
144
-
145
-
146
-
147
-
148
-
116
+
117
+
118
+
119
+
120
+
149
- }
121
+ }
150
-
122
+
151
- }
123
+ }
152
-
153
-
154
-
155
- return total; //1ラウンドの合計を返す
156
-
157
-
158
-
159
- void rank;
160
124
 
161
125
 
162
126
 
163
127
  }
164
128
 
165
-
129
+ /*
130
+
166
-
131
+ file = fopen("rank.txt","a+");//ファイルを開く
132
+
133
+ fscanf(fscanf(file, %d, &read);//ファイルを読み込む
134
+
135
+
136
+
137
+
138
+
139
+
140
+
141
+
142
+
143
+ */
144
+
145
+
146
+
147
+ //4桁の乱数作成
148
+
167
- void rank(int total);
149
+ void MakeNumber(int answer[4])
168
-
169
-
170
-
171
- int read;
172
-
173
- int tmp;
174
150
 
175
151
  {
176
152
 
153
+ int i;
154
+
155
+ int count = 0;
156
+
157
+ int num;
158
+
159
+
160
+
177
- FILE* fp; //ファイルポインタ、fpはファイルの中身?
161
+ srand((unsigned)time(NULL));
178
-
179
-
180
-
181
- fp = fopen("text.dat","a+"); //ファイルの読み込みと追加書き込み
162
+
182
-
183
-
184
-
185
- fscanf(fp, % d, % d, % d, % d, % d, read); //ファイル内にある数字を5つ呼び出す
186
-
187
-
188
-
189
- for (i = 0; i < total; i++)
163
+ while (count < 4)
190
-
164
+
191
- {
165
+ {
166
+
192
-
167
+ num = rand() % 10;
168
+
193
- for (j = i + 1; j < total; i++)
169
+ for (i = 0; i < count; i++)
170
+
171
+ {
172
+
173
+ //重複がある場合
174
+
175
+ if (answer[i] == num)
194
176
 
195
177
  {
196
178
 
197
-
198
-
199
- if (fp[i] < fp[j]);//昇順ソート、これもいまいち理屈がわからない
200
-
201
- {
202
-
203
- tmp = fp[i];
204
-
205
- fp[i] = fp[j];
206
-
207
- fp[j] = tmp;
208
-
209
- printf("今回のランキングは%dです。\n" tmp);
210
-
211
- fprintf(fp, "% d, % d, % d, % d, % d", )
212
-
213
- }
214
-
215
-
216
-
217
- else(total < fp);//totalが5位以下の場合ファイルには書き込まない
218
-
219
- {
220
-
221
- printf("ランキング外です。\n");
222
-
223
-
224
-
225
- fclose(fp);
179
+ break;
226
-
227
- }
228
180
 
229
181
  }
230
182
 
@@ -232,19 +184,113 @@
232
184
 
233
185
 
234
186
 
235
-
187
+ //重複が無い場合
188
+
236
-
189
+ if (i >= count)
190
+
237
-
191
+ {
192
+
238
-
193
+ answer[count++] = num;
194
+
239
-
195
+ }
196
+
240
-
197
+ }
198
+
241
-
199
+ }
200
+
201
+
202
+
203
+ //キーボードから任意の数字を入力
204
+
205
+ //入力したものが数字じゃなかった場合と4桁じゃなかった場合ターンのカウントはせず、入力をやり直させる
206
+
207
+ void input(char* strinput, int* turn)
208
+
209
+ {
210
+
211
+ char str[10];
212
+
213
+ int len = 0; //文字の長さを格納
214
+
215
+ int i;
216
+
217
+
218
+
219
+ while (true)
220
+
221
+ {
222
+
223
+ gets_s(str,10);
224
+
225
+
226
+
227
+ len = strlen(str);
228
+
229
+
230
+
231
+ if (len != 4)
232
+
233
+ {
234
+
235
+ printf("4桁の数字を入力してください。\n");
236
+
237
+ continue;
238
+
239
+ }
240
+
241
+
242
+
243
+ for (i = 0; i < len; i++)
244
+
245
+ {
246
+
247
+
248
+
249
+ if (str[i] < '0' || str[i] > '9')//iが0または9より小さい場合ループを抜ける
250
+
251
+ {
252
+
253
+ break;
254
+
255
+ }
256
+
257
+ }
258
+
259
+
260
+
261
+ if (i != 4)
262
+
263
+ {
264
+
265
+ printf("数字を入力してください。\n");
266
+
267
+ continue;
268
+
269
+ }
270
+
271
+
272
+
273
+ break;
274
+
275
+ }
276
+
277
+
278
+
279
+ strinput[0] = str[0];
280
+
281
+ strinput[1] = str[1];
282
+
283
+ strinput[2] = str[2];
284
+
285
+ strinput[3] = str[3];
286
+
287
+ strinput[4] = str[4];
242
288
 
243
289
 
244
290
 
245
-
291
+ (*turn)++; //入力ができたらターン数を加算D
246
-
247
-
292
+
293
+
248
294
 
249
295
  }
250
296
 
@@ -252,6 +298,142 @@
252
298
 
253
299
 
254
300
 
301
+ //入力した数と答えの数を比較する
302
+
303
+ //Hit,Blowを保管するための関数の宣言、複数の戻り値を返す関数を引数を使って実現する
304
+
305
+
306
+
307
+ void hantei(int* hitcount, int* blowcount, char strinput[5], int answer[4])
308
+
309
+ {
310
+
311
+ int hit = 0;
312
+
313
+ int nothit = 0;
314
+
315
+ int blow = 0;
316
+
317
+ int i;
318
+
319
+ int j;
320
+
321
+ int inputNum[4];
322
+
323
+ int answercopy[4];
324
+
325
+
326
+
327
+ answercopy[0] = answer[0];
328
+
329
+ answercopy[1] = answer[1];
330
+
331
+ answercopy[2] = answer[2];
332
+
333
+ answercopy[3] = answer[3];
334
+
335
+
336
+
337
+
338
+
339
+ //char型から数値に変換
340
+
341
+ for (i = 0; i < 4; i++)
342
+
343
+ {
344
+
345
+ inputNum[i] = strinput[i] - '0';
346
+
347
+ }
348
+
349
+
350
+
351
+ //ヒット判定
352
+
353
+ for (i = 0; i < 4; i++)
354
+
355
+ {
356
+
357
+ if (inputNum[i] == answercopy[i])
358
+
359
+ {
360
+
361
+ hit++;
362
+
363
+ answercopy[i] = -1; //hitが加算されたらanswerの[i]番目に使わない数字を代入しておく
364
+
365
+ }
366
+
367
+
368
+
369
+ }
370
+
371
+
372
+
373
+ *hitcount = hit;
374
+
375
+
376
+
377
+ //一個ヒットしたらブローとは判定されない
378
+
379
+ //ヒットした以外の数値もブロー判定する
380
+
381
+
382
+
383
+ for (i = 0; i < 4; i++)
384
+
385
+ {
386
+
387
+ for (j = 0; j < 4; j++)
388
+
389
+ {
390
+
391
+ if (i != j && inputNum[i] == answercopy[j])
392
+
393
+ {
394
+
395
+ blow++;
396
+
397
+ answercopy[j] = -1;
398
+
399
+ }
400
+
401
+ }
402
+
403
+
404
+
405
+ }
406
+
407
+ *blowcount = blow;
408
+
409
+
410
+
411
+
412
+
413
+ }
414
+
415
+
416
+
417
+ //ヒットとブローの数を出力
418
+
419
+ void outputresult(int turn, int i, char strinput[10][5], int hitkeep[10], int blowkeep[10])
420
+
421
+ {
422
+
423
+ for (i = 1; i <= turn; i++)
424
+
425
+ {
426
+
427
+ printf("%d回目 入力値:%s,Hit:%d Blow:%d\n", i, strinput[i-1], hitkeep[i-1], blowkeep[i-1]);
428
+
429
+ }
430
+
431
+
432
+
433
+ }
434
+
435
+
436
+
255
437
 
256
438
 
257
439
 
@@ -263,7 +445,3 @@
263
445
  コード
264
446
 
265
447
  ```
266
-
267
- コード
268
-
269
- ```