1. HOME
  2. »
  3. プログラミング・Web
  4. »
  5. Java
  6. »
  7. 【絶対できる!】Javaでのじゃんけんゲームの作り方

【絶対できる!】Javaでのじゃんけんゲームの作り方


※追記(2022/6/6)
もっと、より分かりやすい記事になるよう修正しました。


今回はJavaを使って、じゃんけんゲームを作る方法を紹介します。
Eclipseがインストールされており、Javaの開発環境が整っている状態からのスタートとなります。

もしEclipseのインストールがまだの場合は、こちらを参考にしてください。

目次
  1. 今回作るじゃんけんゲーム
  2. 新しいプロジェクトの作成
  3. クラスの作成
  4. JFrameでウィンドウの表示
  5. Panelを使って、ウィンドウを3分割する
  6. メソッドを使って、繰り返し使う部分を何度も呼び出す
  7. テキストの表示
  8. ボタンの表示
  9. 新しくクラスを作り、ソースを分かりやすくする
  10. ボタンを押したときの操作を反映
  11. コンピュータの手をランダムで決定する
  12. ゲームの勝敗
  13. 完成した全体のコード
  14. まとめ

今回作るじゃんけんゲーム

では、まずは今回作成するじゃんけんゲームを紹介します。
今回はこのような物を作ります。

出したい手のボタンをクリックすることで、相手の手と、じゃんけんの結果が表示されます。

新しいプロジェクトの作成

まず、新しいプロジェクトを作成していきます。
ファイル(File)」→「新規(New)」→「Java プロジェクト(Java Project)」の順番に選択します。

今回は「プロジェクト名(Project name)」を「JankenGame」としました。そして、以下のような設定で進めていこうと思います。
最後に「完了(Finish)」をクリックします。

これで、JankenGameというプロジェクトが作成されました。

クラスの作成

それでは、クラスを作っていきましょう。
画面上部から、「ファイル(File)」→「新規(New)」→「クラス(Class)」と選択します。


すると、「新規 Java クラス」という画面が表示されます。
私は以下のように設定しました。

パッケージ(package)には、ドメインを逆さまにしたものに、適当な名前をつけて使うことが多いと思います。
同じものがあってはいけないので、世界に一つのドメインを逆さまにするのが習慣のようです。
私の場合、本当は「original-game.com」というドメインですが、ハイフン(-)が使えないので、今回はアンダースコア(_)を使っています。
ドメインを持っていない方は、ここは適当に。

名前(Name)には「Main」と入力します。

「どのメソッド・スタブを作成しますか?(Which method stubs would you like to create?)」と訊かれている部分は、「public static void main(String[] args)」にのみ、チェックを入れます。

最後に「完了(Finish)」をクリックすると、クラスが作成されます。

作成されたMain.javaは、次のようになっています。

package com.original_game.janken;

public class Main {

	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ

	}

}

5行目に、public static void main(String[] args){}と書かれています。
これは、プログラムの一番最初に読まれるメソッドです。

さきほどクラスを作成した時、「public static void main(String[] args)」にチェックを入れました。
このチェックを入れることで、このメソッドを自動的に作ってくれます。

JFrameでウィンドウの表示

つづいて、JFrameを使ってウィンドウを表示してみようと思います。

では、早速ソースを書いていきましょう。

package com.original_game.janken;

//JFrameクラスのインポート
import javax.swing.JFrame;

public class Main {

	public static void main(String[] args) {
		//JFrameクラスをインスタンス化
		JFrame frame = new JFrame("じゃんけんゲーム");
		//ウィンドウのサイズを指定
		frame.setSize(640, 480);
		//ウィンドウの位置を、画面の中心へ
		frame.setLocationRelativeTo(null);
		//×でアプリが終了するようにする
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		//ウィンドウのサイズを変更できないようにする
		frame.setResizable(false);
		//ウィンドウを表示する
		frame.setVisible(true);
	}

}

上のコードで、ウィンドウを表示することが出来ます。

4行目は、JFrameをかんたんに書くためのものです。

もしもこれが書かれていない場合、10行目の、
JFrame frame = new JFrame("じゃんけんゲーム");
を、
javax.swing.JFrame frame = new javax.swing.JFrame("じゃんけんゲーム");
と書かなくてはいけなくなります。

ちなみに、4行目を書かなくても、先に10行目を書いてShift+command+Oで、自動的に記述することが可能です。

さて、10行目の「JFrame frame = new JFrame("じゃんけんゲーム");」は、JFrameクラスのインスタンスを作っています。

インスタンスというのは、学校のクラスの生徒のようなものです。
そのクラスの雰囲気や先生によって、生徒の性格が作られます。

今回の場合は、JFrameクラスの雰囲気に馴染んでしまった、frameさんという生徒(インスタンス)に、いろんなことをお願いしていきます。

12行目は、ウィンドウサイズの設定です。ここでは640*480にしています。

14行目では、ウィンドウが画面の中心に表示されるようにしています。

16行目では、ウィンドウ上部の✕をクリックしたときに、アプリも終了するようにしています。

18行目では、ウィンドウのサイズを変更できないようにしています。
これがないと、ウィンドウのサイズが自由に変更できてしまうので、ゲーム全体のレイアウトが崩れたりします。

20行目で、非表示だったウィンドウを表示しています。

これで実行すると、このようにウィンドウが表示されます。

ウィンドウが表示されると、やっぱりゲーム感がでてきますね。

Panelを使って、ウィンドウを3分割する

今回、じゃんけんゲームでは、ウィンドウを3つに分割して作っていきたいと思っています。

Javaでじゃんけんゲーム

一番上のパネルをヘッダー、真ん中のパネルをコンテンツ、一番下のパネルをフッターとします。

ヘッダーには今の状況を、コンテンツにはゲームのメインとなる部分を、フッターにはゲームを操作する部分を作っていきます。

パネルの作り方

では、実際にパネルを作ってみましょう。まずはヘッダーのパネルから貼付けようと思います。
パネルを表示するプログラムを書いてみましょう。

パネル表示のプログラムは、import文以外setVisibleよりも前に書きます。
何故なら、setVisibleでウィンドウ内のパネルなどの表示も同時にされるからです。

package com.original_game.janken;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main {

	public static void main(String[] args) {
		//JFrameクラスをインスタンス化
		JFrame frame = new JFrame("じゃんけんゲーム");
		//ウィンドウのサイズを指定
		frame.setSize(640, 480);
		//ウィンドウの位置を、画面の中心へ
		frame.setLocationRelativeTo(null);
		//×でアプリが終了するようにする
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		//ウィンドウのサイズを変更できないようにする
		frame.setResizable(false);
		
		//JPanelクラスをインスタンス化
		JPanel headerPanel = new JPanel();
		//パネルの色を黒にする
		headerPanel.setBackground(Color.BLACK);
		//ヘッダーパネルのサイズを「横幅640、縦幅50」に設定
		headerPanel.setPreferredSize(new Dimension(640, 50));
		//ウィンドウにヘッダーパネルを追加
		frame.add(headerPanel, BorderLayout.NORTH);
		
		//ウィンドウを表示する
		frame.setVisible(true);
	}

}

import文は、ソースを書いたあとにShift+command+Oで自動的に記述できます。

25行目では、JPanelクラスのインスタンスを生成しています。先ほどはJFrameでしたが、今度はJPanelのインスタンスです。

27行目で、そのパネル全体の色を指定します。今回は黒を指定しました。

29行目では、横幅640、縦幅50のパネルというふうに設定しています。

そして、最後に31行目では、ここまでで設定したパネルを、ウィンドウ(frame)に追加します。
BorderLayout.NORTHを指定することで、パネルを追加する位置が、絶対位置での上、というふうになります。

するとこのように、640*50のヘッダーパネルが作られます。

同様にほかのパネルも表示

では、同様にコンテンツパネル、フッタパネルも表示していこうと思います。
33〜36、38〜42行目を追加します。

package com.original_game.janken;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main {

	public static void main(String[] args) {
		//JFrameクラスをインスタンス化
		JFrame frame = new JFrame("じゃんけんゲーム");
		//ウィンドウのサイズを指定
		frame.setSize(640, 480);
		//ウィンドウの位置を、画面の中心へ
		frame.setLocationRelativeTo(null);
		//×でアプリが終了するようにする
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		//ウィンドウのサイズを変更できないようにする
		frame.setResizable(false);
		
		//JPanelクラスをインスタンス化
		JPanel headerPanel = new JPanel();
		//パネルの色を黒にする
		headerPanel.setBackground(Color.BLACK);
		//ヘッダーパネルのサイズを「横幅640、縦幅50」に設定
		headerPanel.setPreferredSize(new Dimension(640, 50));
		//ウィンドウにヘッダーパネルを追加
		frame.add(headerPanel, BorderLayout.NORTH);
		
		//コンテンツパネル
		JPanel contentsPanel = new JPanel();
		contentsPanel.setBackground(Color.WHITE);
		frame.add(contentsPanel, BorderLayout.CENTER);
		
		//フッターパネル
		JPanel footerPanel = new JPanel();
		footerPanel.setBackground(Color.BLACK);
		footerPanel.setPreferredSize(new Dimension(640, 50));
		frame.add(footerPanel, BorderLayout.SOUTH);
		
		//ウィンドウを表示する
		frame.setVisible(true);
	}

}

