teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

d

2019/03/03 11:21

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -103,7 +103,6 @@
103
103
  print('あなたの勝ち!')
104
104
  break
105
105
  else:
106
- print('\n'.join(stages[0:wrong + 1]))
107
106
  print('あなたの負け!正解は {} です。'.format(word))
108
107
 
109
108
 

2

d

2019/03/03 11:21

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -52,4 +52,60 @@
52
52
 
53
53
 
54
54
  hangman('cat')
55
+ ```
56
+
57
+ ## 改善案
58
+
59
+ コードで冗長な点を修正した改善案も貼っておきます。
60
+
61
+ ### 1 while, for が break で途中で抜けたかどうかを確認するには、
62
+ while .. else, for .. else が使える。
63
+
64
+ [while文の終了時の処理(while...else) - 繰り返し - Python入門](https://www.javadrive.jp/python/for/index2.html)
65
+
66
+ これで win フラグを排除できる。
67
+
68
+ ### 2 str はリストと同じように扱える
69
+
70
+ str の文字列はリストと同じように扱えるので letters = list(word) としなくてもよい。
71
+
72
+ ## 3. char が文字列に存在するかどうか
73
+
74
+ str.find(char) で存在すれば最初に見つかったインデックス、そうでない場合 -1 がかえるので、これで判定できる。
75
+
76
+ ```python
77
+ def hangman(word):
78
+ stages = ['___________________',
79
+ '| | ',
80
+ '| | ',
81
+ '| 0 ',
82
+ '| /|\ ',
83
+ '| / \ ',
84
+ '| ']
85
+ wrong = 0 # 間違えた回数
86
+ board = ['_'] * len(word) # 入力された文字を記録する配列
87
+
88
+ print('ハングマンへようこそ!')
89
+ while wrong < len(stages):
90
+ print('========================================')
91
+ char = input('一文字を予想してね: ')
92
+
93
+ char_pos = word.find(char)
94
+ if char_pos >= 0:
95
+ board[char_pos] = char
96
+ else:
97
+ wrong += 1
98
+ print('\n'.join(stages[:wrong])) # 間違えた回数行だけ表示する。
99
+
100
+ print(' '.join(board)) # 正解できている文字を表示する。
101
+
102
+ if '_' not in board:
103
+ print('あなたの勝ち!')
104
+ break
105
+ else:
106
+ print('\n'.join(stages[0:wrong + 1]))
107
+ print('あなたの負け!正解は {} です。'.format(word))
108
+
109
+
110
+ hangman('cat')
55
111
  ```

1

d

2019/03/03 11:19

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -5,4 +5,51 @@
5
5
  ```diff
6
6
  - print("あなたの負け!正解は ().".format(word))
7
7
  + print("あなたの負け!正解は {}.".format(word))
8
+ ```
9
+
10
+ 他にも `rletters = "$"` と代入している点や当てた場合に `print(" ".join(board))` と表示していない点がおかしいように思えます。
11
+
12
+ それを直したら動くようになりました。
13
+
14
+ ```python
15
+ def hangman(word):
16
+ wrong = 0
17
+ stages = ['',
18
+ '___________________',
19
+ '| | ',
20
+ '| | ',
21
+ '| 0 ',
22
+ '| /|\ ',
23
+ '| / \ ',
24
+ '| ']
25
+ letters = list(word) # 正解の文字
26
+ board = ['_'] * len(word) # 入力された文字を記録する配列
27
+ win = False # 勝ったかどうか
28
+
29
+ print('ハングマンへようこそ!')
30
+ while wrong < len(stages) - 1:
31
+ print('\n')
32
+ msg = '一文字を予想してね'
33
+ char = input(msg)
34
+
35
+ if char in letters:
36
+ cind = letters.index(char)
37
+ board[cind] = char
38
+ print(' '.join(board))
39
+ else:
40
+ wrong = wrong + 1
41
+ print(' '.join(board))
42
+ e = wrong + 1
43
+ print('\n'.join(stages[0:e]))
44
+ if '_' not in board:
45
+ print('あなたの勝ち!')
46
+ print(' '.join(board))
47
+ win = True
48
+ break
49
+ if not win:
50
+ print('\n'.join(stages[0:wrong + 1]))
51
+ print('あなたの負け!正解は {} です。'.format(word))
52
+
53
+
54
+ hangman('cat')
8
55
  ```