質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

ArrayList

Java用のタグです。arrayListはListインターフェースを実装した、リサイズ可能な配列用クラスです。

Q&A

解決済

2回答

1673閲覧

ArrayListの重複要素の取り出しについて

sirokuma123

総合スコア5

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

ArrayList

Java用のタグです。arrayListはListインターフェースを実装した、リサイズ可能な配列用クラスです。

0グッド

0クリップ

投稿2020/03/08 03:31

前提・実現したいこと

Java初心者です
お金というトランプの遊びをjavaで現在書いています

①重複した要素のあるdeckリストをシャッフルしたのちにplayerがdeckリストの一番上からdeck.get(0);をして要素を取り出したとき、例えばその要素が100ならplayerリストに追加してまた別の100の要素をopponentから1枚受け取ってopponentの100の要素を1枚削除という条件分岐の書き方。500、1000、2000の場合を含む

②例えば1000の要素をplayerが山札から引いたとき、opponentの手札リストに[100,100,100,100,100]しかない場合などがあると思います。その時にopponentの全要素をplayerにaddしてopponentの全要素を削除する条件分岐の書き方

③例えばplayerがdeckから2000の要素を引いたとき、opponentのリストの要素は[1000,1000,500,500,500,500]だったとする。この時、2000の要素はないので①の条件分岐は使えない。必要最小限の組み合わせを用いて(ここでは1000を2枚)playerへaddしてopponentから要素を削除する条件分岐の書き方

①はなんとか発生している問題にあるようなソースコードを書きましたが、エラーが出ました。IndexOutOfBoundsExceptionindexで(100)の99番目にはないよ!というエラーだと思いますがここをどうにかして重複して存在する100の要素のどれか・・・というソースコードを書きたいです。②と③は1週間くらい考えましたが全く思いつきません。どなたか教えてください
ここに質問の内容を詳しく書いてください。
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

// 引いた手札と同額のカードを相手から貰うメソッド

public void takeOpponentCard(int num) { if(num == 100) { player.add(opponent.get(100)); opponent.remove(100); } else if(num == 500) { player.add(opponent.get(500)); opponent.remove(500); } else if(num == 1000) { player.add(opponent.get(1000)); opponent.remove(1000); } else if(num == 2000) { player.add(opponent.get(2000)); opponent.remove(2000); } }