するとこのようになります。

ここで、似た様な記述が多いな、と思った方もいるかもしれません。
実は、似た部分はひとつにまとめることができます。

メソッドを使って、繰り返し使う部分を何度も呼び出す

似たような部分は、メソッドを使うと便利です。
メソッドとは、繰り返し使う部分を別の所に記述し、なんども呼び出して使うものです。

それではメソッドを使って、ソースをまとめてみましょう。

package com.original_game.janken;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main {

	public static void main(String[] args) {
		//JFrameクラスをインスタンス化
		JFrame frame = new JFrame("じゃんけんゲーム");
		//ウィンドウのサイズを指定
		frame.setSize(640, 480);
		//ウィンドウの位置を、画面の中心へ
		frame.setLocationRelativeTo(null);
		//×でアプリが終了するようにする
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		//ウィンドウのサイズを変更できないようにする
		frame.setResizable(false);
		
		//ヘッダーパネルを作成
		JPanel headerPanel = makePanel(Color.BLACK, 640, 50);
		//ウィンドウにヘッダーパネルを追加
		frame.add(headerPanel, BorderLayout.NORTH);
		
		//コンテンツパネルを作成
		JPanel contentsPanel = makePanel(Color.WHITE);
		//ウィンドウにコンテンツパネルを追加
		frame.add(contentsPanel, BorderLayout.CENTER);
		
		//フッターパネルを作成
		JPanel footerPanel = makePanel(Color.BLACK, 640, 50);
		//ウィンドウにフッターパネルを追加
		frame.add(footerPanel, BorderLayout.SOUTH);
		
		//ウィンドウを表示する
		frame.setVisible(true);
	}
	
	//パネルを作るメソッド(幅と高さを指定する用)
	static JPanel makePanel(Color color, int width, int height) {
		//JPanelクラスをインスタンス化
		JPanel panel = new JPanel();
		//パネルの色を変更する
		panel.setBackground(color);
		//パネルのサイズを「width、height」に設定
		panel.setPreferredSize(new Dimension(width, height));
		//作ったパネルを返す
		return panel;
	}
	
	//パネルを作るメソッド(幅と高さを指定しない用)
	static JPanel makePanel(Color color) {
		//JPanelクラスをインスタンス化
		JPanel panel = new JPanel();
		//パネルの色を変更する
		panel.setBackground(color);
		//作ったパネルを返す
		return panel;
	}

}

それぞれ重なった部分を、ソース一番下に移動させています。(43〜53、55〜63行目)

今回、幅と高さを、指定するもの、指定しないもの、のふたつを同じ名前のメソッドで作りました。
引数の違う複数のメソッドを用意することで、その引数に合ったメソッドが使われます。

この仕組みを、オーバーロード、といいます。

今回はメソッドをふたつ作ったため、全体のソースコードは長くなってしまったのですが、mainメソッドのみを見れば、分かりやすくなったのではないか、と思います。

テキストの表示

パネル内に文字を表示しようと思うのですが、文字を表示するだけでも、色々な設定があります。
たとえば、フォントとか、色とか、位置とか、そういったものです。

ではまず、テキストを表示する方法をみていきましょう。

ヘッダーパネルに「さあ、じゃんけんで勝負だ!」というテキストを表示してみます。

package com.original_game.janken;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Main {

	public static void main(String[] args) {
		//JFrameクラスをインスタンス化
		JFrame frame = new JFrame("じゃんけんゲーム");
		//ウィンドウのサイズを指定
		frame.setSize(640, 480);
		//ウィンドウの位置を、画面の中心へ
		frame.setLocationRelativeTo(null);
		//×でアプリが終了するようにする
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		//ウィンドウのサイズを変更できないようにする
		frame.setResizable(false);
		
		//ヘッダーパネルを作成
		JPanel headerPanel = makePanel(Color.BLACK, 640, 50);
		//ヘッダーパネルに、レイアウトマネージャとしてBorderLayoutを指定
		headerPanel.setLayout(new BorderLayout());
		//JLabelクラスをインスタンス化
		JLabel label = new JLabel("「さあ、じゃんけんで勝負だ!」");
		//テキストの文字を白にする
		label.setForeground(Color.WHITE);
		//テキストのフォントを設定
		label.setFont(new Font("MS ゴシック", Font.PLAIN, 24));
		//テキストの位置を、水平方向の中心にする
		label.setHorizontalAlignment(JLabel.CENTER);
		//テキストの位置を、垂直方向の中心にする
		label.setVerticalAlignment(JLabel.CENTER);
		//ヘッダーパネルにテキストを追加
		headerPanel.add(label);
		//ウィンドウにヘッダーパネルを追加
		frame.add(headerPanel, BorderLayout.NORTH);
		
		//コンテンツパネルを作成
		JPanel contentsPanel = makePanel(Color.WHITE);
		//ウィンドウにコンテンツパネルを追加
		frame.add(contentsPanel, BorderLayout.CENTER);
		
		//フッターパネルを作成
		JPanel footerPanel = makePanel(Color.BLACK, 640, 50);
		//ウィンドウにフッターパネルを追加
		frame.add(footerPanel, BorderLayout.SOUTH);
		
		//ウィンドウを表示する
		frame.setVisible(true);
	}
	
	//パネルを作るメソッド(幅と高さを指定する用)
	static JPanel makePanel(Color color, int width, int height) {
		//JPanelクラスをインスタンス化
		JPanel panel = new JPanel();
		//パネルの色を変更する
		panel.setBackground(color);
		//パネルのサイズを「width、height」に設定
		panel.setPreferredSize(new Dimension(width, height));
		//作ったパネルを返す
		return panel;
	}
	
	//パネルを作るメソッド(幅と高さを指定しない用)
	static JPanel makePanel(Color color) {
		//JPanelクラスをインスタンス化
		JPanel panel = new JPanel();
		//パネルの色を変更する
		panel.setBackground(color);
		//作ったパネルを返す
		return panel;
	}

}

実行すると、次のようになります。

さて、これでテキストを表示することができました。
しかし、テキストを表示したいのは、ここだけではありません。

なので、テキストをかんたんに作るためのメソッドを作って、ほかのところからも呼び出せるようにします。

package com.original_game.janken;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Main {

	public static void main(String[] args) {
		//JFrameクラスをインスタンス化
		JFrame frame = new JFrame("じゃんけんゲーム");
		//ウィンドウのサイズを指定
		frame.setSize(640, 480);
		//ウィンドウの位置を、画面の中心へ
		frame.setLocationRelativeTo(null);
		//×でアプリが終了するようにする
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		//ウィンドウのサイズを変更できないようにする
		frame.setResizable(false);
		
		//ヘッダーパネルを作成
		JPanel headerPanel = makePanel(Color.BLACK, 640, 50);
		//ヘッダーパネルに、レイアウトマネージャとしてBorderLayoutを指定
		headerPanel.setLayout(new BorderLayout());
		//テキストを作成
		JLabel headerLabel = makeText("「さあ、じゃんけんで勝負だ!」", 24, Color.WHITE);
		//ヘッダーパネルにテキストを追加
		headerPanel.add(headerLabel);
		//ウィンドウにヘッダーパネルを追加
		frame.add(headerPanel, BorderLayout.NORTH);
		
		//コンテンツパネルを作成
		JPanel contentsPanel = makePanel(Color.WHITE);
		//ウィンドウにコンテンツパネルを追加
		frame.add(contentsPanel, BorderLayout.CENTER);
		
		//フッターパネルを作成
		JPanel footerPanel = makePanel(Color.BLACK, 640, 50);
		//ウィンドウにフッターパネルを追加
		frame.add(footerPanel, BorderLayout.SOUTH);
		
		//ウィンドウを表示する
		frame.setVisible(true);
	}
	
	//パネルを作るメソッド(幅と高さを指定する用)
	static JPanel makePanel(Color color, int width, int height) {
		//JPanelクラスをインスタンス化
		JPanel panel = new JPanel();
		//パネルの色を変更する
		panel.setBackground(color);
		//パネルのサイズを「width、height」に設定
		panel.setPreferredSize(new Dimension(width, height));
		//作ったパネルを返す
		return panel;
	}
	
	//パネルを作るメソッド(幅と高さを指定しない用)
	static JPanel makePanel(Color color) {
		//JPanelクラスをインスタンス化
		JPanel panel = new JPanel();
		//パネルの色を変更する
		panel.setBackground(color);
		//作ったパネルを返す
		return panel;
	}
	
	//テキストを作るメソッド
	static JLabel makeText(String str, int size, Color color) {
		//JLabelクラスをインスタンス化
		JLabel label = new JLabel(str);
		//テキストの文字を白にする
		label.setForeground(color);
		//テキストのフォントを設定
		label.setFont(new Font("MS ゴシック", Font.PLAIN, size));
		//テキストの位置を、水平方向の中心にする
		label.setHorizontalAlignment(JLabel.CENTER);
		//テキストの位置を、垂直方向の中心にする
		label.setVerticalAlignment(JLabel.CENTER);
		//作ったテキストを返す
		return label;
	}

}

