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

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

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

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

Q&A

解決済

2回答

846閲覧

GUIでのwhileの不具合

kumathi

総合スコア7

Java

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

0グッド

1クリップ

投稿2022/05/28 18:37

編集2022/05/28 19:48

質問失礼します。今どちらかじゃんけんで三勝したらグリコの配点で勝敗を決めるゲームを作っています。しかし下記のコードを書いてみたところwhileを入れた瞬間急に動かなくなったり、明らかに乱数ではないもの(コンピューターの手)が出てしまったりと不具合が起きてしまいます。自分なりに原因を考えてみたところ全く分からない状況です。どなたかご教授いただけないでしょうか。

import javax.swing.JFrame; public class GameMain { public static void main(String[] args) { // TODO Auto-generated method stub //ウィンドウ設定 JFrame frame = new JFrame("Guriko"); frame.setSize(640, 480); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setResizable(false); Panel.createPanel(frame); //ウィンドウ表示 frame.setVisible(true); } }
import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class Panel { public static JLabel headerLabel; public static JLabel contentsLabel; public static void createPanel(JFrame frame) { //ヘッダーパネル Dimension headerPanelDimension = new Dimension(640, 50); JPanel headerPanel = setPanel(Color.BLACK, headerPanelDimension); headerLabel = new JLabel("Let's play Guriko"); headerLabel = setFont(Color.WHITE,headerLabel,24); headerPanel.add(headerLabel); frame.add(headerPanel,BorderLayout.NORTH); //コンテンツパネル Dimension contentsPanelDimension = new Dimension(640, 380); JPanel contentsPanel = setPanel(Color.WHITE,contentsPanelDimension); contentsLabel = new JLabel("Rock-Scissors-Paper..."); contentsLabel = setFont(Color.BLACK,contentsLabel,54); contentsPanel.add(contentsLabel); frame.add(contentsPanel,BorderLayout.CENTER); //フッタパネル Dimension footerPanelDimension = new Dimension(640, 50); JPanel footerPanel = setPanel(Color.BLACK,footerPanelDimension); Player.createButton(footerPanel); frame.add(footerPanel,BorderLayout.SOUTH); } public static JPanel setPanel(Color color, Dimension PanelDimension) { JPanel panel = new JPanel(); panel.setPreferredSize(PanelDimension); panel.setLayout(new BorderLayout()); panel.setBackground(color); return(panel); } public static JLabel setFont(Color clr,JLabel label,int strSize) { label.setForeground(clr); Font labelFont = new Font("MS ゴシック",Font.PLAIN,strSize); label.setFont(labelFont); label.setHorizontalAlignment(JLabel.CENTER); label.setVerticalAlignment(JLabel.CENTER); return(label); } }
import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Random; import javax.swing.JButton; import javax.swing.JPanel; public class Player implements ActionListener { int win, lose, points1,points2; public static void createButton(JPanel footerPanel) { //ボタンを表示 JButton btnGu = new JButton("Rock"); btnGu = setButton(btnGu); footerPanel.add(btnGu, BorderLayout.WEST); JButton btnChoki = new JButton("Scissors"); btnChoki = setButton(btnChoki); footerPanel.add(btnChoki, BorderLayout.CENTER); JButton btnPa = new JButton("Paper"); btnPa = setButton(btnPa); footerPanel.add(btnPa, BorderLayout.EAST); } public static JButton setButton(JButton button) { int buttonSizeX = (640 - 20)/3; Dimension buttonDimesion = new Dimension(buttonSizeX, 50); button.setPreferredSize(buttonDimesion); Font buttonFont = new Font("MS ゴシック",Font.PLAIN,24); button.setFont(buttonFont); Player player = new Player(); button.addActionListener(player); return(button); } public void actionPerformed(ActionEvent e) { win = 0; lose = 0; while (win < 3 && lose < 3) { String command = e.getActionCommand(); int playerHand = 0; if (command.equals("Rock")) playerHand = 0; else if (command.equals("Scissors")) playerHand = 1; else if (command.equals("Paper")) playerHand = 2; Random random = new Random(); int computerHand = random.nextInt(3); if (computerHand == 0) Panel.contentsLabel.setText("Rock"); else if (computerHand == 1) Panel.contentsLabel.setText("Scissors"); else if (computerHand == 2) Panel.contentsLabel.setText("Paper"); if(playerHand==0 && computerHand==1) { Panel.headerLabel.setText("Win"); win++; } else if(playerHand==1 && computerHand==2 || playerHand==2 && computerHand==0) { Panel.headerLabel.setText("Win"); win++; } else if(playerHand==0 && computerHand==2 || playerHand==2 && computerHand==1) { Panel.headerLabel.setText("Lose"); lose++; } else if(playerHand==1 && computerHand==0) { Panel.headerLabel.setText("Lose"); lose++; } else if(playerHand==computerHand) { Panel.headerLabel.setText("Drew"); } } } }

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

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

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

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

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

guest

回答2

0

Player や Rondom の生成は 1回だけにしましょう。
actionPerformedメソッドからは即座に復帰しないといけません。
actionPerformedはボタンが押されたときの1回分の処理を書きましょう。
win, lose の回数はコンストラクタで初期化し、actionPerformed で 3回勝負がついたら処理を終わらせればいいです。

java

1public class Player implements ActionListener { 2 int win = 0, lose = 0; 3 Random random = new Random(); 4 5 public static void createButton(JPanel panel) { 6 Player player = new Player(); 7 8 JButton btnGu = player.createButton("Rock"); 9 panel.add(btnGu, BorderLayout.WEST); 10 11 JButton btnChoki = player.createButton("Scissors"); 12 panel.add(btnChoki, BorderLayout.CENTER); 13 14 JButton btnPa = player.createButton("Paper"); 15 panel.add(btnPa, BorderLayout.EAST); 16 } 17 18 public JButton createButton(String name) { 19 JButton button = new JButton(name); 20 int buttonSizeX = (640 - 20)/3; 21 Dimension buttonDimesion = new Dimension(buttonSizeX, 50); 22 button.setPreferredSize(buttonDimesion); 23 Font buttonFont = new Font("MS ゴシック", Font.PLAIN, 24); 24 button.setFont(buttonFont); 25 26 button.addActionListener(this); 27 28 return button; 29 } 30 31 public void actionPerformed(ActionEvent e) { 32 if (isFinish()) return; 33 34 int playerHand = 0; 35 String command = e.getActionCommand(); 36 if (command.equals("Rock")) playerHand = 0; 37 else if (command.equals("Scissors")) playerHand = 1; 38 else if (command.equals("Paper")) playerHand = 2; 39 40 int computerHand = random.nextInt(3); 41 if (computerHand == 0) Panel.contentsLabel.setText("Rock"); 42 else if (computerHand == 1) Panel.contentsLabel.setText("Scissors"); 43 else if (computerHand == 2) Panel.contentsLabel.setText("Paper"); 44 45 if (playerHand == computerHand) { 46 Panel.headerLabel.setText("Drew"); 47 } else if (playerHand==0 && computerHand==1 || 48 playerHand==1 && computerHand==2 || 49 playerHand==2 && computerHand==0) { 50 Panel.headerLabel.setText("Win"); 51 win++; 52 } else { 53 Panel.headerLabel.setText("Lose"); 54 lose++; 55 } 56 57 if (isFinish()) { 58 finish(); 59 } 60 } 61 62 boolean isFinish() { 63 return win >= 3 || lose >= 3; 64 } 65 66 void finish() { 67 String judge; 68 if( win >= 3) { 69 judge = "Congratulations!!<br>You Win!!"; 70 } else if ( lose >= 3) { 71 judge = "You Lose..."; 72 } else { 73 judge = "Wow...<br>You Drew..."; 74 } 75 76 Panel.headerLabel.setText("Game Over !!"); 77 Panel.contentsLabel.setText("<html><body><center>" + judge + 78 "<br>You:" + win + " vs Computer:" + lose + 79 "</center></body></html>"); 80 } 81}

投稿2022/05/28 20:56

編集2022/05/29 01:37
shiracamus

総合スコア5406

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

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

0

ベストアンサー

さらっと実行した限りでは、停止するとか動きがおかしいというのは分かりませんでした。
ただ、グーチョキパーのボタンを押した時になんの為に while ループをするのでしょうか。
押したのは一回の勝負の手だけのはずです。

それと、プログラムとして static を乱用している状態なのが気になることと、(以前のご質問で指摘されていたと思いますが) Random オブジェクトを毎回作成すると出てくるのは偏った値になりますので、一度作成したら使い続けるようにしたほうが良いです。

以下はコンソール版の RspGame を Swing 化する形のものです。(両者はパッケージも変えています。)
3 回勝負で決着が付いたらどのような表示にするのか分からないので、延々と勝負する状態です。

RspGameSwing.java (Swing 版)

java

1package teratail_java.q_9l3rxftcib7ioa; 2 3import java.awt.*; 4 5import javax.swing.*; 6 7import teratail_java.q_9fqaju7u4pul0f.RspGame; 8import teratail_java.q_9fqaju7u4pul0f.RspGame.Rsp; 9 10public class RspGameSwing extends JFrame { 11 public static void main(String[] args) { 12 SwingUtilities.invokeLater(() -> new RspGameSwing().setVisible(true)); 13 } 14 15 private static final String fontName = "MS ゴシック"; 16 private JLabel headerLabel, contentsLabel; 17 18 RspGameSwing() { 19 super("Guriko"); 20 setSize(640, 480); 21 setLocationRelativeTo(null); 22 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 23 setResizable(false); 24 25 RspGame.Computer computer = new RspGame.Computer(); 26 User user = new User(); 27 28 //ヘッダーパネル 29 JPanel headerPanel = new JPanel(new BorderLayout()); 30 headerPanel.setBackground(Color.BLACK); 31 headerLabel = createLabel("Let's play Guriko", Color.WHITE, 24); 32 headerPanel.add(headerLabel); 33 add(headerPanel, BorderLayout.NORTH); 34 35 //コンテンツパネル 36 JPanel contentsPanel = new JPanel(new BorderLayout()); 37 contentsPanel.setBackground(Color.WHITE); 38 contentsLabel = createLabel("Rock-Scissors-Paper...", Color.BLACK, 54); 39 contentsPanel.add(contentsLabel); 40 add(contentsPanel, BorderLayout.CENTER); 41 42 //フッタパネル 43 JPanel footerPanel = new JPanel(new GridLayout(1, 3)); 44 footerPanel.setBackground(Color.WHITE); 45 footerPanel.add(createButton(RspGame.Rsp.Rock, user, computer)); 46 footerPanel.add(createButton(RspGame.Rsp.Scissors, user, computer)); 47 footerPanel.add(createButton(RspGame.Rsp.Paper, user, computer)); 48 add(footerPanel,BorderLayout.SOUTH); 49 } 50 51 private JLabel createLabel(String text, Color foreground, int fontSize) { 52 JLabel label = new JLabel(text); 53 label.setForeground(foreground); 54 label.setFont(new Font(fontName, Font.PLAIN, fontSize)); 55 label.setHorizontalAlignment(JLabel.CENTER); 56 label.setVerticalAlignment(JLabel.CENTER); 57 return label; 58 } 59 60 private JButton createButton(RspGame.Rsp rsp, User user, RspGame.Computer computer) { 61 JButton button = new JButton("" + rsp); 62 button.setFont(new Font(fontName, Font.PLAIN, 24)); 63 button.addActionListener(v -> judge(user.setRsp(rsp), computer)); 64 return button; 65 } 66 67 void judge(User user, RspGame.Computer computer) { 68 Rsp computerRsp = computer.decideNext(); 69 70 contentsLabel.setText("" + computerRsp); 71 headerLabel.setText(RspGame.winLossJudgement(user, computer)); 72 } 73 74 class User extends RspGame.Player { 75 User setRsp(RspGame.Rsp rsp) { 76 latestRsp = rsp; 77 return this; 78 } 79 } 80}

RspGame.java ( コンソール 版)

java

1package teratail_java.q_9fqaju7u4pul0f; 2//package mygame; 3 4import java.io.*; 5import java.util.Random; 6 7public class RspGame { 8 public static void main(String[] args) throws IOException { 9 BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); 10 User user = User.newInstance(reader); 11 Computer computer = new Computer(); 12 13 while(user.getWinCount() + computer.getWinCount() < 3) { 14 15 Rsp userRsp = user.getRsp(reader); 16 Rsp computerRsp = computer.decideNext(); 17 18 System.out.println(user.name + ":" + userRsp + " || " + computer.name + ":" + computerRsp); 19 System.out.println(winLossJudgement(user, computer)); 20 21 System.out.print("<RESULT> " + "WIN:" + user.getWinCount() + " LOSE:" + computer.getWinCount()); 22 System.out.println(" <SCORE> " + user.name + ":" + user.getWinPoint() + " || " + computer.name + ":" + computer.getWinPoint()); 23 } 24 25 System.out.println("Finish!!!"); 26 System.out.println("Let's Judge.........."); 27 28 if(user.getWinPoint() > computer.getWinPoint()) { 29 System.out.print("Congratulations!! You Win!!"); 30 } else if(user.getWinPoint() < computer.getWinPoint()) { 31 System.out.print("You Lose..."); 32 } else { 33 System.out.print("Wow... You Draw..."); 34 } 35 System.out.println(" <SCORE> " + user.name + ":" + user.getWinPoint() + " || " + computer.name + ":" + computer.getWinPoint()); 36 } 37 38 public static String winLossJudgement(Player user, Player computer) { 39 if(user.latestRsp.drawsWith(computer.latestRsp)) { 40 return "Draw"; 41 } 42 if(user.latestRsp.isWinBy(computer.latestRsp)) { 43 user.youWin(); 44 return "Win"; 45 } 46 computer.youWin(); 47 return "Lose"; 48 } 49 50 public enum Rsp { 51 Rock(3), Scissors(6), Paper(6); 52 53 static Rsp valueOf(int i) { 54 if(i < 0 || values().length <= i) return null; 55 return values()[i]; 56 } 57 58 final int winPoint; 59 Rsp(int winPoint) { 60 this.winPoint = winPoint; 61 } 62 63 public boolean drawsWith(Rsp other) { 64 return ordinal() == other.ordinal(); 65 } 66 public boolean isWinBy(Rsp other) { 67 return (ordinal() + 1) % values().length == other.ordinal(); 68 } 69 } 70 71 public static abstract class Player { 72 final String name; 73 private int winCount, winPoint; 74 protected Rsp latestRsp; 75 public Player() { 76 this("no name"); 77 } 78 public Player(String name) { 79 this.name = name; 80 } 81 public void youWin() { 82 this.winCount ++; 83 this.winPoint += latestRsp.winPoint; 84 } 85 public int getWinCount() { return winCount; } 86 public int getWinPoint() { return winPoint; } 87 } 88 89 static class User extends Player { 90 static User newInstance(BufferedReader reader) throws IOException { 91 System.out.print("Please enter your Name:"); 92 return new User(reader.readLine()); 93 } 94 private User(String name) { 95 super(name); 96 } 97 Rsp getRsp(BufferedReader reader) throws IOException { 98 while(true) { 99 System.out.println("\nPlease enter your choice"); 100 System.out.print("(ROCK:0,SCISSORS:1、PAPER:2) --> "); 101 String line = reader.readLine(); 102 try { 103 latestRsp = Rsp.valueOf(Integer.parseInt(line)); 104 if(latestRsp != null) return latestRsp; 105 System.out.println("【ERROR】You can choose only 0, 1 or 2"); 106 } catch(NumberFormatException e) { 107 System.out.println("【ERROR】You can enter only the NUMBER 0, 1 or 2"); 108 } 109 } 110 } 111 } 112 113 public static class Computer extends Player { 114 private Random rand = new Random(); 115 public Computer() { 116 super("Computer"); 117 } 118 public Rsp decideNext() { 119 return latestRsp = Rsp.valueOf(rand.nextInt(3)); 120 } 121 } 122}

投稿2022/05/28 20:42

編集2022/05/28 20:50
jimbe

総合スコア12623

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問