とりあえず、目的は果たしました。
Threadが正しく機能し、無限ループの中でボタン押下イベントを捉えて、ループを脱出することが出来ます。
実際のスロットマシンは、メダルの持ち数とかベットとか、さらに当たり判定によって動作も変わりますよね。
今回は、ゲームを完成させることではなく、あくまでThreadとRunnableインターフェースの動きを知ることが目的でしたので、ここまでです。
当たり判定も少しだけ、入れてます。
単純に3つ全て揃えば大当たりで、2つが揃えば小当たりです。
1個のクラスで書いちゃったので、これが全ソースです。
——————————————————————-
package swing;
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;
//コンストラクタ
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);
}
@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);
System.out.println(“ここがどういうスピードで出るかみる。”);
} 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;
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){
Thread t = new Thread(this);
t.start();
}
}
@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 自動生成されたメソッド・スタブ
}
}
———————————————————————
何もしてないメソッドもそのまま載せてます。
本当にチープですが、初学者には参考になるかも。
てことで、次回からは、JavaアプリでSQLiteを使うことをやってみたいです。
ただ、題材が思いつかないんだよなぁ。。