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

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

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

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

1回答

2067閲覧

二人手番制ゲームのボタンによるターン表示変更

tarutarupop

総合スコア20

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2017/08/04 02:55

編集2017/08/04 03:59

###前提・実現したいこと
現在JavaのSwingにてあるゲームのテストクラスを作っています。その過程で升目状に配置されたボタンが押されたらターンを切り替えてその表示をJLabelで画面上部に表示したいと考えてるですがうまくいきません。ゲームは丸罰ゲームのような二人で行う手番性のものです。
ターンが切り替わらない理由と説明をどうかお願いします。また、当方初心者のためほかにも改善点があれば指摘をお願いします。
###発生している問題・エラーメッセージ
ボタンを押してもターンの表示が切り替わりません。

###該当のソースコード

java

1package game_system; 2 3import java.awt.Color; 4import java.awt.GridLayout; 5import java.awt.event.ActionEvent; 6import java.awt.event.ActionListener; 7import java.util.ArrayList; 8 9import javax.swing.JButton; 10import javax.swing.JFrame; 11import javax.swing.JLabel; 12import javax.swing.JPanel; 13import javax.swing.border.BevelBorder; 14 15public class TestFrame extends JFrame implements ActionListener{ 16 17 static JPanel backpane; 18 static boolean play_turn; 19 static ArrayList<ArrayList<JButton>> y_coordinate = new ArrayList<ArrayList<JButton>>(); 20 21 public static void main(String args[]){ 22 TestFrame mainframe = new TestFrame(); 23 /* 24 * 画面生成 25 */ 26 //親パネル 27 backpane = new JPanel(); 28 backpane.setLayout(null); 29 backpane.setBackground(Color.GREEN); 30 //ターン表示のためのパネル 31 JLabel tellturn = mainframe.CreateLabel(); 32 backpane.add(tellturn); 33 34 //升目パネル 35 JPanel screen = new JPanel(); 36 screen.setBounds(0,200,500, 500); 37 screen.setLayout(new GridLayout(20,20,0,0)); 38 for(int i = 0;i<20;i++){ 39 ArrayList<JButton> x_coordinate = new ArrayList<JButton>(); 40 for(int t = 0;t<20;t++){ 41 JButton cell = CreateCell(i,t); 42 cell.addActionListener(mainframe); 43 screen.add(cell); 44 x_coordinate.add(cell); 45 } 46 y_coordinate.add(x_coordinate); 47 } 48 backpane.add(screen); 49 mainframe.add(backpane); 50 mainframe.setVisible(true); 51 } 52 /*コンストラクタ*/ 53 public TestFrame(){ 54 super("TestGame"); 55 setDefaultCloseOperation(EXIT_ON_CLOSE); 56 setSize(506, 728); 57 setResizable(false); 58 play_turn = true; //初期値(初期ターン) 59 60 } 61 public JLabel CreateLabel(){ 62 //ターンを表示するためのラベル 63 String text; 64 if(play_turn == true){ 65 text = "赤"; 66 }else{ 67 text = "青"; 68 } 69 JLabel jl = new JLabel("現在はプレイヤー"+text+"のターンです"); 70 jl.setBorder(new BevelBorder(BevelBorder.RAISED, Color.white, Color.black)); 71 jl.setBounds(0, 0, 500, 195); 72 jl.setBackground(Color.WHITE); 73 return jl; 74 } 75 public static JButton CreateCell(int x,int y){ 76 JButton btn = new JButton(); 77 btn.setSize(10, 10); 78 btn.setActionCommand(x+"-"+y); 79 return btn; 80 } 81 /* (非 Javadoc) 82 * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) 83 * ボタン処理 84 */ 85 @Override 86 public void actionPerformed(ActionEvent e) { 87 String coordinate = e.getActionCommand(); 88 for(int k=0;k<20;k++){ 89 for(int j = 0;j<20;j++){ 90 String number = k+"-"+j; 91 if(coordinate.equals(number)){ 92 Color player_c; 93 if(play_turn == true){ 94 player_c = Color.RED; 95 play_turn = false; 96 JLabel jl = CreateLabel(); 97 backpane.add(jl); 98 }else{ 99 player_c = Color.BLUE; 100 play_turn = true; 101 JLabel jl = CreateLabel(); 102 backpane.add(jl); 103 } 104 y_coordinate.get(k).get(j).setBackground(player_c); 105 } 106 } 107 } 108 109 return; 110 } 111 112}

###試したこと
###補足情報(言語/FW/ツール等のバージョンなど)
開発環境はEclipseです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

if(play_turn = true)という記述が所々にありますが、これが怪しくないですかね?

[追記]
蛇足かもしれませんが、こちらのサイトの記事の一番下に寄せられておりますコメントがご参考になるかもしれません。

投稿2017/08/04 03:48

編集2017/08/04 03:59
Bongo

総合スコア10807

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

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

tarutarupop

2017/08/04 04:03

手番の更新はうまくできたのですがJLabelの表示の更新ができませんでした。なぜなのでしょうか?
Bongo

2017/08/04 04:29

手番切り替え前に表示していた手番表示用JLabelが同じ位置に残っているせいで、新しくCreateLabelで作られたJLabelが隠れてしまっている...とかでしょうかね? 手番が切り替わるたびに毎回JLabelを作るのではなく、起動時に作った手番表示用JLabelをインスタンス変数に保管しておいて、手番切り替え時はそのJLabelの文字列をsetTextで変更するだけにしてみるとどうでしょう。
tarutarupop

2017/08/04 05:39

つまり、ラベル作成用に新たにクラスを作りそれを手番切り替えのたびにsetメソッドでtextを変更する、ということでしょうか?
Bongo

2017/08/04 06:25

失礼、今回のケースはインスタンス変数よりstatic変数にした方がいいかもしれませんね。単純に、backpaneをstatic変数に保持しているのと同じように、手番表示用JLabelを保持しておいて随時テキストを変更するという意図で書きました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問