回答編集履歴

3

d

2019/03/03 11:21

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -208,8 +208,6 @@
208
208
 
209
209
  else:
210
210
 
211
- print('\n'.join(stages[0:wrong + 1]))
212
-
213
211
  print('あなたの負け!正解は {} です。'.format(word))
214
212
 
215
213
 

2

d

2019/03/03 11:21

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -107,3 +107,115 @@
107
107
  hangman('cat')
108
108
 
109
109
  ```
110
+
111
+
112
+
113
+ ## 改善案
114
+
115
+
116
+
117
+ コードで冗長な点を修正した改善案も貼っておきます。
118
+
119
+
120
+
121
+ ### 1 while, for が break で途中で抜けたかどうかを確認するには、
122
+
123
+ while .. else, for .. else が使える。
124
+
125
+
126
+
127
+ [while文の終了時の処理(while...else) - 繰り返し - Python入門](https://www.javadrive.jp/python/for/index2.html)
128
+
129
+
130
+
131
+ これで win フラグを排除できる。
132
+
133
+
134
+
135
+ ### 2 str はリストと同じように扱える
136
+
137
+
138
+
139
+ str の文字列はリストと同じように扱えるので letters = list(word) としなくてもよい。
140
+
141
+
142
+
143
+ ## 3. char が文字列に存在するかどうか
144
+
145
+
146
+
147
+ str.find(char) で存在すれば最初に見つかったインデックス、そうでない場合 -1 がかえるので、これで判定できる。
148
+
149
+
150
+
151
+ ```python
152
+
153
+ def hangman(word):
154
+
155
+ stages = ['___________________',
156
+
157
+ '| | ',
158
+
159
+ '| | ',
160
+
161
+ '| 0 ',
162
+
163
+ '| /|\ ',
164
+
165
+ '| / \ ',
166
+
167
+ '| ']
168
+
169
+ wrong = 0 # 間違えた回数
170
+
171
+ board = ['_'] * len(word) # 入力された文字を記録する配列
172
+
173
+
174
+
175
+ print('ハングマンへようこそ!')
176
+
177
+ while wrong < len(stages):
178
+
179
+ print('========================================')
180
+
181
+ char = input('一文字を予想してね: ')
182
+
183
+
184
+
185
+ char_pos = word.find(char)
186
+
187
+ if char_pos >= 0:
188
+
189
+ board[char_pos] = char
190
+
191
+ else:
192
+
193
+ wrong += 1
194
+
195
+ print('\n'.join(stages[:wrong])) # 間違えた回数行だけ表示する。
196
+
197
+
198
+
199
+ print(' '.join(board)) # 正解できている文字を表示する。
200
+
201
+
202
+
203
+ if '_' not in board:
204
+
205
+ print('あなたの勝ち!')
206
+
207
+ break
208
+
209
+ else:
210
+
211
+ print('\n'.join(stages[0:wrong + 1]))
212
+
213
+ print('あなたの負け!正解は {} です。'.format(word))
214
+
215
+
216
+
217
+
218
+
219
+ hangman('cat')
220
+
221
+ ```

1

d

2019/03/03 11:19

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -13,3 +13,97 @@
13
13
  + print("あなたの負け!正解は {}.".format(word))
14
14
 
15
15
  ```
16
+
17
+
18
+
19
+ 他にも `rletters = "$"` と代入している点や当てた場合に `print(" ".join(board))` と表示していない点がおかしいように思えます。
20
+
21
+
22
+
23
+ それを直したら動くようになりました。
24
+
25
+
26
+
27
+ ```python
28
+
29
+ def hangman(word):
30
+
31
+ wrong = 0
32
+
33
+ stages = ['',
34
+
35
+ '___________________',
36
+
37
+ '| | ',
38
+
39
+ '| | ',
40
+
41
+ '| 0 ',
42
+
43
+ '| /|\ ',
44
+
45
+ '| / \ ',
46
+
47
+ '| ']
48
+
49
+ letters = list(word) # 正解の文字
50
+
51
+ board = ['_'] * len(word) # 入力された文字を記録する配列
52
+
53
+ win = False # 勝ったかどうか
54
+
55
+
56
+
57
+ print('ハングマンへようこそ!')
58
+
59
+ while wrong < len(stages) - 1:
60
+
61
+ print('\n')
62
+
63
+ msg = '一文字を予想してね'
64
+
65
+ char = input(msg)
66
+
67
+
68
+
69
+ if char in letters:
70
+
71
+ cind = letters.index(char)
72
+
73
+ board[cind] = char
74
+
75
+ print(' '.join(board))
76
+
77
+ else:
78
+
79
+ wrong = wrong + 1
80
+
81
+ print(' '.join(board))
82
+
83
+ e = wrong + 1
84
+
85
+ print('\n'.join(stages[0:e]))
86
+
87
+ if '_' not in board:
88
+
89
+ print('あなたの勝ち!')
90
+
91
+ print(' '.join(board))
92
+
93
+ win = True
94
+
95
+ break
96
+
97
+ if not win:
98
+
99
+ print('\n'.join(stages[0:wrong + 1]))
100
+
101
+ print('あなたの負け!正解は {} です。'.format(word))
102
+
103
+
104
+
105
+
106
+
107
+ hangman('cat')
108
+
109
+ ```