これで、どこからでもかんたんにテキストを作ることができるようになりました。
まだ、実行結果はさきほどと変わりません。

では、いま作ったメソッドを使って、コンテンツパネルに「じゃんけん……」と表示させてみます。

package com.original_game.janken;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Main {

	public static void main(String[] args) {
		//JFrameクラスをインスタンス化
		JFrame frame = new JFrame("じゃんけんゲーム");
		//ウィンドウのサイズを指定
		frame.setSize(640, 480);
		//ウィンドウの位置を、画面の中心へ
		frame.setLocationRelativeTo(null);
		//×でアプリが終了するようにする
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		//ウィンドウのサイズを変更できないようにする
		frame.setResizable(false);
		
		//ヘッダーパネルを作成
		JPanel headerPanel = makePanel(Color.BLACK, 640, 50);
		//ヘッダーパネルに、レイアウトマネージャとしてBorderLayoutを指定
		headerPanel.setLayout(new BorderLayout());
		//テキストを作成
		JLabel headerLabel = makeText("「さあ、じゃんけんで勝負だ!」", 24, Color.WHITE);
		//ヘッダーパネルにテキストを追加
		headerPanel.add(headerLabel);
		//ウィンドウにヘッダーパネルを追加
		frame.add(headerPanel, BorderLayout.NORTH);
		
		//コンテンツパネルを作成
		JPanel contentsPanel = makePanel(Color.WHITE);
		//コンテンツパネルに、レイアウトマネージャとしてBorderLayoutを指定
		contentsPanel.setLayout(new BorderLayout());
		//テキストを作成
		JLabel contentsLabel = makeText("じゃんけん……", 54, Color.BLACK);
		//コンテンツパネルにテキストを追加
		contentsPanel.add(contentsLabel);
		//ウィンドウにコンテンツパネルを追加
		frame.add(contentsPanel, BorderLayout.CENTER);
		
		//フッターパネルを作成
		JPanel footerPanel = makePanel(Color.BLACK, 640, 50);
		//ウィンドウにフッターパネルを追加
		frame.add(footerPanel, BorderLayout.SOUTH);
		
		//ウィンドウを表示する
		frame.setVisible(true);
	}
	
	//パネルを作るメソッド(幅と高さを指定する用)
	static JPanel makePanel(Color color, int width, int height) {
		//JPanelクラスをインスタンス化
		JPanel panel = new JPanel();
		//パネルの色を変更する
		panel.setBackground(color);
		//パネルのサイズを「width、height」に設定
		panel.setPreferredSize(new Dimension(width, height));
		//作ったパネルを返す
		return panel;
	}
	
	//パネルを作るメソッド(幅と高さを指定しない用)
	static JPanel makePanel(Color color) {
		//JPanelクラスをインスタンス化
		JPanel panel = new JPanel();
		//パネルの色を変更する
		panel.setBackground(color);
		//作ったパネルを返す
		return panel;
	}
	
	//テキストを作るメソッド
	static JLabel makeText(String str, int size, Color color) {
		//JLabelクラスをインスタンス化
		JLabel label = new JLabel(str);
		//テキストの文字を白にする
		label.setForeground(color);
		//テキストのフォントを設定
		label.setFont(new Font("MS ゴシック", Font.PLAIN, size));
		//テキストの位置を、水平方向の中心にする
		label.setHorizontalAlignment(JLabel.CENTER);
		//テキストの位置を、垂直方向の中心にする
		label.setVerticalAlignment(JLabel.CENTER);
		//作ったテキストを返す
		return label;
	}

}

実行すると、次のようになります。

ボタンの表示

つづいて、フッターパネルに、グー、チョキ、パー、のボタンを表示していきたいと思います。

package com.original_game.janken;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Main {
	//じゃんけんの手の配列を作る
	private static String[] hands = {"グー", "チョキ", "パー"};

	public static void main(String[] args) {
		//JFrameクラスをインスタンス化
		JFrame frame = new JFrame("じゃんけんゲーム");
		//ウィンドウのサイズを指定
		frame.setSize(640, 480);
		//ウィンドウの位置を、画面の中心へ
		frame.setLocationRelativeTo(null);
		//×でアプリが終了するようにする
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		//ウィンドウのサイズを変更できないようにする
		frame.setResizable(false);
		
		//ヘッダーパネルを作成
		JPanel headerPanel = makePanel(Color.BLACK, 640, 50);
		//ヘッダーパネルに、レイアウトマネージャとしてBorderLayoutを指定
		headerPanel.setLayout(new BorderLayout());
		//テキストを作成
		JLabel headerLabel = makeText("「さあ、じゃんけんで勝負だ!」", 24, Color.WHITE);
		//ヘッダーパネルにテキストを追加
		headerPanel.add(headerLabel);
		//ウィンドウにヘッダーパネルを追加
		frame.add(headerPanel, BorderLayout.NORTH);
		
		//コンテンツパネルを作成
		JPanel contentsPanel = makePanel(Color.WHITE);
		//コンテンツパネルに、レイアウトマネージャとしてBorderLayoutを指定
		contentsPanel.setLayout(new BorderLayout());
		//テキストを作成
		JLabel contentsLabel = makeText("じゃんけん……", 54, Color.BLACK);
		//コンテンツパネルにテキストを追加
		contentsPanel.add(contentsLabel);
		//ウィンドウにコンテンツパネルを追加
		frame.add(contentsPanel, BorderLayout.CENTER);
		
		//フッターパネルを作成
		JPanel footerPanel = makePanel(Color.BLACK, 640, 50);
		//フッターパネルに、レイアウトマネージャとしてGridLayoutを指定
		footerPanel.setLayout(new GridLayout());

		//じゃんけんの手のボタンを作る
		for (String hand : hands) {
			//JButtonクラスをインスタンス化
			JButton button = new JButton(hand);
			//ボタンのフォントを設定
			button.setFont(new Font("MS ゴシック", Font.PLAIN, 24));
			//グーボタンをフッターパネルに追加
			footerPanel.add(button);
		}
		
		//ウィンドウにフッターパネルを追加
		frame.add(footerPanel, BorderLayout.SOUTH);
		
		//ウィンドウを表示する
		frame.setVisible(true);
	}
	
	//パネルを作るメソッド(幅と高さを指定する用)
	static JPanel makePanel(Color color, int width, int height) {
		//JPanelクラスをインスタンス化
		JPanel panel = new JPanel();
		//パネルの色を変更する
		panel.setBackground(color);
		//パネルのサイズを「width、height」に設定
		panel.setPreferredSize(new Dimension(width, height));
		//作ったパネルを返す
		return panel;
	}
	
	//パネルを作るメソッド(幅と高さを指定しない用)
	static JPanel makePanel(Color color) {
		//JPanelクラスをインスタンス化
		JPanel panel = new JPanel();
		//パネルの色を変更する
		panel.setBackground(color);
		//作ったパネルを返す
		return panel;
	}
	
	//テキストを作るメソッド
	static JLabel makeText(String str, int size, Color color) {
		//JLabelクラスをインスタンス化
		JLabel label = new JLabel(str);
		//テキストの文字を白にする
		label.setForeground(color);
		//テキストのフォントを設定
		label.setFont(new Font("MS ゴシック", Font.PLAIN, size));
		//テキストの位置を、水平方向の中心にする
		label.setHorizontalAlignment(JLabel.CENTER);
		//テキストの位置を、垂直方向の中心にする
		label.setVerticalAlignment(JLabel.CENTER);
		//作ったテキストを返す
		return label;
	}

}

16行目で、じゃんけんの手の配列を作り、57〜65行目で、すべての手のボタンを表示しています。

これで、このようにボタンが表示されます。

新しくクラスを作り、ソースを分かりやすくする

