36.
じゃんけんアプリ
プロジェクト作成
配列やSwingを使って、簡単なじゃんけんアプリを作成してみましょう。

ファイル構成
HandGame/
game/
├── App.java
├── Hand.java
└── Window.java
プロジェクト作成
「HandGame」プロジェクトを作成します。

クラスファイル作成
gameパッケージに「App.java」「Hand.java」「Window.java」を作成します。「App.java」はメインプログラムとします。

フレーム作成
フレームのベース作成
JFrameでフレームを作成し、空のウィンドウを表示してみましょう。
JFrameの継承
WindowクラスでJFrameを継承します。
Window.java
public class Window extends JFrame {
}
フレームの実装
create()でフレームを作成します。サイズや位置調整し、フレームを閉じたらアプリが終了するようにしておきます。
Window.java
public class Window extends JFrame {
public void create() {
// フレームのサイズ
setBounds(300, 200, 300, 200);
// フレームを閉じたときの処理
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//フレーム表示
setVisible(true);
}
}
メインアプリの実装
「App.java」のメインメソッドで、Windowのcreate()メソッドを実行します。
Window.java
package game;
public class App {
public static void main(String[] args) {
Window window = new Window();
window.create();
}
}
メインアプリの実行
「App.java」を実行します。

結果
空のウィンドウが表示されました。表示を確認したらウィンドウを閉じて終了しておきましょう。
ラベルとパネル
ラベルとパネルの定義
Windowクラスにラベルとパネルのメンバ変数を定義します。
Window.java
public class Window extends JFrame {
//ラベル
JLabel handLabel;
JLabel resultLabel;
//パネル
JPanel handPanel;
JPanel resultPanel;
JPanel buttonPanel;
}
ラベルとパネルの表示
create() メソッドにラベルとパネルを表示する処理を追加します。
Window.java
public class Window extends JFrame {
...
public void create() {
// フレーム
setBounds(300, 200, 300, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// BoxLayout
BoxLayout boxlayout = new BoxLayout(getContentPane(), BoxLayout.Y_AXIS);
setLayout(boxlayout);
// ラベル
handLabel = new JLabel("PC:", JLabel.CENTER);
resultLabel = new JLabel("じゃんけん", JLabel.CENTER)
// パネル
handPanel = new JPanel();
handPanel.add(handLabel);
resultPanel = new JPanel();
resultPanel.add(resultLabel);
//JFrameにパネルを追加
add(handPanel);
add(resultPanel);
setVisible(true);
}
}
メインアプリの実行
フレームにラベルが表示されました。
ボタン作成
じゃんけんのモデル作成
Handクラスに「グー」「チョキ」「パー」の定数を定義します。
Hand.java
public class Hand {
final static String ROCK = "グー";
final static String SCISSORS = "チョキ";
final static String PAPER = "パー";
final static String[] hands = { ROCK, SCISSORS, PAPER };
}
HandとWindowの連携
WindowクラスにHandインスタンスを受け渡して連携します。
コンストラクタ追加
Windowクラスのコンストラクタを作成し、Handインスタンスを受け取るようにします。
Window.java
public class Window extends JFrame {
JLabel handLabel;
JLabel resultLabel;
JPanel handPanel;
JPanel resultPanel;
JPanel buttonPanel;
//Handクラスの変数追加
Hand hand;
//コンストラクタの追加
public Window(Hand hand) {
super();
//Handインスタンスの受け取り
this.hand = hand;
}
....
}
Handクラスの受け渡し
App.java
public class App {
public static void main(String[] args) {
//Handインスタンス生成
Hand hand = new Hand();
//WindowインスタンスにHandインスタンスを受け渡し
Window window = new Window(hand);
window.create();
}
}
じゃんけんボタンの追加
Windowクラスのcreate()メソッドに、じゃんけんボタンを追加します。
public void create() {
...
//ボタン追加
buttonPanel = new JPanel();
for (int i = 0; i < Hand.hands.length; i++) {
JButton handButton = new JButton(Hand.hands[i]);
buttonPanel.add(handButton);
}
add(buttonPanel);
setVisible(true);
}
static変数のアクセス
クラスのstatic変数は、クラス名に .(ピリオド)でアクセスします。インスタンスからはアクセスできません。
クラス名.変数
ボタンの確認
アプリを実行してボタンを確認してみましょう。

じゃんけん処理
じゃんけんの処理を追加します。コンピュータの手を「pcHand」、じゃんけんの結果を「result」とします。
Hand.java
public class Hand {
...
//フィールド追加
public String pcHand;
public String playerHand;
public String result;
public void play(String playerHand) {
this.playerHand = playerHand;
// pc hand
Random rand = new Random();
pcHandIndex = rand.nextInt(3);
pcHand = hands[pcHandIndex];
// result
if (playerHand == pcHand) {
result = "Draw";
} else {
result = ((this.playerHand == ROCK && this.pcHand == SCISSORS)
|| (this.playerHand == SCISSORS && this.pcHand == PAPER)
|| (this.playerHand == PAPER && this.pcHand == ROCK))
? "Win!"
: "Lose!";
}
}
}
イベント処理
イベントリスナー
ActionListenerを実装(implements)して、イベント処理できるようにします。イベントを取得できるよう、actionPerformed() メソッドが必要です。
Window.java
public class Window extends JFrame implements ActionListener {
...
public void actionPerformed(ActionEvent e) {
}
}
ボタンにイベント追加
addActionListener() でボタンにイベントを追加します。
Window.java
buttonPanel = new JPanel();
for (int i = 0; i < Hand.hands.length; i++) {
JButton handButton = new JButton(Hand.hands[i]);
//イベントリスナー追加
handButton.addActionListener(this);
buttonPanel.add(handButton);
}
add(buttonPanel)
イベント処理
プレーヤーがどのボタンが押したかチェックし、Handクラスに渡して勝敗を決定します。
Window.java
public void actionPerformed(ActionEvent e) {
String playerHand = e.getActionCommand();
hand.play(playerHand);
handLabel.setText("PC: " + hand.pcHand);
resultLabel.setText(hand.result);
}
アプリ実行
アプリ動作確認
アプリを実行して、じゃんけんゲームができるか確認してみましょう。
結果

ソース
App.java
package game;
public class App {
public static void main(String[] args) {
Hand hand = new Hand();
Window window = new Window(hand);
window.create();
}
}
Hand.java
package game;
import java.util.Random;
public class Hand {
final static String ROCK = "グー";
final static String SCISSORS = "チョキ";
final static String PAPER = "パー";
final static String[] hands = { ROCK, SCISSORS, PAPER };
final static String[] images = { "rock.png", "seccors.png", "paper.png" };
public String pcHand;
public String playerHand;
public String result;
public void play(String playerHand) {
this.playerHand = playerHand;
// pc hand
Random rand = new Random();
int handIndex = rand.nextInt(3);
this.pcHand = hands[handIndex];
// result
if (playerHand == pcHand) {
result = "Draw";
} else {
result = ((this.playerHand == ROCK && this.pcHand == SCISSORS)
|| (this.playerHand == SCISSORS && this.pcHand == PAPER)
|| (this.playerHand == PAPER && this.pcHand == ROCK))
? "Win!"
: "Lose!";
}
}
}
Window.java
package game;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Window extends JFrame implements ActionListener {
//ラベル
JLabel handLabel;
JLabel resultLabel;
//パネル
JPanel handPanel;
JPanel resultPanel;
JPanel buttonPanel;
//Handクラス
Hand hand;
//コンストラクタ
public Window(Hand hand) {
super();
this.hand = hand;
}
public void create() {
// フレーム
setBounds(300, 200, 300, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// BoxLayout
BoxLayout boxlayout = new BoxLayout(getContentPane(), BoxLayout.Y_AXIS);
setLayout(boxlayout);
// ラベル
handLabel = new JLabel("PC:", JLabel.CENTER);
resultLabel = new JLabel("じゃんけん", JLabel.CENTER);
// パネル
handPanel = new JPanel();
handPanel.add(handLabel);
resultPanel = new JPanel();
resultPanel.add(resultLabel);
//JFrameにパネルを追加
add(handPanel);
add(resultPanel);
//ボタン追加
buttonPanel = new JPanel();
for (int i = 0; i < Hand.hands.length; i++) {
JButton handButton = new JButton(Hand.hands[i]);
handButton.addActionListener(this);
buttonPanel.add(handButton);
}
add(buttonPanel);
setVisible(true);
}
public void actionPerformed(ActionEvent e) {
String playerHand = e.getActionCommand();
hand.play(playerHand);
handLabel.setText("PC: " + hand.pcHand);
resultLabel.setText(hand.result);
}
}