プロジェクト作成

配列や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);
	}

}