だんだんとソースコードが長くなってきたので、ここでクラスを作って、クラスごとにファイルを分けてみたいと思います。

画面上部から、「ファイル(File)」→「新規(New)」→「クラス(Class)」と選択します。

下の画像のように入力します。

今回は名前(Name)を、「PanelMaker」としました。
また、下の方のチェックは何も入れません。

「完了(Finish)」をクリックして、クラスを作成します。
すると以下のようなファイルが作られます。

PanelMaker.java

package com.original_game.janken;

public class PanelMaker {

}

さらに、Main.javaのパネル関係のメソッドを、PanelMaker.javaにコピペします。

PanelMaker.java

package com.original_game.janken;

import java.awt.Color;
import java.awt.Dimension;

import javax.swing.JPanel;

public class PanelMaker {
	
	//パネルを作るメソッド(幅と高さを指定する用)
	static JPanel makePanel(Color color, int width, int height) {
		//JPanelクラスをインスタンス化
		JPanel panel = new JPanel();
		//パネルの色を変更する
		panel.setBackground(color);
		//パネルのサイズを「width、height」に設定
		panel.setPreferredSize(new Dimension(width, height));
		//作ったパネルを返す
		return panel;
	}
	
	//パネルを作るメソッド(幅と高さを指定しない用)
	static JPanel makePanel(Color color) {
		//JPanelクラスをインスタンス化
		JPanel panel = new JPanel();
		//パネルの色を変更する
		panel.setBackground(color);
		//作ったパネルを返す
		return panel;
	}

}

Main.javaの方の、コピペしたメソッドは削除し、30, 41, 52行目のように、メソッドをPanelMakerクラスから呼び出すように変更します。

Main.java

package com.original_game.janken;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Main {
	//じゃんけんの手の配列を作る
	private static String[] hands = {"グー", "チョキ", "パー"};

	public static void main(String[] args) {
		//JFrameクラスをインスタンス化
		JFrame frame = new JFrame("じゃんけんゲーム");
		//ウィンドウのサイズを指定
		frame.setSize(640, 480);
		//ウィンドウの位置を、画面の中心へ
		frame.setLocationRelativeTo(null);
		//×でアプリが終了するようにする
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		//ウィンドウのサイズを変更できないようにする
		frame.setResizable(false);
		
		//ヘッダーパネルを作成
		JPanel headerPanel = PanelMaker.makePanel(Color.BLACK, 640, 50);
		//ヘッダーパネルに、レイアウトマネージャとしてBorderLayoutを指定
		headerPanel.setLayout(new BorderLayout());
		//テキストを作成
		JLabel headerLabel = makeText("「さあ、じゃんけんで勝負だ!」", 24, Color.WHITE);
		//ヘッダーパネルにテキストを追加
		headerPanel.add(headerLabel);
		//ウィンドウにヘッダーパネルを追加
		frame.add(headerPanel, BorderLayout.NORTH);
		
		//コンテンツパネルを作成
		JPanel contentsPanel = PanelMaker.makePanel(Color.WHITE);
		//コンテンツパネルに、レイアウトマネージャとしてBorderLayoutを指定
		contentsPanel.setLayout(new BorderLayout());
		//テキストを作成
		JLabel contentsLabel = makeText("じゃんけん……", 54, Color.BLACK);
		//コンテンツパネルにテキストを追加
		contentsPanel.add(contentsLabel);
		//ウィンドウにコンテンツパネルを追加
		frame.add(contentsPanel, BorderLayout.CENTER);
		
		//フッターパネルを作成
		JPanel footerPanel = PanelMaker.makePanel(Color.BLACK, 640, 50);
		//フッターパネルに、レイアウトマネージャとしてGridLayoutを指定
		footerPanel.setLayout(new GridLayout());

		//じゃんけんの手のボタンを作る
		for (String hand : hands) {
			//JButtonクラスをインスタンス化
			JButton button = new JButton(hand);
			//ボタンのフォントを設定
			button.setFont(new Font("MS ゴシック", Font.PLAIN, 24));
			//グーボタンをフッターパネルに追加
			footerPanel.add(button);
		}
		
		//ウィンドウにフッターパネルを追加
		frame.add(footerPanel, BorderLayout.SOUTH);
		
		//ウィンドウを表示する
		frame.setVisible(true);
	}
	
	//テキストを作るメソッド
	static JLabel makeText(String str, int size, Color color) {
		//JLabelクラスをインスタンス化
		JLabel label = new JLabel(str);
		//テキストの文字を白にする
		label.setForeground(color);
		//テキストのフォントを設定
		label.setFont(new Font("MS ゴシック", Font.PLAIN, size));
		//テキストの位置を、水平方向の中心にする
		label.setHorizontalAlignment(JLabel.CENTER);
		//テキストの位置を、垂直方向の中心にする
		label.setVerticalAlignment(JLabel.CENTER);
		//作ったテキストを返す
		return label;
	}

}

同じように、TextMakerというクラスを作って、そこにmakeTextメソッドを移動させます。

TextMaker.java

package com.original_game.janken;

import java.awt.Color;
import java.awt.Font;

import javax.swing.JLabel;

public class TextMaker {
	
	//テキストを作るメソッド
	static JLabel makeText(String str, int size, Color color) {
		//JLabelクラスをインスタンス化
		JLabel label = new JLabel(str);
		//テキストの文字を白にする
		label.setForeground(color);
		//テキストのフォントを設定
		label.setFont(new Font("MS ゴシック", Font.PLAIN, size));
		//テキストの位置を、水平方向の中心にする
		label.setHorizontalAlignment(JLabel.CENTER);
		//テキストの位置を、垂直方向の中心にする
		label.setVerticalAlignment(JLabel.CENTER);
		//作ったテキストを返す
		return label;
	}

}

Main.javaの方の、makeTextメソッドは削除し、34, 45行目のように、メソッドをクラスから呼び出すように変更します。

Main.java

package com.original_game.janken;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Main {
	//じゃんけんの手の配列を作る
	private static String[] hands = {"グー", "チョキ", "パー"};

	public static void main(String[] args) {
		//JFrameクラスをインスタンス化
		JFrame frame = new JFrame("じゃんけんゲーム");
		//ウィンドウのサイズを指定
		frame.setSize(640, 480);
		//ウィンドウの位置を、画面の中心へ
		frame.setLocationRelativeTo(null);
		//×でアプリが終了するようにする
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		//ウィンドウのサイズを変更できないようにする
		frame.setResizable(false);
		
		//ヘッダーパネルを作成
		JPanel headerPanel = PanelMaker.makePanel(Color.BLACK, 640, 50);
		//ヘッダーパネルに、レイアウトマネージャとしてBorderLayoutを指定
		headerPanel.setLayout(new BorderLayout());
		//テキストを作成
		JLabel headerLabel = TextMaker.makeText("「さあ、じゃんけんで勝負だ!」", 24, Color.WHITE);
		//ヘッダーパネルにテキストを追加
		headerPanel.add(headerLabel);
		//ウィンドウにヘッダーパネルを追加
		frame.add(headerPanel, BorderLayout.NORTH);
		
		//コンテンツパネルを作成
		JPanel contentsPanel = PanelMaker.makePanel(Color.WHITE);
		//コンテンツパネルに、レイアウトマネージャとしてBorderLayoutを指定
		contentsPanel.setLayout(new BorderLayout());
		//テキストを作成
		JLabel contentsLabel = TextMaker.makeText("じゃんけん……", 54, Color.BLACK);
		//コンテンツパネルにテキストを追加
		contentsPanel.add(contentsLabel);
		//ウィンドウにコンテンツパネルを追加
		frame.add(contentsPanel, BorderLayout.CENTER);
		
		//フッターパネルを作成
		JPanel footerPanel = PanelMaker.makePanel(Color.BLACK, 640, 50);
		//フッターパネルに、レイアウトマネージャとしてGridLayoutを指定
		footerPanel.setLayout(new GridLayout());

		//じゃんけんの手のボタンを作る
		for (String hand : hands) {
			//JButtonクラスをインスタンス化
			JButton button = new JButton(hand);
			//ボタンのフォントを設定
			button.setFont(new Font("MS ゴシック", Font.PLAIN, 24));
			//グーボタンをフッターパネルに追加
			footerPanel.add(button);
		}
		
		//ウィンドウにフッターパネルを追加
		frame.add(footerPanel, BorderLayout.SOUTH);
		
		//ウィンドウを表示する
		frame.setVisible(true);
	}

}

これで、ファイルが分割され、分かりやすくなりました。

ボタンを押したときの操作を反映

つづいて、プレイヤーがボタンを押したときのプログラムを作っていきます。
ここでは、ボタンが押されたときに、どのボタンが押されたのかがコンソールに出力されるようにしてみましょう。

