###前提・実現したいこと
クラスの2次元配列を使っていますが、それで勝敗判定を正確にすること。
ジャンケンの勝敗判定したいです。
ジャンケンの勝敗判定が正確にできません。
勝敗判定がおかしいです。
Teクラスを継承したStone,Scissors,Paperクラスを作りました。
###発生している問題・エラーメッセージ
どんな結果でも引き分け判定になる
###該当のソースコード
public class JudgeC{ List<PlayerC> winners; boolean winFlg; boolean loseFlg; public void startJanken(PlayerC player1, PlayerC player2, PlayerC player3) throws Exception{ System.out.println("【ジャンケン開始】"); for(int cnt = 0; cnt < 3; cnt++){ System.out.println("【" + (cnt + 1) + "回戦目】"); winners =judgeJanken(player1, player2, player3); if(!winners.isEmpty()){ Iterator<PlayerC> it = winners.iterator(); while(it.hasNext()){ PlayerC winner = it.next(); System.out.println(winner.getName() + "が勝ちました!"); winner.notifyResult(true); } } if(winners.isEmpty()){ System.out.println("引き分けです!"); } } System.out.println("【ジャンケン終了】"); judgeFinalWinner(player1, player2, player3); } private List<PlayerC> judgeJanken(PlayerC player1, PlayerC player2, PlayerC player3){ winners = new ArrayList<PlayerC>(); Te te1 = player1.showHand(); Te te2 = player2.showHand(); Te te3 = player3.showHand(); printHand(te1); System.out.print(" vs. "); printHand(te2); System.out.print(" vs. "); printHand(te3); System.out.print("\n"); Te[][] winPattern = { { new Stone(), new Scissors() }, { new Scissors(), new Paper() }, { new Paper(), new Stone() } }; Te[][] losePattern = { { new Stone(), new Paper() }, { new Scissors(), new Stone() }, { new Paper(), new Scissors() } }; Te[] hands = { te1, te2, te3 }; for(int i = 0; i < hands.length; i++){ winFlg = false; loseFlg = false; for(int j = 0; j < hands.length; j++){ Te[][] turn = {{ hands[i], hands[j] }}; for(int a = 0; a < winPattern.length; a++){ for(int b = 0; b < winPattern[a].length; b++){ Te poi = turn[0][0]; Te wpattern = winPattern[a][b]; if(poi.equals(wpattern)){ winFlg = true; } Te lpattern = losePattern[a][b]; if(poi.equals(lpattern)){ loseFlg = true; } } } } System.out.println("w" + winFlg);// テスト出力 System.out.println("l" + loseFlg);// テスト出力 if((winFlg == true) && (loseFlg == false)){ switch(i){ case 0: winners.add(player1); break; case 1: winners.add(player2); break; case 2: winners.add(player3); break; default: break; } } } return winners; } ''' ###試したこと equals() と hashCode() の オーバーライドをStone,Scissors,Paperでやりました。 ###補足情報(言語/FW/ツール等のバージョンなど) 上のコードを下記に変更しましたが、うまくいきません。 for(int a = 0; a < winPattern.length; a++){ Te poiA = turn[0][0];// hands[i] Te poiB = turn[0][1];// hands[j] Te wpatternA = winPattern[a][0]; Te wpatternB = winPattern[a][1]; Te lpatternA = losePattern[a][0]; Te lpatternB = losePattern[a][1]; if((poiA.equals(wpatternA)) && (poiB.equals(wpatternB))){ winFlg = true; } else if((poiA.equals(lpatternA)) && (poiB.equals(lpatternB))){ loseFlg = true; } } こういうことですかね。 それでもうまくいきませんが。 public class Stone extends Te{ final int STONE = 0; int hand = STONE; public boolean equals(Object o){ if(o == this){ return true; } if(o == null){ return false; } if(!(o instanceof Stone)){ return false; } Stone s = (Stone) o; if(!(s.hand == this.hand)){ return false; } return true; } public int hashCode(){ int res = 4; res = res * 40 + hand; return res; } }
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。