早速、生徒に作ってもらいました。

あっという間に作り上げた子がいて、更に、バグ出ししてくれました。スペースキーでスタートですが、スペースキーを連打するとその分、runメソッドが動いてしまい、結果として、一つの窓にいくつもの数字が表示されてしまう、という。

1ゲームが終了するまで、スペースキーを殺しておかないといけない、ということに気がつかせてもらいました。

ちょっと調べると、Threadをstopというのもあるみたいですが、非推奨だと。なんと。。

で、ベタではありますが、isActiveというベタなbooleanを持たせ、最初はfalseにしておきます。

Keypressedメソッドは押されたキーがkeycode=32、つまりスペースキーであることと、isActiveがfalseであることを条件にThreadをスタートさせます。

同時にisActiveをtrueにしてしまうので、2回目以降のスペースキーでThreadが走ることはありません。

ストップボタンが三つとも押されて、無限ループを抜け出したらまたisActiveをfalseに変え、次のスペースキー押下を待ちます。

こうすることで、連打に耐えられるようになりました。とさ。

お粗末様でございましたm(_ _)m

————————————————-

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Slot extends JFrame implements Runnable,KeyListener,Action{
    JButton btn1;
    JButton btn2;
    JButton btn3;
    boolean stop1;
    boolean stop2;
    boolean stop3;
    JTextField field1;
    JTextField field2;
    JTextField field3;
    boolean isActive;


    //コンストラクタ
    Slot(){
        setTitle(“超簡単スロットマシン”);
        setBounds(100, 100, 600, 300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().setLayout(new BorderLayout());

        //トップのラベル
        JPanel p = new JPanel();
        p.setBackground(Color.ORANGE);
        JLabel label = new JLabel();
        label.setText(“押忍!店長!  (スペースキーでスタート)”);
        p.add(label);
        getContentPane().add(p, BorderLayout.NORTH);
        //トップのラベルここまで
        //一番下のボタン
        JPanel botomP = new JPanel();
        botomP.setLayout(new GridLayout(1,3));
        btn1 = new JButton(“ストップ”);
        btn2 = new JButton(“ストップ”);
        btn3 = new JButton(“ストップ”);
        btn1.setActionCommand(“stop1”);
        btn1.addActionListener(this);
        btn1.setEnabled(false);
        btn2.setActionCommand(“stop2”);
        btn2.addActionListener(this);
        btn2.setEnabled(false);
        btn3.setActionCommand(“stop3”);
        btn3.addActionListener(this);
        btn3.setEnabled(false);
        botomP.add(btn1);
        botomP.add(btn2);
        botomP.add(btn3);
        getContentPane().add(botomP, BorderLayout.SOUTH);

        JPanel centerP = new JPanel();
        centerP.setLayout(new GridLayout(1,3));
        Font f = new Font(Font.SERIF,Font.BOLD,98);
        field1 = new JTextField();
        field1.setFont(f);
        field1.setHorizontalAlignment(JTextField.CENTER);
        //field1.setText(“7”);
        field1.setEnabled(false);
        field2 = new JTextField();
        field2.setFont(f);
        field2.setHorizontalAlignment(JTextField.CENTER);
        //field2.setText(“7”);
        field2.setEnabled(false);
        field3 = new JTextField();
        field3.setFont(f);
        field3.setHorizontalAlignment(JTextField.CENTER);
        //field3.setText(“7”);
        field3.setEnabled(false);
        centerP.add(field1);
        centerP.add(field2);
        centerP.add(field3);
        getContentPane().add(centerP, BorderLayout.CENTER);
        isActive = false;

    }

    @Override
    public void run() {
        // TODO 自動生成されたメソッド・スタブ
        //System.out.println(“runが走る。”);
        btn1.setEnabled(true);
        btn2.setEnabled(true);
        btn3.setEnabled(true);
        stop1 = false;
        stop2 = false;
        stop3 = false;
        int num1,num2,num3;
        num1 = 0;
        num2 = 5;
        num3 = 9;
        while(true){
            num1++;
            if(num1 == 10) num1 = 0;
            num2++;
            if(num2 == 10) num2 = 0;
            num3++;
            if(num3 == 10) num3 = 0;

            if(!(stop1)) field1.setText(Integer.toString(num1));
            if(!(stop2)) field2.setText(Integer.toString(num2));
            if(!(stop3)) field3.setText(Integer.toString(num3));

            if(stop1 && stop2 && stop3){
                break;
            }
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                // TODO 自動生成された catch ブロック
                e.printStackTrace();
            }
        }
        System.out.println(“Game Over!”);
        //Slot slot =new Slot();
        requestFocus();
        setVisible(true);
        btn1.setEnabled(false);
        btn2.setEnabled(false);
        btn3.setEnabled(false);
        stop1 = false;
        stop2 = false;
        stop3 = false;
        isActive = false;

        if(field1.getText().equals(field2.getText()) && field1.getText().equals(field3.getText())){
            JOptionPane.showMessageDialog(null, “大当たり!!!!”);
        } else if(field1.getText().equals(field2.getText())){
            JOptionPane.showMessageDialog(null, “小当たり!”);
        } else if(field1.getText().equals(field3.getText())){
            JOptionPane.showMessageDialog(null, “小当たり!”);
        }else if(field2.getText().equals(field3.getText())){
            JOptionPane.showMessageDialog(null, “小当たり!”);
        }


    }

    public static void main(String[] args) {
        // TODO 自動生成されたメソッド・スタブ
        Slot slot =new Slot();
        slot.addKeyListener(slot);
        slot.setVisible(true);


    }
    @Override
    public void keyTyped(KeyEvent e) {
        // TODO 自動生成されたメソッド・スタブ
    }
    @Override
    public void keyPressed(KeyEvent e) {
        // TODO 自動生成されたメソッド・スタブ
        //System.out.println(e.getKeyCode());
        if(e.getKeyCode() == 32 && isActive == false){
            Thread t = new Thread(this);
            t.start();
            isActive = true;
        }


    }
    @Override
    public void keyReleased(KeyEvent e) {
        // TODO 自動生成されたメソッド・スタブ

    }


    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO 自動生成されたメソッド・スタブ
        //System.out.println(e.getActionCommand());
        if(e.getActionCommand().equals(“stop1”)){
            stop1 = true;
        }
        if(e.getActionCommand().equals(“stop2”)){
            stop2 = true;
        }
        if(e.getActionCommand().equals(“stop3”)){
            stop3 = true;
        }
        //if(stop1 && stop2 && stop3){
        //this.addKeyListener(slot);
        //}
    }


    @Override
    public Object getValue(String key) {
        // TODO 自動生成されたメソッド・スタブ
        return key;
    }


    @Override
    public void putValue(String key, Object value) {
        // TODO 自動生成されたメソッド・スタブ

    }

}

———————————————–