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

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

ただいまの
回答率

89.64%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 598

tarutarupop

score 16

前提・実現したいこと

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

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

ボタンを押してもターンの表示が切り替わりません。

該当のソースコード

package game_system;

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.BevelBorder;

public class TestFrame extends JFrame implements ActionListener{

    static JPanel backpane;
    static boolean play_turn;
    static ArrayList<ArrayList<JButton>> y_coordinate = new ArrayList<ArrayList<JButton>>();

    public static void main(String args[]){
        TestFrame mainframe = new TestFrame();
        /*
         * 画面生成
         */
            //親パネル
        backpane = new JPanel();
        backpane.setLayout(null);
        backpane.setBackground(Color.GREEN);
            //ターン表示のためのパネル
        JLabel tellturn = mainframe.CreateLabel();
        backpane.add(tellturn);

            //升目パネル
        JPanel screen = new JPanel();
        screen.setBounds(0,200,500, 500);
        screen.setLayout(new GridLayout(20,20,0,0));
        for(int i = 0;i<20;i++){
            ArrayList<JButton> x_coordinate = new ArrayList<JButton>();
            for(int t = 0;t<20;t++){
                JButton cell = CreateCell(i,t);
                cell.addActionListener(mainframe);
                screen.add(cell);
                x_coordinate.add(cell);
            }
            y_coordinate.add(x_coordinate);
        }
        backpane.add(screen);
        mainframe.add(backpane);
        mainframe.setVisible(true);
    }
    /*コンストラクタ*/
    public TestFrame(){
        super("TestGame");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(506, 728);
        setResizable(false);
        play_turn = true;    //初期値(初期ターン)

    }
    public JLabel CreateLabel(){
        //ターンを表示するためのラベル
        String text;
        if(play_turn == true){
            text = "赤";
        }else{
            text = "青";
        }
        JLabel jl = new JLabel("現在はプレイヤー"+text+"のターンです");
        jl.setBorder(new BevelBorder(BevelBorder.RAISED, Color.white, Color.black));
        jl.setBounds(0, 0, 500, 195);
        jl.setBackground(Color.WHITE);
        return jl;
    }
    public static JButton CreateCell(int x,int y){
        JButton btn = new JButton();
        btn.setSize(10, 10);
        btn.setActionCommand(x+"-"+y);
        return btn;
    }
    /* (非 Javadoc)
     * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
     * ボタン処理
     */
    @Override
    public void actionPerformed(ActionEvent e) {
        String coordinate = e.getActionCommand();
        for(int k=0;k<20;k++){
            for(int j = 0;j<20;j++){
                String number = k+"-"+j;
                if(coordinate.equals(number)){
                    Color player_c;
                    if(play_turn == true){
                        player_c = Color.RED;
                        play_turn = false;
                        JLabel jl = CreateLabel();
                        backpane.add(jl);
                    }else{
                        player_c = Color.BLUE;
                        play_turn = true;
                        JLabel jl = CreateLabel();
                        backpane.add(jl);
                    }
                    y_coordinate.get(k).get(j).setBackground(player_c);
                }
            }
        }

        return;
    }

}

試したこと

補足情報(言語/FW/ツール等のバージョンなど)

開発環境はEclipseです。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/04 13:03

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

    キャンセル

  • 2017/08/04 13:29

    手番切り替え前に表示していた手番表示用JLabelが同じ位置に残っているせいで、新しくCreateLabelで作られたJLabelが隠れてしまっている...とかでしょうかね?

    手番が切り替わるたびに毎回JLabelを作るのではなく、起動時に作った手番表示用JLabelをインスタンス変数に保管しておいて、手番切り替え時はそのJLabelの文字列をsetTextで変更するだけにしてみるとどうでしょう。

    キャンセル

  • 2017/08/04 14:39

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

    キャンセル

  • 2017/08/04 15:25

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

    キャンセル

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

  • ただいまの回答率 89.64%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる