回答編集履歴

1

Add second expression

2020/07/02 11:02

投稿

y_shinoda
y_shinoda

スコア3272

test CHANGED
@@ -1,3 +1,7 @@
1
+ ## 元の回答
2
+
3
+
4
+
1
5
  次の箇所を書き換えます:
2
6
 
3
7
 
@@ -87,3 +91,333 @@
87
91
  while ブロックの後の、続きの処理を実行するようにするのがポイントです
88
92
 
89
93
  (元からある `while` ブロックのループまでは抜けないことに注意します)
94
+
95
+
96
+
97
+ ## 追記
98
+
99
+
100
+
101
+ > このまま実行すると
102
+
103
+ > 最後の結果発表が出ずに
104
+
105
+ > 「何回勝負する?」の場所に戻ってきてしまいます。
106
+
107
+ > 解決策はありますか?
108
+
109
+
110
+
111
+ 次に、解決策を含めた全体のコードを示します:
112
+
113
+
114
+
115
+ ```python
116
+
117
+ import random
118
+
119
+ import time
120
+
121
+
122
+
123
+ win = 0
124
+
125
+ lose = 0
126
+
127
+ draw = 0
128
+
129
+
130
+
131
+ print('==じゃんけんしましょう!==')
132
+
133
+
134
+
135
+ while True:
136
+
137
+ count = int(input('何回勝負する?\
138
+
139
+ \n1:1回\n2:3回\n3:5回\n4:それ以上'))
140
+
141
+
142
+
143
+ if count == 4:
144
+
145
+ num = int(input('何回勝負する?'))
146
+
147
+ else:
148
+
149
+ num = 0
150
+
151
+
152
+
153
+ count_dic = {1:1, 2:3, 3:5, 4:num}
154
+
155
+ try:
156
+
157
+ play_count = count_dic[count]
158
+
159
+ break
160
+
161
+ except (KeyError, ValueError):
162
+
163
+ print('正しい数字を入力してね。')
164
+
165
+
166
+
167
+ hand_dic = {1:'グー', 2:'チョキ', 3:'パー'}
168
+
169
+
170
+
171
+ for i in range(play_count):
172
+
173
+ while True:
174
+
175
+ print(f'あなたの手はなに?({i+1}回目)\
176
+
177
+ \n1:グー\n2:チョキ\n3:パー')
178
+
179
+
180
+
181
+ my_num = int(input('1から3の数字を入力してね。'))
182
+
183
+ try:
184
+
185
+ my_hand = hand_dic[my_num]
186
+
187
+ break
188
+
189
+ except (KeyError, ValueError):
190
+
191
+ print('正しい数字を入力してね。')
192
+
193
+
194
+
195
+ com_num = random.randint(1,3)
196
+
197
+ com_hand = hand_dic[com_num]
198
+
199
+
200
+
201
+ if my_hand == com_hand:
202
+
203
+ print('あいこ!')
204
+
205
+ draw += 1
206
+
207
+ print(f'現在戦績 {win}勝{lose}敗{draw}引き分け')
208
+
209
+ time.sleep(0.5)
210
+
211
+
212
+
213
+ elif my_hand == 'グー':
214
+
215
+ if com_hand == 'パー':
216
+
217
+ print(f'君が{my_hand},相手が{com_hand}で君の負け')
218
+
219
+ lose += 1
220
+
221
+ elif com_hand == 'チョキ':
222
+
223
+ print(f'君が{my_hand},相手が{com_hand}で君の勝ち')
224
+
225
+ win += 1
226
+
227
+ print(f'現在戦績 {win}勝{lose}敗{draw}引き分け')
228
+
229
+ time.sleep(0.5)
230
+
231
+
232
+
233
+ elif my_hand == 'チョキ':
234
+
235
+ if com_hand == 'グー':
236
+
237
+ print(f'君が{my_hand},相手が{com_hand}で君の負け')
238
+
239
+ lose += 1
240
+
241
+ elif com_hand == 'パー':
242
+
243
+ print(f'君が{my_hand},相手が{com_hand}で君の勝ち')
244
+
245
+ win += 1
246
+
247
+ print(f'現在戦績 {win}勝{lose}敗{draw}引き分け')
248
+
249
+ time.sleep(0.5)
250
+
251
+
252
+
253
+ elif my_hand == 'パー':
254
+
255
+ if com_hand == 'チョキ':
256
+
257
+ print(f'君が{my_hand},相手が{com_hand}で君の負け')
258
+
259
+ lose += 1
260
+
261
+ elif com_hand == 'グー':
262
+
263
+ print(f'君が{my_hand},相手が{com_hand}で君の勝ち')
264
+
265
+ win += 1
266
+
267
+ print(f'現在戦績 {win}勝{lose}敗{draw}引き分け')
268
+
269
+ time.sleep(0.5)
270
+
271
+
272
+
273
+ print('結果発表!!!')
274
+
275
+ time.sleep(2)
276
+
277
+ print(f'現在戦績 {win}勝{lose}敗{draw}引き分け')
278
+
279
+ print(f'勝率 {(win/play_count)*100}%')
280
+
281
+ ```
282
+
283
+
284
+
285
+ 実行結果:
286
+
287
+
288
+
289
+ ```console
290
+
291
+ $ python test.py
292
+
293
+ ==じゃんけんしましょう!==
294
+
295
+ 何回勝負する?
296
+
297
+ 1:1回
298
+
299
+ 2:3回
300
+
301
+ 3:5回
302
+
303
+ 4:それ以上1
304
+
305
+ あなたの手はなに?(1回目)
306
+
307
+ 1:グー
308
+
309
+ 2:チョキ
310
+
311
+ 3:パー
312
+
313
+ 1から3の数字を入力してね。1
314
+
315
+ 君がグー,相手がチョキで君の勝ち
316
+
317
+ 現在戦績 1勝0敗0引き分け
318
+
319
+ 結果発表!!!
320
+
321
+ 現在戦績 1勝0敗0引き分け
322
+
323
+ 勝率 100.0%
324
+
325
+
326
+
327
+ $
328
+
329
+ ```
330
+
331
+
332
+
333
+ ### 解決のポイント
334
+
335
+
336
+
337
+ > 最後の結果発表が出ずに
338
+
339
+ > 「何回勝負する?」の場所に戻ってきてしまいます。
340
+
341
+
342
+
343
+ この原因は、元からある `while` ブロックのループです
344
+
345
+ この `while` ブロックに `break` を追加してループから抜けることで
346
+
347
+ 問題が解決します
348
+
349
+
350
+
351
+ ### While ブロックをなるべく小さくしよう
352
+
353
+
354
+
355
+ `while` ブロックが大きくなってくると
356
+
357
+ `while` ブロック自体を作ったことを忘れてしまったりして
358
+
359
+ プログラムが意図せず繰り返されてしまうときに
360
+
361
+ 自分でも原因がわかりにくくなったりします
362
+
363
+
364
+
365
+ このとき、`while` が必要な理由を考え、
366
+
367
+ `while` ブロックの大きさを最小限にしておくと
368
+
369
+ 繰り返し処理のコードの見通しがよくなり、
370
+
371
+ どこに `bleak` を追加すればよいかが見つけやすくなります
372
+
373
+
374
+
375
+ 元からある `while` は、
376
+
377
+ おそらく「何回勝負する?」の問いに
378
+
379
+ 正しい数字が入力されるまで繰り返したかったので
380
+
381
+ 配置されたものと思われます
382
+
383
+
384
+
385
+ `while` のブロックを、正しい数字が入力されるまでの範囲だけに狭め、
386
+
387
+ 正しい数字が入力された場合に `break` 行に到達するように処理を変更します:
388
+
389
+
390
+
391
+ ```python
392
+
393
+ while True:
394
+
395
+ count = int(input('何回勝負する?\
396
+
397
+ \n1:1回\n2:3回\n3:5回\n4:それ以上'))
398
+
399
+
400
+
401
+ if count == 4:
402
+
403
+ num = int(input('何回勝負する?'))
404
+
405
+ else:
406
+
407
+ num = 0
408
+
409
+
410
+
411
+ count_dic = {1:1, 2:3, 3:5, 4:num}
412
+
413
+ try:
414
+
415
+ play_count = count_dic[count]
416
+
417
+ break
418
+
419
+ except (KeyError, ValueError):
420
+
421
+ print('正しい数字を入力してね。')
422
+
423
+ ```