Main.java

package com.original_game.janken;

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.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Main {
	//じゃんけんの手の配列を作る
	private static String[] hands = {"グー", "チョキ", "パー"};

	public static void main(String[] args) {
		//JFrameクラスをインスタンス化
		JFrame frame = new JFrame("じゃんけんゲーム");
		//ウィンドウのサイズを指定
		frame.setSize(640, 480);
		//ウィンドウの位置を、画面の中心へ
		frame.setLocationRelativeTo(null);
		//×でアプリが終了するようにする
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		//ウィンドウのサイズを変更できないようにする
		frame.setResizable(false);
		
		//ヘッダーパネルを作成
		JPanel headerPanel = PanelMaker.makePanel(Color.BLACK, 640, 50);
		//ヘッダーパネルに、レイアウトマネージャとしてBorderLayoutを指定
		headerPanel.setLayout(new BorderLayout());
		//テキストを作成
		JLabel headerLabel = TextMaker.makeText("「さあ、じゃんけんで勝負だ!」", 24, Color.WHITE);
		//ヘッダーパネルにテキストを追加
		headerPanel.add(headerLabel);
		//ウィンドウにヘッダーパネルを追加
		frame.add(headerPanel, BorderLayout.NORTH);
		
		//コンテンツパネルを作成
		JPanel contentsPanel = PanelMaker.makePanel(Color.WHITE);
		//コンテンツパネルに、レイアウトマネージャとしてBorderLayoutを指定
		contentsPanel.setLayout(new BorderLayout());
		//テキストを作成
		JLabel contentsLabel = TextMaker.makeText("じゃんけん……", 54, Color.BLACK);
		//コンテンツパネルにテキストを追加
		contentsPanel.add(contentsLabel);
		//ウィンドウにコンテンツパネルを追加
		frame.add(contentsPanel, BorderLayout.CENTER);
		
		//フッターパネルを作成
		JPanel footerPanel = PanelMaker.makePanel(Color.BLACK, 640, 50);
		//フッターパネルに、レイアウトマネージャとしてGridLayoutを指定
		footerPanel.setLayout(new GridLayout());

		//じゃんけんの手のボタンを作る
		for (String hand : hands) {
			//JButtonクラスをインスタンス化
			JButton button = new JButton(hand);
			//ボタンのフォントを設定
			button.setFont(new Font("MS ゴシック", Font.PLAIN, 24));
			//ボタンが押されたら、ButtonActionListenerクラスのactionPerformedメソッドを実行
			button.addActionListener(new ButtonActionListener());
			//グーボタンをフッターパネルに追加
			footerPanel.add(button);
		}
		
		//ウィンドウにフッターパネルを追加
		frame.add(footerPanel, BorderLayout.SOUTH);
		
		//ウィンドウを表示する
		frame.setVisible(true);
	}
	
	//ボタンが押されたときのためのクラス
	static class ButtonActionListener implements ActionListener {
		//ボタンが押されたときに呼ばれるメソッド
		public void actionPerformed(ActionEvent e) {
			//押されたボタンを、コンソールに表示
			System.out.println(e.getActionCommand());
		}

	}

}

ボタンを押したときなど、なんらかの操作によってなにかを実行したいときは、addActionListener()を使います。(65行目)

ButtonActionListenerクラスは、ボタンが押されたときにどうしたいのか、などを書いていくために作ったクラスです。
ただ今回は、Mainクラスのなかにそのクラスを作りました。
これは、ButtonActionListenerを別ファイルにしてしまうと、使いたいフィールドをうまく使えなかったりするからです。

これを実行し、グー、チョキ、パー、それぞれのボタンをクリックすると、押したボタンがコンソールに表示されます。

グー
チョキ
グー
パー

コンピュータの手をランダムで決定する

つづいて、コンピュータ側が出す手をランダムで決定できるようにしていきましょう。
まず、あたらしくComputerHandというクラスを作ります。

ComputerHandクラスには、ランダムなコンピュータの手を取得するメソッドを作ります。

ComputerHand.java

package com.original_game.janken;

import java.util.Random;

public class ComputerHand {
	//コンピュータの手を取得するためのメソッド
	static int getComputerHand() {
		//Randomクラスをインスタンス化
		Random random = new Random();
		//handに0〜2のどれかの数値を代入
		int hand = random.nextInt(3);
		//handの値を返す
		return hand;
	}

}

Main.java

package com.original_game.janken;

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.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Main {
	//じゃんけんの手の配列を作る
	private static String[] hands = {"グー", "チョキ", "パー"};

	static JLabel contentsLabel;

	public static void main(String[] args) {
		//JFrameクラスをインスタンス化
		JFrame frame = new JFrame("じゃんけんゲーム");
		//ウィンドウのサイズを指定
		frame.setSize(640, 480);
		//ウィンドウの位置を、画面の中心へ
		frame.setLocationRelativeTo(null);
		//×でアプリが終了するようにする
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		//ウィンドウのサイズを変更できないようにする
		frame.setResizable(false);
		
		//ヘッダーパネルを作成
		JPanel headerPanel = PanelMaker.makePanel(Color.BLACK, 640, 50);
		//ヘッダーパネルに、レイアウトマネージャとしてBorderLayoutを指定
		headerPanel.setLayout(new BorderLayout());
		//テキストを作成
		JLabel headerLabel = TextMaker.makeText("「さあ、じゃんけんで勝負だ!」", 24, Color.WHITE);
		//ヘッダーパネルにテキストを追加
		headerPanel.add(headerLabel);
		//ウィンドウにヘッダーパネルを追加
		frame.add(headerPanel, BorderLayout.NORTH);
		
		//コンテンツパネルを作成
		JPanel contentsPanel = PanelMaker.makePanel(Color.WHITE);
		//コンテンツパネルに、レイアウトマネージャとしてBorderLayoutを指定
		contentsPanel.setLayout(new BorderLayout());
		//テキストを作成
		contentsLabel = TextMaker.makeText("じゃんけん……", 54, Color.BLACK);
		//コンテンツパネルにテキストを追加
		contentsPanel.add(contentsLabel);
		//ウィンドウにコンテンツパネルを追加
		frame.add(contentsPanel, BorderLayout.CENTER);
		
		//フッターパネルを作成
		JPanel footerPanel = PanelMaker.makePanel(Color.BLACK, 640, 50);
		//フッターパネルに、レイアウトマネージャとしてGridLayoutを指定
		footerPanel.setLayout(new GridLayout());

		//じゃんけんの手のボタンを作る
		for (String hand : hands) {
			//JButtonクラスをインスタンス化
			JButton button = new JButton(hand);
			//ボタンのフォントを設定
			button.setFont(new Font("MS ゴシック", Font.PLAIN, 24));
			//ボタンが押されたら、ButtonActionListenerクラスのactionPerformedメソッドを実行
			button.addActionListener(new ButtonActionListener());
			//グーボタンをフッターパネルに追加
			footerPanel.add(button);
		}
		
		//ウィンドウにフッターパネルを追加
		frame.add(footerPanel, BorderLayout.SOUTH);
		
		//ウィンドウを表示する
		frame.setVisible(true);
	}
	
	//ボタンが押されたときのためのクラス
	static class ButtonActionListener implements ActionListener {
		//ボタンが押されたときに呼ばれるメソッド
		public void actionPerformed(ActionEvent e) {
			//コンピュータの手(数値)をランダムに取得
			int computerHandNum = ComputerHand.getComputerHand();
			//数値からコンピュータの手を取り出して代入
			String computerHand = hands[computerHandNum];
			//コンテンツパネルのテキストに、コンピュータの手を指定
			contentsLabel.setText(computerHand);
		}

	}

}

これで、ボタンを押すと同時に、ランダムでコンピュータの手が画面に表示されるようになりました。

ゲームの勝敗

最後にゲームの勝敗をつくっていきたいと思います。
あたらしくJudgeクラスを作成します。

画面上部から、「ファイル(File)」→「新規(New)」→「クラス(Class)」と選択し、「Judge」という名前で、クラスを作ります。

Judgeクラスには、じゃんけんの結果のテキストを取得するためのメソッドを作ります。

Judge.java

package com.original_game.janken;

public class Judge {
	//じゃんけんの結果のテキストを取得するメソッド
	static String getResultText(int playerHand, int computerHand) {
		//じゃんけんの結果のテキストを代入する変数を初期化
		String resultText = "";
		//じゃんけんの結果を出すための計算
		int result = (playerHand - computerHand + 3) % 3;
		//あいこのとき
		if (result == 0) {
			resultText = "あいこかよ!";
		}
		//プレイヤーの負けのとき
		else if (result == 1) {
			resultText = "お前の負けかよ!";
		}
		//プレイヤーが勝ちのとき
		else if (result == 2) {
			resultText = "お前の勝ちかよ!";
		}
		//結果のテキストを返す
		return resultText;
	}

}

