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

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

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

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

Q&A

1回答

2595閲覧

超初心者 javaゲームで繰り返しができるようになる方法

oohohoh

総合スコア0

Java

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

0グッド

1クリップ

投稿2022/01/01 06:10

前提・実現したいこと

high lowゲームで、何度も再戦できるようにする。
(銀行オブジェクトとも紐づけできるようにもしたいです)
■■な機能を実装中に以下のエラーメッセージが発生しました。

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

再戦ボタンを押しても動かない。 もしくは、何度再戦しても同じ番号しか出ない

該当のソースコード

// 再戦ボタンを表示
btn_again = new JButton("再戦");
setButton( btn_again,this,240, 50, 20 ); // ボタンのフォントやイベント設定
bottom_Panel.add( btn_again,BorderLayout.AFTER_LAST_LINE); // ボトムパネル右側にボタンを追加

if(cmd.equals("再戦"))//再戦ボタンが押されたときの処理 { Display i=new Display(parent,child); }
###ソースコード import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; // 表示クラス public class Display implements ActionListener { // 画面全体のオブジェクト private JFrame disp; // パネルオブジェクト(上部/中央部/下部) private JPanel top_panel, mid_panel, bottom_Panel; // メッセージ表示ラベルオブジェクト private JLabel msg_lbl; // 親のカード情報ラベルオブジェクト(マーク、数字) private JLabel parent_lbl, parent_suit_lbl, parent_no_lbl; // 子のカード情報ラベルオブジェクト(マーク、数字) private JLabel child_lbl, child_suit_lbl, child_no_lbl; // ボタンオブジェクト(HIGH/LOW) private JButton btn_high, btn_low, btn_again; // プレイヤーオブジェクト(親、子) private Player parent, child,parent2,child2; // コンストラクタ(初期化処理) public Display( Player prn, Player chl ) { // メインクラスから受け取った親と子のオブジェクトを設定 parent = prn; child = chl; // ゲーム画面全体の表示設定 disp = new JFrame("HIGH & LOW"); // 画面を生成 disp.setSize(510, 480); // 表示サイズを設定 disp.setLocationRelativeTo(null); // 画面の表示位置を中央に設定 disp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 「×」ボタンで画面を閉じるように設定 //disp.setResizable(false); // 画面サイズを変更できないように設定 // トップパネルの表示設定 top_panel = new JPanel(); // パネルを生成 setPanel(top_panel, Color.ORANGE, null, new Dimension(480, 50) ); // パネルの背景色、レイアウト、サイズを設定 disp.add( top_panel, BorderLayout.NORTH ); // 画面上部にパネルを追加 // メッセージラベルを表示 msg_lbl = new JLabel("HIGHかLOWか当ててください。"); // ラベルを生成 top_panel.add(msg_lbl); // トップパネルに追加 setLabelFont(msg_lbl, Color.BLACK, 0, 15, 480, 20, 20, false); // ラベルのフォント設定 // ミドルパネルの表示設定 mid_panel = new JPanel(); // パネルを生成 setPanel(mid_panel, Color.CYAN, null, new Dimension(480, 180) ); // パネルの背景色、レイアウト、サイズを設定 disp.add( mid_panel, BorderLayout.CENTER ); // 画面中央部にパネルを追加 // 親カードの情報を表示 parent_lbl = new JLabel("私のカード"); parent_suit_lbl = new JLabel( getSuitIcon( parent.GetSuit() ) ); // マークを表示するラベル parent_no_lbl = new JLabel( getNoStr( parent.GetNo() ) ); // 数字を表示するラベル // ミドルパネルに追加 mid_panel.add(parent_lbl); mid_panel.add(parent_suit_lbl); mid_panel.add(parent_no_lbl); // ラベルのフォント設定 setLabelFont(parent_lbl, Color.WHITE, 90, 10, 100, 20, 14, false ); setLabelFont(parent_suit_lbl, Color.WHITE, 100, 10, 80, 100, 16, false ); setLabelFont(parent_no_lbl, Color.WHITE, 100, 35, 80, 100, 16, true ); // 子カードの情報を表示 child_lbl = new JLabel("あなたのカード"); child_suit_lbl = new JLabel(""); child_no_lbl = new JLabel("?"); // ミドルパネルに追加 mid_panel.add(child_lbl); mid_panel.add(child_suit_lbl); mid_panel.add(child_no_lbl); // ラベルのフォント設定 setLabelFont(child_lbl, Color.WHITE, 265, 10, 150, 20, 14, false ); setLabelFont(child_suit_lbl, Color.LIGHT_GRAY, 300, 10, 80, 100, 16, false ); setLabelFont(child_no_lbl, Color.LIGHT_GRAY, 300, 35, 80, 100, 16, true ); // ボトムパネルの表示設定 bottom_Panel = new JPanel(); setPanel( bottom_Panel, Color.LIGHT_GRAY, new BorderLayout(), new Dimension(480, 50) ); // パネルの背景色、レイアウト、サイズを設定 disp.add( bottom_Panel, BorderLayout.SOUTH ); // 画面下部にパネルを追加 // HIGHボタンを表示 btn_high = new JButton("HIGH"); //btn_high.disable(); setButton( btn_high, this, 240, 50, 20 ); // ボタンのフォントやイベント設定 bottom_Panel.add( btn_high, BorderLayout.WEST ); // ボトムパネル左側にボタンを追加 // LOWボタンを表示 btn_low = new JButton("LOW"); setButton( btn_low, this, 240, 50, 20 ); // ボタンのフォントやイベント設定 bottom_Panel.add( btn_low, BorderLayout.EAST ); // ボトムパネル右側にボタンを追加 // ゲーム画面を表示 disp.setVisible(true); } // HIGHかLOWが選択されたときのイベント public void actionPerformed(ActionEvent e) { String cmd = e.getActionCommand(); // アクションコマンド(どのボタンが押されたか) int parent_no = parent.GetNo(); // 親カードの数字 int child_no = child.GetNo(); // 子カードの数字 int child_suit = child.GetSuit(); // 子カードのマーク // 子のカードをオープン child_no_lbl.setBackground(Color.WHITE); // 数字の背景色 child_no_lbl.setText( getNoStr( child.GetNo() ) ); // 数字の表示データ child_suit_lbl.setBackground(Color.WHITE); // マークの背景色 child_suit_lbl.setIcon( getSuitIcon( child_suit ) );// マークの表示データ // 押されたボタンに応じた処理を行う if( cmd.equals("HIGH") ) // HIGHボタンが押された時の処理 { // ボタンの色を変える btn_high.setBackground(Color.GREEN); // 結果を判定してメッセージ更新 if( parent_no < child_no ) // 子の方が大きい msg_lbl.setText("大正解、あなたの勝ちです!"); //金額処理 else if( child_no < parent_no ) // 親の方が大きい msg_lbl.setText("不正解、あなたの負けです!"); //金額処理 else // 親と子の数字が同じ msg_lbl.setText("奇遇ですね。引き分けです!"); } else if( cmd.equals("LOW") ) // LOWボタンが押された時の処理 { btn_low.setBackground(Color.GREEN); // ボタンの色を変える // 結果を判定してメッセージ更新 if( parent_no < child_no ) // 子の方が大きい msg_lbl.setText("不正解、あなたの負けです!"); //金額処理 else if( child_no < parent_no ) // 親の方が大きい msg_lbl.setText("大正解、あなたの勝ちです!"); //金額処理 else // 親と子の数字が同じ msg_lbl.setText("奇遇ですね。引き分けです!"); } // 再戦ボタンを表示 btn_again = new JButton("再戦"); setButton( btn_again,this,240, 50, 20 ); // ボタンのフォントやイベント設定 bottom_Panel.add( btn_again,BorderLayout.AFTER_LAST_LINE); // ボトムパネル右側にボタンを追加 if(cmd.equals("再戦"))//再戦ボタンが押されたときの処理 { Display i=new Display(parent,child); } } // パネルのフォント設定を行うメソッド public static void setPanel(JPanel panel, Color color, BorderLayout layout, Dimension dimension ) { panel.setBackground(color); // 背景色を設定 panel.setLayout(layout); // レイアウトを設定 panel.setPreferredSize(dimension); // 表示サイズを設定 return; } // ラベルのフォント設定を行うメソッド public static void setLabelFont(JLabel label, Color clr, int x_pos, int y_pos, int x_size, int y_size, int strSize, boolean opq ) { label.setBackground(clr); // 背景色を設定 label.setLocation(x_pos, y_pos); // 表示位置を設定 label.setSize(x_size, y_size); // 表示サイズを設定 label.setFont( new Font("MS ゴシック", Font.PLAIN, strSize) ); // 書式、文字サイズを設定 label.setHorizontalAlignment(JLabel.CENTER); // 水平方向中央揃え label.setVerticalAlignment(JLabel.CENTER); // 垂直方向中央揃え label.setOpaque(opq); // ラベルの透明性を設定(true=不透明、false=透明) return; } // ボタンの設定を行うメソッド public static void setButton(JButton btn, ActionListener al, int x_size, int y_size, int strSize ) { btn.setPreferredSize(new Dimension(x_size, y_size)); // 表示サイズを設定 btn.setFont( new Font("MS ゴシック", Font.PLAIN, strSize) ); // 書式、文字サイズを設定 btn.addActionListener(al); // ボタンが押された時のイベントを受け取れるように設定 return; } // マークに応じたアイコンオブジェクトを取得するメソッド public static ImageIcon getSuitIcon( int suit ) { ImageIcon icon; // マークに応じた画像を読み込んでリターンする switch(suit) { case 0: // スペード icon = new ImageIcon("./src/game/highandlow/img/spade.jpg"); return icon; case 1: // ハート icon = new ImageIcon("./src/game/highandlow/img/heart.jpg"); return icon; case 2: // ダイヤ icon = new ImageIcon("./src/game/highandlow/img/diamond.jpg"); return icon; case 3: // クラブ icon = new ImageIcon("./src/game/highandlow/img/clover.jpg"); return icon; default: // マークが不正の場合 return null; } } // 数字に応じた表示文字列を取得するメソッド public static String getNoStr( int no ) { switch(no) { case 1: // エース return "A"; case 11: // ジャック return "J"; case 12: // クイーン return "Q"; case 13: // キング return "K"; default: // 上記以外は数字をそのまま文字列として出力する return String.valueOf(no); } } } ### 試したこと 新たにParent2,Child2を作成し、コンストラクタ部分と同じように再定義したが、結果はボタンを押しても変化しないだけであった。 ### 補足情報(FW/ツールのバージョンなど) eclipse java ここにより詳細な情報を記載してください。

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

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

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

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

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

