回答編集履歴

1

問題点を具体的に指摘

2018/09/20 04:27

投稿

dice142
dice142

スコア5158

test CHANGED
@@ -31,3 +31,159 @@
31
31
  つまり、前回の勝者(lastWinner)を更新している箇所が間違っています。
32
32
 
33
33
  前回の勝者の更新は、その値を使い終わった後にするべきです。
34
+
35
+
36
+
37
+ ---
38
+
39
+
40
+
41
+ 【追記】
42
+
43
+ 必要部分を抜粋したコードを追いながら説明します。
44
+
45
+ (提示されたコードの空行を消すなど若干手を加えましたが、処理自体は変えてません)
46
+
47
+
48
+
49
+ ```java
50
+
51
+ /* 前提条件として「前回はCPUが勝った」として追います。 */
52
+
53
+
54
+
55
+ // 勝ち負け判定
56
+
57
+ result = janken.judge(); /* 今回はプレイヤーが勝ったとします。 */
58
+
59
+
60
+
61
+ if(result == S結果.あいこ) {
62
+
63
+ System.out.println("あいこでしょ!");
64
+
65
+ } else if (result == S結果.勝ち) { /* ここの分岐に来ます */
66
+
67
+ System.out.println("playerの勝ち");
68
+
69
+ playerPt ++; /* プレイヤーに1点加算されます。 */
70
+
71
+ } else if (result == S結果.負け) {
72
+
73
+ System.out.println("cpuの勝ち");
74
+
75
+ cpuPt ++;
76
+
77
+ } else {
78
+
79
+ break;
80
+
81
+ }
82
+
83
+
84
+
85
+ /* この分岐に入ります。 */
86
+
87
+ if(result == S結果.勝ち) {
88
+
89
+ /* 前回の勝者をプレイヤーに更新します。 */
90
+
91
+ /* ※この時点で前回の勝者はCPUだったはずなのに、
92
+
93
+  プレイヤーに更新されてしまいます。 */
94
+
95
+ lastWinner = 1;
96
+
97
+ }
98
+
99
+
100
+
101
+ /* 直前の更新でlastWinnerが1になってしまい、今回はプレイヤーが勝ったので
102
+
103
+ この分岐に入ってしまいます。 */
104
+
105
+ if(lastWinner == 1 && result == S結果.勝ち) {
106
+
107
+ playerPt--;
108
+
109
+ lastWinner = 0;
110
+
111
+ }
112
+
113
+ ```
114
+
115
+
116
+
117
+ コード内にコメントで書きましたが改めて。
118
+
119
+ ** 前回はCPUが勝ち、今回はプレイヤーが勝ったとして話を進めます。 **
120
+
121
+
122
+
123
+ まず、プレイヤーが勝ったのでplayerPtが1増えます。
124
+
125
+ ```java
126
+
127
+ } else if (result == S結果.勝ち) {
128
+
129
+ System.out.println("playerの勝ち");
130
+
131
+ playerPt ++;
132
+
133
+ }
134
+
135
+ ```
136
+
137
+
138
+
139
+ 【問題点】次に、プレイヤーが勝ったのでlastWinnerを1(プレイヤー)にします。
140
+
141
+ ** 前回の勝者はCPUだったのに、ここで前回の勝者はプレイヤーと書き換えられます。 **
142
+
143
+ ```java
144
+
145
+ if(result == S結果.勝ち) {
146
+
147
+ lastWinner = 1;
148
+
149
+ }
150
+
151
+ ```
152
+
153
+
154
+
155
+ その結果、連勝と判断されて、本来は入らない連勝の分岐に入り、
156
+
157
+ playerPtが1減ります。
158
+
159
+ ```java
160
+
161
+ if(lastWinner == 1 && result == S結果.勝ち) {
162
+
163
+ playerPt--;
164
+
165
+ lastWinner = 0;
166
+
167
+ }
168
+
169
+ ```
170
+
171
+
172
+
173
+ このような流れで、連勝していないのに連勝と判断され、ポイントが+1→-1で0になります。
174
+
175
+
176
+
177
+ ---
178
+
179
+
180
+
181
+ プログラムは書いたとおりに実行されます。
182
+
183
+ お書きになったプログラムを実行して結果を見る他に、
184
+
185
+ 実際にコードを見ながら「今ここが実行され、次はここに来て…」と指で指して、
186
+
187
+ 混乱しないように変数の値を紙か何かにメモしながら値の更新を確認し、
188
+
189
+ プログラムの流れを追うことができるようにしていきましょう。