Main.java

package com.original_game.janken;

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.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Main {
	//じゃんけんの手の配列を作る
	private static String[] hands = {"グー", "チョキ", "パー"};

	static JLabel contentsLabel;
	static JLabel headerLabel;

	public static void main(String[] args) {
		//JFrameクラスをインスタンス化
		JFrame frame = new JFrame("じゃんけんゲーム");
		//ウィンドウのサイズを指定
		frame.setSize(640, 480);
		//ウィンドウの位置を、画面の中心へ
		frame.setLocationRelativeTo(null);
		//×でアプリが終了するようにする
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		//ウィンドウのサイズを変更できないようにする
		frame.setResizable(false);
		
		//ヘッダーパネルを作成
		JPanel headerPanel = PanelMaker.makePanel(Color.BLACK, 640, 50);
		//ヘッダーパネルに、レイアウトマネージャとしてBorderLayoutを指定
		headerPanel.setLayout(new BorderLayout());
		//テキストを作成
		headerLabel = TextMaker.makeText("「さあ、じゃんけんで勝負だ!」", 24, Color.WHITE);
		//ヘッダーパネルにテキストを追加
		headerPanel.add(headerLabel);
		//ウィンドウにヘッダーパネルを追加
		frame.add(headerPanel, BorderLayout.NORTH);
		
		//コンテンツパネルを作成
		JPanel contentsPanel = PanelMaker.makePanel(Color.WHITE);
		//コンテンツパネルに、レイアウトマネージャとしてBorderLayoutを指定
		contentsPanel.setLayout(new BorderLayout());
		//テキストを作成
		contentsLabel = TextMaker.makeText("じゃんけん……", 54, Color.BLACK);
		//コンテンツパネルにテキストを追加
		contentsPanel.add(contentsLabel);
		//ウィンドウにコンテンツパネルを追加
		frame.add(contentsPanel, BorderLayout.CENTER);
		
		//フッターパネルを作成
		JPanel footerPanel = PanelMaker.makePanel(Color.BLACK, 640, 50);
		//フッターパネルに、レイアウトマネージャとしてGridLayoutを指定
		footerPanel.setLayout(new GridLayout());

		//じゃんけんの手のボタンを作る
		for (String hand : hands) {
			//JButtonクラスをインスタンス化
			JButton button = new JButton(hand);
			//ボタンのフォントを設定
			button.setFont(new Font("MS ゴシック", Font.PLAIN, 24));
			//ボタンが押されたら、ButtonActionListenerクラスのactionPerformedメソッドを実行
			button.addActionListener(new ButtonActionListener());
			//グーボタンをフッターパネルに追加
			footerPanel.add(button);
		}
		
		//ウィンドウにフッターパネルを追加
		frame.add(footerPanel, BorderLayout.SOUTH);
		
		//ウィンドウを表示する
		frame.setVisible(true);
	}
	
	//ボタンが押されたときのためのクラス
	static class ButtonActionListener implements ActionListener {
		//ボタンが押されたときに呼ばれるメソッド
		public void actionPerformed(ActionEvent e) {
			//コンピュータの手(数値)をランダムに取得
			int computerHandNum = ComputerHand.getComputerHand();
			//数値からコンピュータの手を取り出して代入
			String computerHand = hands[computerHandNum];
			//コンテンツパネルのテキストに、コンピュータの手を指定
			contentsLabel.setText(computerHand);
			//プレイヤーが出した手に対応した数値を入れるための変数
			int playerHandNum=0;
			//プレイヤーが出した手の数値を探してplayerHandNumに入れる
			for (int i=0; i<hands.length; i++) {
				if (hands[i] == e.getActionCommand()) {
					playerHandNum=i;
					break;
				}
			}
			//プレイヤーとコンピュータの手を比べて、結果のセリフを取得
			String serif = Judge.getResultText(playerHandNum, computerHandNum);
			//ヘッダーにセリフを表示
			headerLabel.setText(serif);
		}

	}

}

これで、ヘッダーにゲームの結果が表示されるようになりました。

これで、じゃんけんゲームの完成です。

完成した全体のコード

では最後に、完成した全体のコードを載せておきます。
もし最終的にうまく動作しない場合は、こちらを見て参考にしてください。

Main.java

package com.original_game.janken2;

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.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Main {
	//じゃんけんの手の配列を作る
	private static String[] hands = {"グー", "チョキ", "パー"};
	
	static JLabel contentsLabel;
	static JLabel headerLabel;

	public static void main(String[] args) {
		//JFrameクラスをインスタンス化
		JFrame frame = new JFrame("じゃんけんゲーム");
		//ウィンドウのサイズを指定
		frame.setSize(640, 480);
		//ウィンドウの位置を、画面の中心へ
		frame.setLocationRelativeTo(null);
		//×でアプリが終了するようにする
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		//ウィンドウのサイズを変更できないようにする
		frame.setResizable(false);
		
		//ヘッダーパネルを作成
		JPanel headerPanel = PanelMaker.makePanel(Color.BLACK, 640, 50);
		//ヘッダーパネルに、レイアウトマネージャとしてBorderLayoutを指定
		headerPanel.setLayout(new BorderLayout());
		//テキストを作成
		headerLabel = TextMaker.makeText("「さあ、じゃんけんで勝負だ!」", 24, Color.WHITE);
		//ヘッダーパネルにテキストを追加
		headerPanel.add(headerLabel);
		//ウィンドウにヘッダーパネルを追加
		frame.add(headerPanel, BorderLayout.NORTH);
		
		//コンテンツパネルを作成
		JPanel contentsPanel = PanelMaker.makePanel(Color.WHITE);
		//コンテンツパネルに、レイアウトマネージャとしてBorderLayoutを指定
		contentsPanel.setLayout(new BorderLayout());
		//テキストを作成
		contentsLabel = TextMaker.makeText("じゃんけん……", 54, Color.BLACK);
		//コンテンツパネルにテキストを追加
		contentsPanel.add(contentsLabel);
		//ウィンドウにコンテンツパネルを追加
		frame.add(contentsPanel, BorderLayout.CENTER);
		
		//フッターパネルを作成
		JPanel footerPanel = PanelMaker.makePanel(Color.BLACK, 640, 50);
		//フッターパネルに、レイアウトマネージャとしてGridLayoutを指定
		footerPanel.setLayout(new GridLayout());

		//じゃんけんの手のボタンを作る
		for (String hand : hands) {
			//JButtonクラスをインスタンス化
			JButton button = new JButton(hand);
			//ボタンのフォントを設定
			button.setFont(new Font("MS ゴシック", Font.PLAIN, 24));
			//ボタンが押されたら、ButtonActionListenerクラスのactionPerformedメソッドを実行
			button.addActionListener(new ButtonActionListener());
			//グーボタンをフッターパネルに追加
			footerPanel.add(button);
		}
		
		//ウィンドウにフッターパネルを追加
		frame.add(footerPanel, BorderLayout.SOUTH);
		
		//ウィンドウを表示する
		frame.setVisible(true);
	}
	
	//ボタンが押されたときのためのクラス
	static class ButtonActionListener implements ActionListener {
		//ボタンが押されたときに呼ばれるメソッド
		public void actionPerformed(ActionEvent e) {
			//コンピュータの手(数値)をランダムに取得
			int computerHandNum = ComputerHand.getComputerHand();
			//数値からコンピュータの手を取り出して代入
			String computerHand = hands[computerHandNum];
			//コンテンツパネルのテキストに、コンピュータの手を指定
			contentsLabel.setText(computerHand);
			//プレイヤーが出した手に対応した数値を入れるための変数
			int playerHandNum=0;
			//プレイヤーが出した手の数値を探してplayerHandNumに入れる
			for (int i=0; i<hands.length; i++) {
				if (hands[i] == e.getActionCommand()) {
					playerHandNum=i;
					break;
				}
			}
			//プレイヤーとコンピュータの手を比べて、結果のセリフを取得
			String serif = Judge.getResultText(playerHandNum, computerHandNum);
			//ヘッダーにセリフを表示
			headerLabel.setText(serif);
		}

	}

}

TextMaker.java

package com.original_game.janken2;

import java.awt.Color;
import java.awt.Font;

import javax.swing.JLabel;

public class TextMaker {
	