jimbe

2022/01/01 08:00 編集

コードはマークダウン記法でご提示ください。 マークダウンにつきましては、ヘルプをご参照ください。 編集にはプレビューもありますので、マークダウンによってコードが枠内に表示されることをご確認頂ければ確実かと思います。 また逆に、日本語による説明等はコードのマークダウンに含めないようにしてください。
jimbe

2022/01/01 08:09

少なくとも、ご提示のコードだけでは動作させることはおろか、コンパイルさえも通りません。 > Display i=new Display(parent,child); こんなことをしても単に Display オブジェクトを新たに作るだけで、繰り返しにはなりません。 1つのレース場を周回しなければならないのに、1周する度に同じ形のレース場を別に作ってそこを走ろうとするようなものです。
guest

回答1

0

Javaでゲーム開発!サンプルプログラム付きでわかりやすく解説 | 侍エンジニアブログ

こちらですよね?(はっきり言ってだいぶクソいです^^;
参考コードがある場合は、質問に明示してください。

再戦ボタンを押しても動かない。
もしくは、何度再戦しても同じ番号しか出ない

足りない部分を記事から補って実行してみました。

再戦するたびにウィンドウが増えていきました。
これはnew Display()すると、新たにJFrameを作るので当然ですね。
disp.dispose();とすれば、とりあえずは古いほうは消えます。

「同じ番号しか出ない」のは、Draw(deck);をしたときにしか数字が変わらないからです。

Java

1if (cmd.equals("再戦")) { 2 disp.dispose(); 3 4 parent.Draw(deck); 5 child.Draw(deck); 6 7 new Display(parent, child); 8}

といった感じにする必要がありますが、どうにかしてdeckを渡す必要があります。

小手先の対応ならどうとでもなりますが、個人的には今のつくり(再戦のたびに新たなウィンドウになる)はどうかと思います(新たに作らないようにするとなると、かなり改変することになりますが^^;

(銀行オブジェクトとも紐づけできるようにもしたいです)

「銀行オブジェクト」とはなんですか?
提示コードはほぼ参考サイトそのままで、oohohohさんがどこまで勉強が進んでいるか全くわかりません。

やってみたこと等を追記してください。

投稿2022/01/01 09:31

TN8001

総合スコア9363

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

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

jimbe

2022/01/01 14:55

個人感想ですが、侍さんとこは大体ダメな印象です orz
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問