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)」の順番に選択します。

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

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

新規Javaプロジェクトのウィンドウ

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

JankenGameプロジェクトが作られた

クラスの作成

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

クラスの新規作成


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

新規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つに分割して作っていきたいと思っています。

じゃんけんゲームのか画面構成

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

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

パネルの作り方

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

パネル表示のプログラムは、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)」と選択します。

クラスの新規作成

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

PanelMakerクラスの新規作成

今回は名前(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クラスには、ランダムなコンピュータの手を取得するメソッドを作ります。

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クラスには、じゃんけんの結果のテキストを取得するためのメソッドを作ります。

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でのじゃんけんゲームプログラムの作り方を紹介しました。

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

スポンサードリンク

関連コンテンツ

オススメ記事

【Android Studio】開発したアプリの実機テストを行う方法。

どうも、頭がすっからかんの@It_is_Rです。 やかましいわ。 今回は Android Studio で実機テストする方法を紹介します。 これからアプリ開発をしていく上で必要不可欠な実機テストです

java

【Java】クラスとメソッドの違いとは? ゲーム風に解説

Javaを勉強しはじめて間もない方は、クラスとメソッドって一体何が違うのと疑問を感じている場合も多いのではないかと思います。 今回は、Javaのクラスとメソッドの違いを、分かりやすく解説してい

迷路やRPGで使えるマップを作ってみよ!

【JavaScript】迷路やRPGで使えるマップを作ってみよう! 小学生からのプログラミング入門

小学生からのプログラミング講座《こうざ》、今回もはじめていきましょう! 前回はHTML5とCanvasを使って、キャラクターがキーボードの入力《にゅうりょく》で移動《いどう》するところまで、紹

【初心者向けJavaScrip入門】変数を使いこなすための、かなり詳しい解説

変数は、数値や文字列などのデータを入れておける箱です。プログラミングをはじめて、最初のほうで覚えるものですが、変数は意外と奥が深いものです。 そこで今回は、JavaScriptにおける変数の使

リセットCSS は何を使う? おすすめ8選(コピペも可能!)

Web開発でブラウザごとの表示の違いをリセットしてくれる リセットCSS というものがあります。 しかし、何を使っていいのかと感じている人もいると思います。 今回はこの リセットCSS につい

JavaScriptマンガ風講座。初心者でも絶対に理解できる入門編!!

プログラミングは奥が深い。。。@It_is_Rです。 Flashがスマホから使えなくなり、多くのサイトにHTML5が使われ、WEB開発で、JavaScriptは必須といっても過言ではありません

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

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

【 gulp 】 超便利! Sass で Normalize.css などをインポートする方法。

ふと立ち上がった瞬間に、ホットマットを猫に奪われる@It_is_Rです。 全然どいてくれない。 今回は gulp を使って、 Sass ファイルから Normalize.css などをインポー

画像を表示するよ

JavaScriptで画像を表示してみよう! 小学生からのプログラミング入門

みなさんこんにちは。今日もプログラミングの勉強をはじめていきましょう。 前回、「JavaScriptで今月の残り日数を計算してみよう! 小学生からのプログラミング入門」では、JavaScrip

【Xcode7】Swift2でMacアプリ開発。Storyboardでボタンを作る。

喧嘩するほど仲がいいとは言いますが、喧嘩する相手がいません。友達がいないということでしょうか。@It_is_Rです。 前回、StoryboardでMacのウィンドウに文字を表示しました。しかし、

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さんが作りたいプログラムになるのではないかと思いますが、いかがでしょうか?
      ではでは。

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

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




オリジナルゲーム.com