	//テキストを作るメソッド
	static JLabel makeText(String str, int size, Color color) {
		//JLabelクラスをインスタンス化
		JLabel label = new JLabel(str);
		//テキストの文字を白にする
		label.setForeground(color);
		//テキストのフォントを設定
		label.setFont(new Font("MS ゴシック", Font.PLAIN, size));
		//テキストの位置を、水平方向の中心にする
		label.setHorizontalAlignment(JLabel.CENTER);
		//テキストの位置を、垂直方向の中心にする
		label.setVerticalAlignment(JLabel.CENTER);
		//作ったテキストを返す
		return label;
	}

}

PanelMaker.java

package com.original_game.janken2;

import java.awt.Color;
import java.awt.Dimension;

import javax.swing.JPanel;

public class PanelMaker {
	
	//パネルを作るメソッド(幅と高さを指定する用)
	static JPanel makePanel(Color color, int width, int height) {
		//JPanelクラスをインスタンス化
		JPanel panel = new JPanel();
		//パネルの色を変更する
		panel.setBackground(color);
		//パネルのサイズを「width、height」に設定
		panel.setPreferredSize(new Dimension(width, height));
		//作ったパネルを返す
		return panel;
	}
	
	//パネルを作るメソッド(幅と高さを指定しない用)
	static JPanel makePanel(Color color) {
		//JPanelクラスをインスタンス化
		JPanel panel = new JPanel();
		//パネルの色を変更する
		panel.setBackground(color);
		//作ったパネルを返す
		return panel;
	}

}

ComputerHand.java

package com.original_game.janken2;

import java.util.Random;

public class ComputerHand {
	//コンピュータの手を取得するためのメソッド
		static int getComputerHand() {
			//Randomクラスをインスタンス化
			Random random = new Random();
			//handに0〜2のどれかの数値を代入
			int hand = random.nextInt(3);
			//handの値を返す
			return hand;
		}

}

Judge.java

package com.original_game.janken2;

public class Judge {
	//じゃんけんの結果のテキストを取得するメソッド
	static String getResultText(int playerHand, int computerHand) {
		//じゃんけんの結果のテキストを代入する変数を初期化
		String resultText = "";
		//じゃんけんの結果を出すための計算
		int result = (playerHand - computerHand + 3) % 3;
		//あいこのとき
		if (result == 0) {
			resultText = "あいこかよ!";
		}
		//プレイヤーの負けのとき
		else if (result == 1) {
			resultText = "お前の負けかよ!";
		}
		//プレイヤーが勝ちのとき
		else if (result == 2) {
			resultText = "お前の勝ちかよ!";
		}
		//結果のテキストを返す
		return resultText;
	}

}

まとめ

今回は、Eclipseを使ったJavaでのじゃんけんゲームプログラムの作り方を紹介しました。

これを元に、もっと様々な機能を加えていくことで、より面白いじゃんけんゲームが作れると思います。
自分だけのじゃんけんゲームを、ぜひ作ってみて下さい。

スポンサードリンク

関連コンテンツ

オススメ記事

【絶対できる!】Unityでの2Dノベルゲームの作り方を詳しく解説

人魚との触れ合いを描いた小説、「ELENA 人魚と過ごした時間」のゲーム化を目指し、日々コツコツと開発を進めているのですが、もう少し時間がかかりそうです。 さて、そんなわけで、今回はUnity

【初心者向け】dotfilesの作り方。開発環境を一瞬で構築しよう!

Macを買い換えたとき、データを全削除した後などは、もういちど自分の開発環境を整える必要があります。しかし、その環境設定は、ちょっと大変な作業だったりします。 そんなとき、dotfilesとい

carousel

【Bootstrap 4】くるくる回転するUI、カルーセル機能のを実装方法!

Bootstrap4の使い方、第8回目です。 サイトをみていると、画像を横並びにしてくるくると回転するカルーセル機能を実装しているサイトがありますよね。 Bootstrap4には、カルーセルを

pipenvの使い方。MacにPython環境を構築する方法

みなさんこんにちは。@It_is_Rです。今回はpipenvを使って、MacにPython環境を構築する方法を紹介します。 pipenvとは pipenvは、Pythonでの開発

宇宙一分かりやすい JavaScript のかなり詳しい基本の解説。

宇宙一分かりやすい JavaScript のかなり詳しい基本の解説。

JavaScriptを使ってゲームを作成するのが好きです。@It_is_Rです。 JavaScriptはWebページに動きを出すのによく使われ、ブラウザゲームなども作ることができます。今回は

プログラミングのクラスってなぁに?

【JavaScript】クラスの概念をしっかりと理解しよう! 小学生からのプログラミング入門

小学生からのプログラミング講座《こうざ》、今回もはじめていきましょう! 前回はマップ上をキャラクターが自由に動くことができるようにしました。 今回はES6から使われるようになった「クラス

FC2 blog customize

FC2ブログ ”最強” カスタマイズ入門講座。背景を変更する。

三度の飯よりも好きなものが多すぎて比較にならない@It_is_Rです。 FC2ブログ"最強"カスタマイズ入門講座の続きですね。最強にカスタマイズしていきましょう。 今回は背景色の変更をメインに

WordPress|ショートコードの作り方&使い方。確実に使いこなす為のガイド。

前回、WordPressで、特定のカテゴリ一覧を表示する方法について書きました。 改めまして、@It_is_Rです。 特定のカテゴリ一覧を表示したとき、ショートコードというものを使いましたが、

wordpress

WordPress管理画面のテーマカスタマイザーに独自の項目を追加。

WordPressみたいに私自身の人生もカスタムできたらいいのに。@It_is_Rです。 WordPressのカスタマイズは、公開しているサイトだけではありません。管理画面をカスタマイズするこ

Eclipseのダウンロード(インストール)の方法

Eclipseは、統合開発環境(IDE)のひとつで、さまざまな言語での開発をしやすくするためのツールをひとまとめにしたものです。 今回はEclipseのダウンロード(インストール)の方法を紹介

