diff --git a/src/main/java/controls/StepScheduler.java b/src/main/java/controls/StepScheduler.java index 578369b..5f51ac0 100644 --- a/src/main/java/controls/StepScheduler.java +++ b/src/main/java/controls/StepScheduler.java @@ -37,6 +37,7 @@ } } turnCount++; + } @Override @@ -68,7 +69,7 @@ return isATurn; } - public boolean getIsATurn(){ + public boolean isATurn(){ return isATurn; } } diff --git a/src/main/java/interfaces/IAttack.java b/src/main/java/interfaces/IAttack.java index 059cedc..e708973 100644 --- a/src/main/java/interfaces/IAttack.java +++ b/src/main/java/interfaces/IAttack.java @@ -17,4 +17,5 @@ boolean isDeckLess(); boolean isSucceedLatestAttack(); boolean shiftTurn(); + boolean isATurn(); } diff --git a/src/main/java/views/MainPanel.java b/src/main/java/views/MainPanel.java index d16788a..082cc2c 100644 --- a/src/main/java/views/MainPanel.java +++ b/src/main/java/views/MainPanel.java @@ -1,6 +1,7 @@ package views; import controls.BotIntelligence; +import controls.ConstantMethods; import controls.StepScheduler; import interfaces.IAttack; @@ -10,6 +11,7 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -43,22 +45,35 @@ opponentHandButtons = new ArrayList<>(); selectableOpponentHandKeys = new ArrayList<>(); currentStep = Step.SelectMyHands; - setButtons(stepScheduler); - } - - void setButtons(IAttack stepScheduler) { deckButtonPanel = new JPanel(); myHandButtonsPanel = new JPanel(); opponentButtonsPanel = new JPanel(); + //setButtons(stepScheduler); + repaintField(stepScheduler); + /** + * setButton末尾の処理をコンストラクタ内へ。 + * + */ + add(deckButtonPanel,BorderLayout.WEST); + + //add(myHandButtonsPanel, BorderLayout.SOUTH); + add(myHandButtonsPanel, BorderLayout.SOUTH); + + add(opponentButtonsPanel, BorderLayout.NORTH); + setStep(Step.SelectOpponentHands); + } + + void setButtons(IAttack iAttack) { + // myHandButtonsPanel.setLayout(new BorderLayout()); // myHandButtonsPanel.setLayout(null); - var deckTopCard=stepScheduler.getTopCard(); - var myHands = stepScheduler.getMyHands(); - var opponentHands = stepScheduler.getOpponentHands(); + var deckTopCard=iAttack.getTopCard(); + var myHands = iAttack.getMyHands(); + var opponentHands = iAttack.getOpponentHands(); isDecidedAttacker=false; - if(!stepScheduler.isDeckLess()){ //デッキが存在する場合にデッキトップのカードを引く処理 + if(!iAttack.isDeckLess()){ //デッキが存在する場合にデッキトップのカードを引く処理 var cardButton =new CardButton(deckTopCard.getKey().toString()); cardButton.setBounds(0,100,CARD_WIDTH,CARD_HEIGHT); @@ -69,9 +84,9 @@ } - if(!stepScheduler.isDeckLess()){ //デッキが存在する場合 + if(!iAttack.isDeckLess()){ //デッキが存在する場合 - var top=stepScheduler.getTopCard(); + var top=iAttack.getTopCard(); var cardButton =new JButton("deck"); cardButton.setPreferredSize(new Dimension(CARD_HEIGHT,CARD_WIDTH)); deckButtonPanel.add(cardButton); @@ -112,11 +127,13 @@ indexForOpponent=0; for (var i : opponentHands) { var cardButton = new CardButton(i.getValue() ? i.getKey().toString() :CLOSED_SYMBOL); + cardButton.setStatus(i.getValue()? CardButton.Status.OPEN: CardButton.Status.CLOSED); cardButton.setEnabled(false); cardButton.addActionListener(new ActionListener() { final int index=indexForOpponent; public void actionPerformed(ActionEvent e) { + if(!iAttack.isDeckLess())isDecidedAttacker=true; if(!isDecidedAttacker){ JOptionPane.showMessageDialog(null, "Select Attacker from Your Hands. ", "Warn", JOptionPane.WARNING_MESSAGE); @@ -145,17 +162,17 @@ if(getDeclaredNumber!=null) { //数字を宣言して、承認したとき guess = Integer.parseInt(getDeclaredNumber); var g= Integer.parseInt(getDeclaredNumber); - stepScheduler.Attack(g, attacker, t); + iAttack.Attack(g, attacker, t); setStep(Step.Confirm); - boolean isSucceed=stepScheduler.isSucceedLatestAttack(); + boolean isSucceed=iAttack.isSucceedLatestAttack(); String resultMessage="Your Attack Was "; resultMessage+=isSucceed?"Succeed.":"Failed."; JOptionPane.showMessageDialog(null,resultMessage); //次の画面に遷移する処理 - update(stepScheduler); + update(iAttack); }else{ @@ -166,7 +183,7 @@ cardButton.setEnabledSelection(false); Timer timer = new Timer(1000, this); timer.setDelay(6000); - botBehave(stepScheduler); + botBehave(iAttack); } }); opponentHandButtons.add(cardButton); @@ -182,7 +199,7 @@ add(opponentButtonsPanel, BorderLayout.NORTH); setStep(Step.SelectOpponentHands); - + // update(stepScheduler); //試行錯誤用 ->やりたいことはできた // myHandButtonsPanel.removeAll(); // for(var mh : myHandButtons){ @@ -218,11 +235,20 @@ JOptionPane.showMessageDialog(null,"Bot`s Turn."); var selectText = ""; var atk =0; - if(iAttack.isDeckLess()){ + if(!iAttack.isDeckLess()){ //デッキにカードが存在するとき + + var deckTopCard=iAttack.getTopCard(); + var cardButton =new CardButton(CLOSED_SYMBOL); + cardButton.setBounds(0,100,CARD_WIDTH,CARD_HEIGHT); + opponentHandButtons.add(cardButton); + opponentButtonsPanel.add(cardButton, BorderLayout.WEST); + isDecidedAttacker=true; + validate(); + repaint(); selectText = "Bot drew."; }else{ atk= bot.selectAttacker(iAttack); - selectText = "Bot selected "+atk; + selectText = "Bot selected. "; } JOptionPane.showMessageDialog(null,selectText); @@ -240,10 +266,17 @@ String resultMessage="Bot`s Attack Was "; resultMessage+=isSucceed?"Succeed.":"Failed."; JOptionPane.showMessageDialog(null,resultMessage); + //update(iAttack); + repaintField(iAttack); + paintDrawCard(iAttack); + iAttack.shiftTurn(); + + var i= iAttack.getOpponentHands(); } void update(IAttack iAttack){ - myHandButtonsPanel.removeAll(); + myHandButtonsPanel.removeAll();// + myHandButtons.clear(); //選択可能な自分のカードのキーを取得 selectableMyHandKeys = iAttack.getMyHands().stream(). filter(x -> !x.getValue()).//その中から非公開のカードを抽出 @@ -254,30 +287,109 @@ // if (!selectableMyHandKeys.contains(i.getKey())) cardButton.setEnabled(false); myHandButtons.add(cardButton); myHandButtonsPanel.add(cardButton, BorderLayout.WEST); + final var a=indexForMyHands; cardButton.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { + //if(currentStep!=Step.SelectMyHands)return; cardButton.setEnabledSelection(true); var option = JOptionPane.showConfirmDialog(null, "Attack with This Card?", "confirmation", 2); cardButton.setEnabledSelection(false); + if (option == JOptionPane.YES_OPTION){ + attacker=a; + isDecidedAttacker=true; + } } }); } - myHandButtons.stream().forEach(x -> { - // x.setEnabled(false); - }); + opponentButtonsPanel.removeAll();// + opponentHandButtons.clear(); + //選択可能な相手のカードのキーを取得 + selectableOpponentHandKeys = iAttack.getOpponentHands().stream(). + filter(x -> !x.getValue()).//その中から非公開のカードを抽出 + map(x -> x.getKey()).toList();//カードのリストからキーのリストへ変換 + indexForOpponent = 0; + for (var i : iAttack.getOpponentHands()) { - //opponentHandButtons.clear(); - //remove(opponentButtonsPanel); - for(int i=0,n=opponentHandButtons.size();i{ // // var cardButton = new JButton(x.getValue() ? x.getKey().toString() :CLOSED_SYMBOL); @@ -289,7 +401,162 @@ opponentHandButtons.stream().forEach(x -> { x.setEnabled(true); }); + + + isDecidedAttacker=false; // add(opponentButtonsPanel); - /// repaint(); + validate(); + repaint(); + } + void paintDrawCard(IAttack iAttack){ + var deckTopCard=iAttack.getTopCard(); + + if(!iAttack.isDeckLess()){ //デッキが存在する場合にデッキトップのカードを引く処理 + var cardButton =new CardButton(deckTopCard.getKey().toString()); + cardButton.setBounds(0,100,CARD_WIDTH,CARD_HEIGHT); + if(iAttack.isATurn()){ + myHandButtons.add(cardButton); + myHandButtonsPanel.add(cardButton, BorderLayout.WEST); + isDecidedAttacker=true; + }else { + opponentHandButtons.add(cardButton); + opponentButtonsPanel.add(cardButton, BorderLayout.WEST); + } + + }else{ //デッキが存在しない場合、アタックに使用するカードを選択する処理 + + } + + if(!iAttack.isDeckLess()){ //デッキが存在する場合 + var top=iAttack.getTopCard(); + var cardButton =new JButton("deck"); + cardButton.setPreferredSize(new Dimension(CARD_HEIGHT,CARD_WIDTH)); + deckButtonPanel.add(cardButton); + }else { + + } + } + void repaintField(IAttack iAttack){ + + var myHands = iAttack.getMyHands(); + var opponentHands = iAttack.getOpponentHands(); + + /** + * 初期化処理(する必要があるのかどうかは知らない) + */ + isDecidedAttacker=false; + myHandButtonsPanel.removeAll();// + myHandButtons.clear(); + opponentButtonsPanel.removeAll();// + opponentHandButtons.clear(); + deckButtonPanel.removeAll(); + + /** + * 自分の手札に関する処理 + */ + indexForMyHands=0; + for (var i : myHands) { + var cardButton = new CardButton(i.getKey().toString()); + cardButton.setStatus(i.getValue()? CardButton.Status.OPEN: CardButton.Status.MY_CLOSED); + myHandButtons.add(cardButton); + myHandButtonsPanel.add(cardButton, BorderLayout.WEST); + + final var a=indexForMyHands;//actionPerformedの中に書くと、クリックされて初めて、回しきったindexForMyHandsを参照してしまうため、ここで一時変数に格納する + cardButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if(!iAttack.isDeckLess())return;//デッキがあるときは何も反応しないように + + cardButton.setEnabledSelection(true); + var option = JOptionPane.showConfirmDialog(null, "Attack with This Card?", "confirmation", 2); + + cardButton.setEnabledSelection(false); + if (option == JOptionPane.YES_OPTION){ + attacker=a; + isDecidedAttacker=true; + } + } + }); + indexForMyHands++; + } + //ここまでが自分のカードに関する処理 + + /** + *相手のカードに関する処理 + */ + indexForOpponent=0; + for (var i : opponentHands) { + var cardButton = new CardButton(i.getValue() ? i.getKey().toString() :CLOSED_SYMBOL); + + cardButton.setStatus(i.getValue()? CardButton.Status.OPEN: CardButton.Status.CLOSED); + cardButton.setEnabled(!i.getValue()); + cardButton.addActionListener(new ActionListener() { + final int index=indexForOpponent; + public void actionPerformed(ActionEvent e) { + if(!iAttack.isDeckLess())isDecidedAttacker=true; + if(!isDecidedAttacker){ + JOptionPane.showMessageDialog(null, "Select Attacker from Your Hands. ", "Warn", + JOptionPane.WARNING_MESSAGE); + return; + } + + cardButton.setEnabledSelection(true); + + //相手のカードを選択したときに確認用ダイアログを出す + var option = JOptionPane.showConfirmDialog(null, "Select This Card?", "confirmation", 2); + if (option == JOptionPane.YES_OPTION) { + target = opponentHands.size()-index;//画面上,相手の手札も自分の手札と同じように左から右へ並べられているため,それを補正するために反転させている + var t = index; + setStep(Step.Declare); + String[] optionsToChoose = new String[DECK_COUNT]; + for (var i = 0; i < optionsToChoose.length; i++) optionsToChoose[i] = String.valueOf(i); + var getDeclaredNumber = (String) JOptionPane.showInputDialog( + null, + "What number is this card?", + "Declare Number", + JOptionPane.QUESTION_MESSAGE, + null, + optionsToChoose, + optionsToChoose[0]); + if(getDeclaredNumber!=null) { //数字を宣言して、承認したとき + guess = Integer.parseInt(getDeclaredNumber); + var g= Integer.parseInt(getDeclaredNumber); + iAttack.Attack(g, attacker, t); + setStep(Step.Confirm); + + boolean isSucceed=iAttack.isSucceedLatestAttack(); + + String resultMessage="Your Attack Was "; + resultMessage+=isSucceed?"Succeed.":"Failed."; + JOptionPane.showMessageDialog(null,resultMessage); + + //次の画面に遷移する処理 + //repaintField(iAttack); + + + }else{ + setStep(Step.SelectOpponentHands); + return; + } + + }else{ + cardButton.setEnabledSelection(false); + return; + } + cardButton.setEnabledSelection(false); + repaintField(iAttack); + botBehave(iAttack); + } + }); + opponentHandButtons.add(cardButton); + opponentButtonsPanel.add(cardButton, 0);//見た目の順序が逆になるように,0番目に挿入 + indexForOpponent++; + } + + + + //ここまでが相手のカードに関する処理 + validate(); + repaint(); } }