diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/Main.java b/src/main/java/Main.java index db0fcda..7ccfb3e 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -1,5 +1,13 @@ +import views.MainFrame; + +import javax.swing.*; + public class Main { public static void main(String[] args){ - + JFrame mainFrame = new MainFrame(); + mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + mainFrame.setSize(640, 480); + mainFrame.setLocationRelativeTo(null); + mainFrame.setVisible(true); } } diff --git a/src/main/java/controls/StepScheduler.java b/src/main/java/controls/StepScheduler.java new file mode 100644 index 0000000..4be28e0 --- /dev/null +++ b/src/main/java/controls/StepScheduler.java @@ -0,0 +1,62 @@ +package controls; + +import interfaces.IAttack; +import models.Algo; +import views.Constants; + +import java.util.List; +import java.util.Map; + +public class StepScheduler implements IAttack { + Algo algo; + int turnCount=0; + boolean isATurn; + public StepScheduler(){ + algo = new Algo(); + isATurn=true; + } + + public Constants.Step getStep(){ + return null; + } + + @Override + public void Attack(int guess, int attacker, int target) { + if(isATurn){ + if(isDeckLess()){ + algo.selectA(guess, attacker, target); + }else{ + algo.drawA(guess, target); + } + }else { + if(isDeckLess()){ + algo.selectB(guess, attacker, target); + }else{ + algo.drawB(guess, target); + } + } + turnCount++; + } + + @Override + public List> getMyHands() { + return isATurn?algo.getHandsA():algo.getHandsB(); + } + + @Override + public List> getOpponentHands() { + return isATurn?algo.getHandsB():algo.getHandsA(); + } + + @Override + public Map.Entry getTopCard() { + return null; + } + + public boolean isDeckLess(){ + return algo.getDeck().size()==0; + } + public boolean getIsATurn(){ + return isATurn; + } +} diff --git a/src/main/java/interfaces/IAttack.java b/src/main/java/interfaces/IAttack.java new file mode 100644 index 0000000..691afcd --- /dev/null +++ b/src/main/java/interfaces/IAttack.java @@ -0,0 +1,17 @@ +package interfaces; + +import java.util.List; +import java.util.Map; + +public interface IAttack { + /** + + */ + void Attack(int guess, int attacker, int target); + List> getMyHands(); + List> getOpponentHands(); + + Map.Entry getTopCard(); + boolean isDeckLess(); + +} diff --git a/src/main/java/models/Algo.java b/src/main/java/models/Algo.java index 3ebd4f6..996140c 100644 --- a/src/main/java/models/Algo.java +++ b/src/main/java/models/Algo.java @@ -2,19 +2,22 @@ import java.util.*; +import static views.Constants.DECK_COUNT; + public class Algo { private LoseB loseB; private HandsB handsB; private LoseA loseA; private HandsA handsA; private Deck deck; + int turnCount=0; public Algo() { loseB = new LoseB(); handsB = new HandsB(loseB); loseA = new LoseA(); handsA = new HandsA(loseA); deck = new Deck(); - deck.reset(11); + deck.reset(DECK_COUNT); for(int i=0;i<2;i++){ handsA.getValue().add(deck.head()); handsB.getValue().add(deck.head()); @@ -33,7 +36,6 @@ var b=getHandsB(); this.handsA.selectA(guess, attacker, b, target); this.handsB.selectA(guess, attacker, b, target); - } public void drawB(int guess, int target) { var a=getHandsA(); @@ -48,6 +50,9 @@ this.handsB.selectB(guess, attacker, a, target); this.handsA.selectB(guess, attacker, a, target); } + private void countUpTurn(){ + turnCount++; + } public List> getDeck() { return deck.getValue(); } diff --git a/src/main/java/views/Constants.java b/src/main/java/views/Constants.java new file mode 100644 index 0000000..26c9e78 --- /dev/null +++ b/src/main/java/views/Constants.java @@ -0,0 +1,18 @@ +package views; + +import java.awt.*; + +public class Constants { + public static final int CARD_WIDTH=50; + public static final int CARD_HEIGHT=75; + public Step STEP; + public enum Step{ + SelectMyHands, + SelectOpponentHands, + Declare, + Confirm + } + public static String CLOSED_SYMBOL="?"; + public static int DECK_COUNT=11; + public static Color SELECTED_COLOR=Color.CYAN; +} diff --git a/src/main/java/views/GamePanel.java b/src/main/java/views/GamePanel.java new file mode 100644 index 0000000..1522187 --- /dev/null +++ b/src/main/java/views/GamePanel.java @@ -0,0 +1,29 @@ +package views; + +import models.Algo; + +import javax.swing.*; +import java.util.ArrayList; +import java.util.List; + +public class GamePanel extends JPanel { + List selectableButtons; + + public GamePanel(Algo algo) { + + } + public void setSelectableButtons(Area area){ + + } + public enum Area{ + HANDS_A, + HANDS_B, + DECK + } + public enum Step{ + PREPARATION, + SELECTION, + DECLARATION, + CONFIRM + } +} diff --git a/src/main/java/views/MainFrame.java b/src/main/java/views/MainFrame.java new file mode 100644 index 0000000..cc1077e --- /dev/null +++ b/src/main/java/views/MainFrame.java @@ -0,0 +1,22 @@ +package views; + +import controls.StepScheduler; +import models.Algo; + +import javax.swing.*; +import java.awt.*; + +public class MainFrame extends JFrame { + StepScheduler stepScheduler; + + public MainFrame(){ + super("Algolike"); + stepScheduler = new StepScheduler(); + var mainPanel = new MainPanel(stepScheduler); + this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + mainPanel.setVisible(true); + this.add(mainPanel, BorderLayout.CENTER); + this.pack(); + } +} diff --git a/src/main/java/views/MainPanel.java b/src/main/java/views/MainPanel.java new file mode 100644 index 0000000..9da1f54 --- /dev/null +++ b/src/main/java/views/MainPanel.java @@ -0,0 +1,176 @@ +package views; + +import controls.StepScheduler; +import interfaces.IAttack; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import static java.lang.Integer.parseInt; +import static views.Constants.*; + +public class MainPanel extends JPanel { + private List myHandButtons; + + private List opponentHandButtons; + + private List selectableMyHandKeys; + private List selectableOpponentHandKeys; + JPanel myHandButtonsPanel; + JPanel opponentButtonsPanel; + int guess; + int attacker; + int target; + int indexForOpponent =0; + private JPanel deckButtonPanel; + + public MainPanel(StepScheduler stepScheduler) { + super(new BorderLayout()); + myHandButtons = new ArrayList<>(); + opponentHandButtons = new ArrayList<>(); + selectableOpponentHandKeys = new ArrayList<>(); + + setButtons(stepScheduler); + } + + void setButtons(IAttack stepScheduler) { + deckButtonPanel = new JPanel(); + myHandButtonsPanel = new JPanel(); + opponentButtonsPanel = new JPanel(); + var deckTopCard=stepScheduler.getTopCard(); + var myHands = stepScheduler.getMyHands(); + var opponentHands = stepScheduler.getOpponentHands(); + + if(!stepScheduler.isDeckLess()){ + var cardButton =new JButton("deck"); + cardButton.setPreferredSize(new Dimension(CARD_HEIGHT,CARD_WIDTH)); + deckButtonPanel.add(cardButton); + } + + + //選択可能な自分のカードのキーを取得 + selectableMyHandKeys = myHands.stream(). + filter(x -> !x.getValue()).//非公開のカードを抽出 + map(x -> x.getKey()).toList();//カードのリストからキーのリストへ変換 + for (var i : myHands) { + var cardButton = new JButton(i.getKey().toString()); + if (!selectableMyHandKeys.contains(i.getKey())) cardButton.setEnabled(false); + cardButton.setPreferredSize(new Dimension(CARD_WIDTH, CARD_HEIGHT)); + myHandButtons.add(cardButton); + myHandButtonsPanel.add(cardButton, BorderLayout.WEST); + } + + //相手のカードに関する処理 + indexForOpponent=0; + for (var i : opponentHands) { + var cardButton = new JButton(i.getValue() ? i.getKey().toString() :CLOSED_SYMBOL); + cardButton.setPreferredSize(new Dimension(CARD_WIDTH, CARD_HEIGHT)); + cardButton.setEnabled(false); + cardButton.addActionListener(new ActionListener() { + final int index=indexForOpponent; + public void actionPerformed(ActionEvent e) { + var baseColor= cardButton.getBackground(); + cardButton.setBackground(SELECTED_COLOR); + //相手のカードを選択したときに確認用ダイアログを出す + 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); + stepScheduler.Attack(g, attacker, t); + setStep(Step.Confirm); + + boolean isSucceed=stepScheduler.getOpponentHands().get(t).getKey()==g; + + String resultMessage="Your Attack Was "; + resultMessage+=isSucceed?"Succeed.":"Failed."; + JOptionPane.showMessageDialog(null,resultMessage); + + //次の画面に遷移する処理 + update(stepScheduler); + }else{ + setStep(Step.SelectOpponentHands); + } + } + cardButton.setBackground(baseColor); + } + }); + opponentHandButtons.add(cardButton); + opponentButtonsPanel.add(cardButton, 0);//見た目の順序が逆になるように,0番目に挿入 + indexForOpponent++; + } + + + add(deckButtonPanel,BorderLayout.WEST); + + add(myHandButtonsPanel, BorderLayout.SOUTH); + add(opponentButtonsPanel, BorderLayout.NORTH); + setStep(Step.SelectOpponentHands); + } + + void setStep(Step step) { + switch (step) { + case SelectMyHands: + break; + case SelectOpponentHands: + opponentHandButtons.stream().filter(x -> x.getText().equals(CLOSED_SYMBOL)).forEach(x -> { + x.setEnabled(true); + }); + break; + + case Declare: + opponentHandButtons.stream().filter(x -> x.getText().equals(CLOSED_SYMBOL)).forEach(x -> { + x.setEnabled(false); + }); + break; + case Confirm: + + break; + } + } + void update(IAttack iAttack){ + + myHandButtons.stream().forEach(x -> { + x.setEnabled(false); + }); + + //opponentHandButtons.clear(); + //remove(opponentButtonsPanel); + for(int i=0,n=opponentHandButtons.size();i{ +// +// var cardButton = new JButton(x.getValue() ? x.getKey().toString() :CLOSED_SYMBOL); +// cardButton.setPreferredSize(new Dimension(CARD_WIDTH, CARD_HEIGHT)); +// cardButton.setEnabled(true); +// opponentHandButtons.add(cardButton); +// opponentButtonsPanel.add(cardButton, 0);//見た目の順序が逆になるように,0番目に挿入 +// }); + opponentHandButtons.stream().forEach(x -> { + x.setEnabled(true); + }); + // add(opponentButtonsPanel); + /// repaint(); + } +} diff --git a/src/test/java/AlgoTest.java b/src/test/java/AlgoTest.java index 80fde51..b0a8783 100644 --- a/src/test/java/AlgoTest.java +++ b/src/test/java/AlgoTest.java @@ -126,10 +126,29 @@ var target = 0; var attacker = 0; - //テスト対象メソッド + printViewA(algo); + //Aはカードを1枚引き,アタックを成功させる. + //Bはアタックされたカードを表にする. algo.drawA(guess, target); printViewA(algo); - printViewB(algo); + + //Bはカードを1枚引き,アタックが失敗する. + //Bはアタックに使用したカードを表にする. + algo.drawB(guess,target); + printViewA(algo); + + int tar=0, gue=0; + for(int i=0;i