8件のコメント “【絶対できる!】Javaでのじゃんけんゲームの作り方

  1. スタート画面とメニュー画面をはじめに作りたいのですが,どのようにすればよろしいでしょうか?

    1. >飲むシリカさん
      コメントありがとうございます。

      スタート画面やメニュー画面は、メインゲームの部分と同じように、Panelを使って作るのはいかがでしょうか。
      startPanelやmenuPanelといったパネルを作って、そこにJLabelJButtonなどを、add()を使って追加して、お好みでお作りください。

      もし、スタート画面、メニュー画面、メインゲームの画面の、切り替え方法が分からない、ということでしたら、CardLayoutというのを使ってみるのもいいかもしれません。

      パネルの切り替えのプログラムを作ってみました。

      import java.awt.BorderLayout;
      import java.awt.CardLayout;
      import java.awt.Color;
      import java.awt.event.ActionEvent;
      import java.awt.event.ActionListener;
      
      import javax.swing.JButton;
      import javax.swing.JFrame;
      import javax.swing.JPanel;
      
      public class Main extends JFrame implements ActionListener {
      
      	JPanel cardPanel;
      	CardLayout layout;
      	public static void main(String[] args) {
      		// TODO Auto-generated method stub
      		//ウィンドウの表示
      		Main frame = new Main();
      		frame.setTitle("じゃんけんゲーム");
      		frame.setSize(640, 480);
      		frame.setLocationRelativeTo(null);
      		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      		frame.setResizable(false);
      		frame.setVisible(true);
      	}
      	
      	Main() {
      		//スタート画面のパネルを作成
      		JPanel startPanel = new JPanel();
      		startPanel.setBackground(Color.RED);
      		//メインゲーム画面へ移動するためのボタンを作成
      		JButton startButton = new JButton("メインゲーム画面へ");
      		startButton.addActionListener(this);
      		startButton.setActionCommand("main");
      		//ボタンをパネルに追加
      		startPanel.add(startButton);
      		
      		//メインゲーム画面のパネルを作成
      		JPanel mainGamePanel = new JPanel();        
      		mainGamePanel.setBackground(Color.BLUE);
      		//スタート画面へ移動するためのボタンを作成
      		JButton mainGmaeButton = new JButton("スタート画面へ");
      		mainGmaeButton.addActionListener(this);
      		mainGmaeButton.setActionCommand("start");
      		//ボタンをパネルに追加
      		mainGamePanel.add(mainGmaeButton);
      		
      		//CardLayout
      		cardPanel = new JPanel();
      		layout = new CardLayout();
      		cardPanel.setLayout(layout);
      		cardPanel.add(startPanel, "start");
      		cardPanel.add(mainGamePanel, "main");
      		
      		getContentPane().add(cardPanel, BorderLayout.CENTER);
      	}
      	
      	public void actionPerformed(ActionEvent e) {
      		String command = e.getActionCommand();
      		layout.show(cardPanel, command);
      	}
      }
      

      参考になれば幸いです。

  2. こんにちは!!
    じゃんけんゲームの書き方についてとても参考になりました。
    勝ち負けあいこの時に、それぞれ違う音がなるようにしたいのですが、苦戦しています。。。
    良ければプログラムを教えていただけないでしょうか?

    1. >あああさん
      こんにちは。
      コメントありがとうございます。

      Javaで音声をならすのは難しいですよね。私も苦手なところです。

      勝ったとき(win.wav)、負けたとき(lose.wav)、あいこのとき(aiko.wav)、の三つの音声ファイルが、「sound」というフォルダに入っているとして、以下のようなプログラムではいかがでしょうか?

      この記事の完成のところから始めるとして、「VictoryOrDefeat.java」を次のように変更します。

      VictoryOrDefeat.java

      package com.original_game.janken;
      
      import java.io.File;
      
      public class VictoryOrDefeat {
      	private static int point = 0;
      	public static final void decisionVictoryOrDefeat(int computerHand,int playerHand) {
      		int playerHandTemp = playerHand;
      		playerHandTemp++;
      		
      		if (playerHand == computerHand) {
      			Sound.playSound(new File("sound/aiko.wav").getAbsoluteFile());	//追加
      			Panel.headerLabel.setText("あいこかよ!(" + point + ")");
      			
      		}
      		else if ((playerHand == 3 && computerHand == 1)||(playerHandTemp == computerHand)) {
      			Sound.playSound(new File("sound/win.wav").getAbsoluteFile());	//追加
      			point+=1;
      			Panel.headerLabel.setText("お前の勝ちかよ!(" + point + ")");
      		}			
      		else {
      			Sound.playSound(new File("sound/lose.wav").getAbsoluteFile());	//追加
      			point=0;
      			Panel.headerLabel.setText("お前の負けかよ!(" + point + ")");
      		}
      	}
      }
      

      上の例では、SoundクラスのplaySoundを呼び出すことで、音声を再生しています。

      しかし、まだSoundクラスがないので、「File」→「New」→「Class」から作ります。
      「Sound.java」は次のようにします。

      Sound.java

      package com.original_game.janken;
      
      import java.io.File;
      import java.io.IOException;
      
      import javax.sound.sampled.AudioInputStream;
      import javax.sound.sampled.AudioSystem;
      import javax.sound.sampled.Clip;
      import javax.sound.sampled.LineEvent;
      import javax.sound.sampled.LineUnavailableException;
      import javax.sound.sampled.UnsupportedAudioFileException;
      
      public class Sound {
      	public static void playSound(File path) {
      		try {
      			AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(path);
      			final Clip clip = AudioSystem.getClip();
      			clip.addLineListener(event -> {
      				if (event.getType() == LineEvent.Type.STOP) {
      					clip.close();
      					System.out.printf("音声の再生が終了しました\n");
      				}
      			});
      			clip.open(audioInputStream);
      			clip.start();
      			audioInputStream.close();
      		} catch (UnsupportedAudioFileException e) {
      			// TODO Auto-generated catch block
      			e.printStackTrace();
      		} catch (IOException e) {
      			// TODO Auto-generated catch block
      			e.printStackTrace();
      		} catch (LineUnavailableException e) {
      			// TODO Auto-generated catch block
      			e.printStackTrace();
      		}
      	}
      }
      

      これで、それぞれ違う音がなるようになると思います。
      お役に立てればうれしいです。

  3. こんにちは!
    Java初心者でこちらの記事を参考にじゃんけんゲームを作らせて頂き、しっかりと作ることが出来ました!
    自分で調べろと言われればそこまでなのですが、
    こちらのじゃんけんゲームに追加仕様で
    ①画面に勝敗数の表示
    ②終了ボタンの表示
    ③終了ボタンの押下時
     画面に勝敗数を表示する。
     画面にて勝敗数が多かった場合、「トータルであなたの勝ち!」と表示する。
     画面にて勝敗数が少なかった場合、「トータルであなたの負け!」と表示する。
     画面にて勝敗数がイーブンだった場合、「トータルで引き分け!」と表示する。

    こんな仕様を追加するとどのようなプログラミングになるでしょうか?
    良かったら教えて下さると嬉しいです。

    1. >aiさん
      こんにちは。コメントありがとうございます。

      ①画面に勝敗数の表示
      まず、勝敗数の表示は、画面のヘッダー部分に表示するとします。

      勝敗数は「win」、「lose」の2つの変数を使って管理します。
      「VictoryOrDefeat.java」で、勝った場合はwin変数に+1、負けた場合はlose変数に+1します。

      Panel.headerLabel.setText( win + "対" + lose );
      

      と、「decisionVictoryOrDefeat」メソッドの一番下に入力すれば、画面のヘッダー部分に「1対2」といったふうな勝敗数を表示することができます。
      また画面に大量の情報があると見にくいので、じゃんけん一回一回の勝敗はコメントアウトしました。

      変数名が少々変になってしまいますが、「playerHandが4の時」は「終了ボタンが押された時」(10行目)というふうに作ります。
      本来ならば変数名は作りたいプログラムに合わせて直すといいのですが、ここでは省略します。

      VictoryOrDefeat.java

      package com.original_game.janken;
       
      public class VictoryOrDefeat {
      	private static int win = 0;
      	private static int lose = 0;
      	public static final void decisionVictoryOrDefeat(int computerHand,int playerHand) {
      		int playerHandTemp = playerHand;
      		playerHandTemp++;
      		
      		if (playerHand == 4) {
      			String text;
      			if (win > lose) text = "あなたの勝ち!";
      			else if (win < lose) text = "あなたの負け!";
      			else text = "引き分け!";
      			
      			Panel.contentsLabel.setText("トータルで"+text);
      		}
      		else if (playerHand == computerHand) {
      			//Panel.headerLabel.setText("あいこかよ!(" + point + ")");
      		}
      		else if ((playerHand == 3 && computerHand == 1)||(playerHandTemp == computerHand)) {
      			win+=1;
      			//Panel.headerLabel.setText("お前の勝ちかよ!(" + point + ")");
      		}			
      		else {
      			lose+=1;
      			//Panel.headerLabel.setText("お前の負けかよ!(" + point + ")");
      		}
      		Panel.headerLabel.setText( win + "対" + lose );
      	}
      }
      

      ②終了ボタンの表示 & ③終了ボタンの押下時
      終了ボタンは、プレイヤーが操作する部分なので、「Player.java」に追加していこうと思います。

      終了ボタンを作り(29行目)、そのボタンが押されたら「playerHand」に4を代入します。(51行目)

      Player.java

      package com.original_game.janken;
       
      import java.awt.Dimension;
      import java.awt.Font;
      import java.awt.GridLayout;
      import java.awt.event.ActionEvent;
      import java.awt.event.ActionListener;
      
      import javax.swing.JButton;
      import javax.swing.JPanel;
       
      public class Player implements ActionListener {
      	public static void createButton(JPanel footerPanel) {
      		footerPanel.setLayout(new GridLayout(1, 4));
      		
      		//ボタンを表示
      		JButton btnGu = new JButton("グー");
      		btnGu = setButton(btnGu);
      		footerPanel.add(btnGu);
      		
      		JButton btnChoki = new JButton("チョキ");
      		btnChoki = setButton(btnChoki);
      		footerPanel.add(btnChoki);
      		
      		JButton btnPa = new JButton("パー");
      		btnPa = setButton(btnPa);
      		footerPanel.add(btnPa);
      		
      		JButton exitButton = new JButton("終了");
      		exitButton = setButton(exitButton);
      		footerPanel.add(exitButton);
      	}
      	public static JButton setButton(JButton button) {
      		int buttonSizeX = (640 - 20)/4;
      		Dimension buttonDimesion = new Dimension(buttonSizeX, 50);
      		button.setPreferredSize(buttonDimesion);
      		Font buttonFont = new Font("MS ゴシック",Font.PLAIN,24);
      		button.setFont(buttonFont);
      		
      		Player player = new Player();
      		button.addActionListener(player);
      		
      		return(button);
      	}
      	public void actionPerformed(ActionEvent e) {
      		String command = e.getActionCommand();
      		int playerHand = 0;
      		if (command.equals("グー")) playerHand = 1;
      		else if (command.equals("チョキ")) playerHand = 2;
      		else if (command.equals("パー"))  playerHand = 3;
      		else if (command.equals("終了")) playerHand = 4;
      		
      		int computerHand = Computer.decidesComputerHand();
      		VictoryOrDefeat.decisionVictoryOrDefeat(computerHand, playerHand);
      	}
      }
      

      このようなふうに作ると、aiさんが作りたいプログラムになるのではないかと思いますが、いかがでしょうか?
      ではでは。

コメントを残す(コメントは承認後に反映されます)

メールアドレスが公開されることはありません。