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

回答編集履歴

3

条件論理積/論理和演算子

2015/11/15 07:55

投稿

swordone
swordone

スコア20675

answer CHANGED
@@ -14,4 +14,15 @@
14
14
  - process04:次のカードドロー
15
15
  - process05:判定と払い戻し
16
16
  mainメソッドで名前や掛け金を管理して、それを各メソッドに渡す、という構造にしたほうがいいです。
17
- また、入力した文字がhighかlowかを、大文字小文字を無視して判定したいのなら、`equalsIgnoreCase`という便利なメソッドがありますのでご検討ください。
17
+ また、入力した文字がhighかlowかを、大文字小文字を無視して判定したいのなら、`equalsIgnoreCase`という便利なメソッドがありますのでご検討ください。
18
+
19
+ ```java
20
+ if (card < newcard && "high".equals(select) || "High".equals(select))
21
+ ```
22
+ ここは大問題です。論理演算子&&や||は、左から順に計算されます。
23
+ 仮にcard < newcard か "high".equals(select)がfalseを返した場合、
24
+ `card < newcard && "high".equals(select)`全体としてfalseになります。
25
+ しかし、この後`false || "High".equals(select)`の評価になります。
26
+ ここで"High".equals(select)がtrueを返せば、このif文の中身はtrueとなります。
27
+ つまり、カードの如何にかかわらず、selectに"High"が入っていれば勝ちになるというコードになります。
28
+ 下のif文も同じです。つまり**"High"か"Low"と入力すれば必勝になってしまいます**。

2

equalsIgnoreCase

2015/11/15 07:55

投稿

swordone
swordone

スコア20675

answer CHANGED
@@ -13,4 +13,5 @@
13
13
  - process03:ハイかローかの選択
14
14
  - process04:次のカードドロー
15
15
  - process05:判定と払い戻し
16
- mainメソッドで名前や掛け金を管理して、それを各メソッドに渡す、という構造にしたほうがいいです。
16
+ mainメソッドで名前や掛け金を管理して、それを各メソッドに渡す、という構造にしたほうがいいです。
17
+ また、入力した文字がhighかlowかを、大文字小文字を無視して判定したいのなら、`equalsIgnoreCase`という便利なメソッドがありますのでご検討ください。

1

ハイ&ローゲームについて

2015/11/15 07:28

投稿

swordone
swordone

スコア20675

answer CHANGED
@@ -3,4 +3,14 @@
3
3
  このとき、bの処理が終わった後、aでbを呼んだ場所に戻るのです。
4
4
  戻った後、aの処理が続行されます。すなわち、elseを抜けた後のprocess04が呼び出されることになります。
5
5
  今、簡単のためにaとbの2段階で説明しましたが、いくつになってもこの原理は変わりません。
6
- つまり、elseの中で再帰した回数だけ、elseを抜けた後の処理が実行されるので、問題の現象が発生します。
6
+ つまり、elseの中で再帰した回数だけ、elseを抜けた後の処理が実行されるので、問題の現象が発生します。
7
+ ---
8
+
9
+ ハイ&ローのシステムですが、結局全部ひとつづきにしていて、メソッドに分割しているメリットが余りないように思います。メソッドに分割するなら、機能別に分けて、それぞれの機能をmainから呼び出す形のほうがわかりやすいかと思います。
10
+ つまり、
11
+ - process01:名前の入力
12
+ - process02:掛け金の入力
13
+ - process03:ハイかローかの選択
14
+ - process04:次のカードドロー
15
+ - process05:判定と払い戻し
16
+ mainメソッドで名前や掛け金を管理して、それを各メソッドに渡す、という構造にしたほうがいいです。