// 引いた手札と同額のカードを相手がプレイヤーから貰うメソッド
public void takePlayerCard(int num) {
if(num == 100) {
opponent.add(player.get(100));
player.remove(100);
} else if(num == 500) {
opponent.add(player.get(500));
player.remove(500);
} else if(num == 1000) {
opponent.add(player.get(1000));
player.remove(1000);
} else if(num == 2000) {
opponent.add(player.get(2000));
player.remove(2000);
}

エラーメッセージ

該当のソースコード

Java
ソースコード
public class Deck {
// 山札の配列メソッド
public void createList() {
deck = new ArrayList<>();
int oneHundredCount = 32;
int fiveHundredCount = 16;
int thousandCount = 4;
int twoThousandCount = 2;

for(i = 1; i <= oneHundredCount; i++) { deck.add(100); } for(i = 1; i <= fiveHundredCount; i++) { deck.add(500); } for(i = 1; i <= thousandCount; i++) { deck.add(1000); } for(i = 1; i <= twoThousandCount; i++) { deck.add(2000); } Collections.shuffle(deck); /* プレイヤー・相手の手札リストと5枚引く行為のメソッド*/

public void playerOpponentDeck(){
player = new ArrayList<>();

player.add(deck.get(0)); player.add(deck.get(1)); player.add(deck.get(2)); player.add(deck.get(3)); player.add(deck.get(4)); opponent = new ArrayList<>(); opponent.add(deck.get(5)); opponent.add(deck.get(6)); opponent.add(deck.get(7)); opponent.add(deck.get(8)); opponent.add(deck.get(9));

// index番号1~10を削除する(subListメソッド)
deck.subList(0, 10).clear();
}
// カードを交互に引いていくためのメソッド
public void playerDraw() {

if(drawCount % 2 == 0) { player.add(deck.get(i)); drawCount++; } else { opponent.add(deck.get(i)); drawCount++; } }

// 引いた手札と同額の手札がなかった場合の釣銭メソッド
public void ChargeCard(List<Integer> list) {
charge = new ArrayList<>();
for(i = 1; i <=50; i++) {
charge.add(100);
}
for(i = 1; i <=50; i++) {
charge.add(500);
}
for(i = 1; i <=50; i++) {
charge.add(1000);
}
for(i = 1; i <= 50; i++) {
charge.add(2000);
}

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

「お金というトランプの遊び」を知らなかったので調べると, プレイヤーの技量は全く関係無いのですね.
そしてどうも, カードは一度引いたら後は合計金額しか意味が無さそうです.
ということで, 直接回答にはならないのですが, 構造を変えることで解決(?)もありえるかと.

MoneyGame.java

java

1import java.util.*; 2 3class Card { 4 private int money; 5 Card(int money) { this.money = money; } 6 int getMoney() { return money; } 7 public String toString() { return ""+money; } 8} 9 10class Deck { 11 final static private int[][] values = { 12 {1*4,1000}, {8*4,100}, {4*4,500}, {1,2000} //A,2-9,10-K,Joker 13 }; 14 private List<Card> cardList = new ArrayList<>(); 15 Deck() { 16 for(int i=0;i<values.length; i++) { 17 for(int j=0; j<values[i][0]; j++) cardList.add(new Card(values[i][1])); 18 } 19 Collections.shuffle(cardList); 20 } 21 Card get() { return cardList.remove(0); } 22 boolean isEmpty() { return cardList.isEmpty(); } 23} 24 25class Player { 26 private String name; 27 private int hand; 28 Player(String name) { this.name = name; } 29 void add(Card card) { hand += card.getMoney(); } 30 void add(int money) { hand += money; } 31 int sub(Card card) { 32 int payment = Math.min(card.getMoney(), hand); 33 hand -= card.getMoney(); 34 return payment; 35 } 36 boolean isBankrupt() { return hand < 0; } 37 int getHand() { return hand; } 38 String getName() { return name; } 39 public String toString() { return name+"="+(isBankrupt()?"Bankrupt":""+getHand()); } 40} 41 42public class MoneyGame { 43 private static final int PLAYERS = 3; 44 public static void main(String args[]) { 45 Deck deck = new Deck(); 46 List<Player> playerList = new ArrayList<>(PLAYERS); 47 for(int i=0; i<PLAYERS; i++) { 48 Player newPlayer = new Player("Player"+(i+1)); 49 for(int j=0; j<5; j++) newPlayer.add(deck.get()); 50 playerList.add(newPlayer); 51 } 52 for(Player player : playerList) System.out.println(player); 53 System.out.println("----"); 54 55 for(int i=0, left=PLAYERS; !deck.isEmpty() && left>1; i=(i+1)%PLAYERS) { 56 Player player = playerList.get(i); 57 if(player.isBankrupt()) continue; 58 Card draw = deck.get(); 59 System.out.println(player.getName()+" draw: "+draw); 60 player.add(draw); 61 for(Player opponent : playerList) { 62 if(player != opponent && !opponent.isBankrupt()) { 63 player.add(opponent.sub(draw)); 64 if(opponent.isBankrupt()) left--; 65 } 66 } 67 System.out.println(" > Status "+playerList); 68 } 69 70 System.out.println("----"); 71 for(Player player : playerList) System.out.println(player); 72 Collections.sort(playerList, (o1,o2)->{ return o2.getHand()-o1.getHand(); }); 73 Player top = playerList.get(0); 74 StringBuilder sb = new StringBuilder(top.getName()); 75 for(int i=1; i<playerList.size(); i++) { 76 if(playerList.get(i).getHand() < top.getHand()) break; 77 sb.append(" and "+playerList.get(i).getName()); 78 } 79 System.out.println("** Winner, "+sb+" !! **"); 80 } 81}

plain

1Player1=500 2Player2=1700 3Player3=2600 4---- 5Player1 draw: 500 6 > Status [Player1=2000, Player2=1200, Player3=2100] 7Player2 draw: 100 8 > Status [Player1=1900, Player2=1500, Player3=2000] 9Player3 draw: 100 10 > Status [Player1=1800, Player2=1400, Player3=2300] 11Player1 draw: 100 12 > Status [Player1=2100, Player2=1300, Player3=2200] 13Player2 draw: 100 14 > Status [Player1=2000, Player2=1600, Player3=2100] 15Player3 draw: 500 16 > Status [Player1=1500, Player2=1100, Player3=3600] 17Player1 draw: 100 18 > Status [Player1=1800, Player2=1000, Player3=3500] 19Player2 draw: 100 20 > Status [Player1=1700, Player2=1300, Player3=3400] 21Player3 draw: 100 22 > Status [Player1=1600, Player2=1200, Player3=3700] 23Player1 draw: 500 24 > Status [Player1=3100, Player2=700, Player3=3200] 25Player2 draw: 100 26 > Status [Player1=3000, Player2=1000, Player3=3100] 27Player3 draw: 500 28 > Status [Player1=2500, Player2=500, Player3=4600] 29Player1 draw: 100 30 > Status [Player1=2800, Player2=400, Player3=4500] 31Player2 draw: 100 32 > Status [Player1=2700, Player2=700, Player3=4400] 33Player3 draw: 100 34 > Status [Player1=2600, Player2=600, Player3=4700] 35Player1 draw: 1000 36 > Status [Player1=5200, Player2=Bankrupt, Player3=3700] 37Player3 draw: 100 38 > Status [Player1=5100, Player2=Bankrupt, Player3=3900] 39Player1 draw: 100 40 > Status [Player1=5300, Player2=Bankrupt, Player3=3800] 41Player3 draw: 100 42 > Status [Player1=5200, Player2=Bankrupt, Player3=4000] 43Player1 draw: 100 44 > Status [Player1=5400, Player2=Bankrupt, Player3=3900] 45Player3 draw: 1000 46 > Status [Player1=4400, Player2=Bankrupt, Player3=5900] 47Player1 draw: 500 48 > Status [Player1=5400, Player2=Bankrupt, Player3=5400] 49Player3 draw: 1000 50 > Status [Player1=4400, Player2=Bankrupt, Player3=7400] 51Player1 draw: 2000 52 > Status [Player1=8400, Player2=Bankrupt, Player3=5400] 53Player3 draw: 100 54 > Status [Player1=8300, Player2=Bankrupt, Player3=5600] 55Player1 draw: 500 56 > Status [Player1=9300, Player2=Bankrupt, Player3=5100] 57Player3 draw: 100 58 > Status [Player1=9200, Player2=Bankrupt, Player3=5300] 59Player1 draw: 100 60 > Status [Player1=9400, Player2=Bankrupt, Player3=5200] 61Player3 draw: 100 62 > Status [Player1=9300, Player2=Bankrupt, Player3=5400] 63Player1 draw: 500 64 > Status [Player1=10300, Player2=Bankrupt, Player3=4900] 65Player3 draw: 100 66 > Status [Player1=10200, Player2=Bankrupt, Player3=5100] 67Player1 draw: 500 68 > Status [Player1=11200, Player2=Bankrupt, Player3=4600] 69Player3 draw: 500 70 > Status [Player1=10700, Player2=Bankrupt, Player3=5600] 71Player1 draw: 100 72 > Status [Player1=10900, Player2=Bankrupt, Player3=5500] 73Player3 draw: 100 74 > Status [Player1=10800, Player2=Bankrupt, Player3=5700] 75Player1 draw: 500 76 > Status [Player1=11800, Player2=Bankrupt, Player3=5200] 77Player3 draw: 100 78 > Status [Player1=11700, Player2=Bankrupt, Player3=5400] 79Player1 draw: 100 80 > Status [Player1=11900, Player2=Bankrupt, Player3=5300] 81---- 82Player1=11900 83Player2=Bankrupt 84Player3=5300 85** Winner, Player1 !! **

投稿2020/03/08 12:03

編集2020/03/09 09:44
jimbe

総合スコア12670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sirokuma123

2020/03/09 05:44

私のコードと比較して見やすくスッキリしており学ぶ点が多々あって、本当に参考になりました。ソースコードを組んでいただき本当にありがとうございました。
guest

0

こういうこと?
どれを取っても100は100なので、getする意味は全くない。
removeもintのままだと、インデックスを探して削除しようとするため、同じエラーになる。
回避するためにはInteger.valueOfを使ってIntegerに変換する必要がある。

java

1public void takeOpponentCard(int num) { 2 if(num == 100) { 3 player.add(100); 4 opponent.remove(Integer.valueOf(100)); 5 } else if(num == 500) { 6 player.add(500); 7 opponent.remove(Integer.valueOf(500)); 8 } else if(num == 1000) { 9 player.add(1000); 10 opponent.remove(Integer.valueOf(1000)); 11 } else if(num == 2000) { 12 player.add(2000); 13 opponent.remove(Integer.valueOf(2000)); 14 } 15}

あとこれなら、こんなにifを書かなくてもこれでいいのでは?

java

1public void takeOpponentCard(int num) { 2 switch(num) { 3 case 100: 4 case 500: 5 case 1000: 6 case 2000: 7 player.add(num); 8 opponent.remove(Integer.valueOf(num)); 9 } 10}

あとこれならplayerとかopponentとかをPlayerクラスみたいなののインスタンスとして扱いたい。

投稿2020/03/08 04:01

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sirokuma123

2020/03/09 05:46

switch文の書き方は盲点でした。これからの学習の参考にします。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問