早速、生徒に作ってもらいました。
あっという間に作り上げた子がいて、更に、バグ出ししてくれました。スペースキーでスタートですが、スペースキーを連打するとその分、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 自動生成されたメソッド・スタブ
}
}
———————————————–