すずろぐ

人生大逆転を目指す、鈴木俊吾の成長日記

Java JavaFXで簡単なGUI版じゃんけんゲームを作成してみた!

この記事は約7分で読めます。

JavaFX - じゃんけんゲームの実行結果

おはようございます、すずしんです。

最近あまりプログラミングをしていませんでしたので…。
久しぶりにJavaのプログラミングをしてみました。

何のプログラムを作成しようかと悩んだのですが…。
どうせなら、GUI付きのプログラム(JavaFX)で作成してみようと思い立ちました。
そして、あまり難しくなさそうなテーマを扱おうということで…。
今回は、簡単な「じゃんけんゲームを作成してみることにしました。

スポンサーリンク

じゃんけんゲームの仕様

今回作成することにしたじゃんけんゲームの仕様は以下のような感じです。

  • コンピュータの手・自分の手・じゃんけんの結果を表示するラベルと、自分の手を選ぶためのボタン(グー・チョキ・パー)から構成される。
  • いずれかの手のボタンを押すと、コンピュータがランダムな手を選びじゃんけんをする。
  • じゃんけんをした時、コンピュータの手・自分の手・じゃんけんの結果を表示する。

じゃんけんゲームのプログラム作成

それでは、ここから実際にじゃんけんゲームを作成していきます。
今回のじゃんけんゲームでは、「Janken.fxml」「JankenController.java」「Janken.java」の3つのファイルを作ります。

Janken.fxmlの作成

Janken.fxmlでは、じゃんけんゲームの画面(GUI)を作成します。
SceneBuilderを使いながら、仕様に沿ってラベルとボタンを配置していきます。
ラベルとボタンの細かい部分は特に指定していませんので、自由に決めてもらって構いませんよ。
自分にとって分かりやすい画面になっていれば問題無いです。

とりあえず、私の場合は以下のような画面構成にしてあります。
ラベルとボタンのフォントサイズは20で、マージンも適宜設定しています。

JavaFX - じゃんけんゲーム

参考までに、私が作成したJanken.fxmlのコードを載せておきますので…。
もし同じ画面にしたい場合には利用してくださいね。

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>

<AnchorPane id="AnchorPane" prefHeight="300.0" prefWidth="480.0" xmlns="http://javafx.com/javafx/8.0.60" xmlns:fx="http://javafx.com/fxml/1" fx:controller="jp.suzushin7.sample.janken.JankenController">
   <children>
      <VBox alignment="CENTER" layoutX="90.0" layoutY="44.0">
         <children>
            <Label fx:id="cpuHandLabel" alignment="CENTER" text="コンピュータの手: -">
               <font>
                  <Font size="20.0" />
               </font>
               <VBox.margin>
                  <Insets bottom="10.0" top="10.0" />
               </VBox.margin>
            </Label>
            <Label fx:id="myHandLabel" alignment="CENTER" text="あなたの手: -">
               <font>
                  <Font size="20.0" />
               </font>
               <VBox.margin>
                  <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
               </VBox.margin>
            </Label>
            <Label fx:id="resultLabel" alignment="CENTER" text="結果: -">
               <font>
                  <Font size="20.0" />
               </font>
               <VBox.margin>
                  <Insets bottom="30.0" left="10.0" right="10.0" top="10.0" />
               </VBox.margin>
            </Label>
            <HBox alignment="CENTER" prefHeight="30.0" prefWidth="300.0">
               <children>
                  <Button mnemonicParsing="false" onAction="#putOutRockHand" text="グー">
                     <HBox.margin>
                        <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
                     </HBox.margin>
                     <font>
                        <Font size="20.0" />
                     </font>
                  </Button>
                  <Button mnemonicParsing="false" onAction="#putOutScissorsHand" text="チョキ">
                     <HBox.margin>
                        <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
                     </HBox.margin>
                     <font>
                        <Font size="20.0" />
                     </font>
                  </Button>
                  <Button mnemonicParsing="false" onAction="#putOutPaperHand" text="パー">
                     <HBox.margin>
                        <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
                     </HBox.margin>
                     <font>
                        <Font size="20.0" />
                     </font>
                  </Button>
               </children>
            </HBox>
         </children>
      </VBox>
   </children>
</AnchorPane>

JankenController.javaの作成

続いて、コントローラークラスとして「JankenController.java」を作成します。

cpuHandLabel・myHandLabel・resultLabelは、それぞれコンピュータの手・自分の手・じゃんけんの結果を表示するためのラベルです。
putOutRockHand()・putOutScissorsHand()・putOutPaperHand()は、それぞれ自分の手をグー・チョキ・パーとしてじゃんけんをするメソッドです。
これらはdoJanken()メソッドで処理しています。

doJanken()メソッドでは、まずランダムにコンピュータの手を選びます。
そして、じゃんけんの結果をresultに代入しておきます。
最後に、コンピュータの手・自分の手・じゃんけんの結果を各ラベルにセットしています。

やっていることは単純ですので、特に難しくはないですよね。

package jp.suzushin7.sample.janken;

import java.net.URL;
import java.util.Random;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;

public class JankenController implements Initializable {
    private final Random random = new Random();
    private final String[] hands = {
        "グー", "チョキ", "パー"
    };
    
    @FXML private Label cpuHandLabel;
    @FXML private Label myHandLabel;
    @FXML private Label resultLabel;
    
    @Override
    public void initialize(URL url, ResourceBundle rb) {
    
    }
    
    @FXML
    public void putOutRockHand() {
        doJanken(0);
    }
    
    @FXML
    public void putOutScissorsHand() {
        doJanken(1);
    }
    
    @FXML
    public void putOutPaperHand() {
        doJanken(2);
    }
    
    private void doJanken(int myHand) {
        String result;
        int cpuHand = random.nextInt(3);
        
        if((cpuHand == 0 && myHand == 2) || (cpuHand == 1 && myHand == 0) || (cpuHand == 2 && myHand == 1)) {
            result = "あなたの勝ち!";
        }
        else if((cpuHand == 0 && myHand == 1) || (cpuHand == 1 && myHand == 2) || (cpuHand == 2 && myHand == 0)) {
            result = "あなたの負け!";
        }
        else {
            result = "あいこ!";
        }
        
        cpuHandLabel.setText("コンピュータの手: " + hands[cpuHand]);
        myHandLabel.setText("あなたの手: " + hands[myHand]);
        resultLabel.setText("結果: " + result);
    }
}

Janken.javaの作成

最後に、メインクラスとなるJanken.javaの作成をします。

ここでは、単純にFXMLLoaderを使ってJanken.fxmlをロード、そしてSceneにセットするくらいです。
このアプリケーションのタイトルは「じゃんけん」としてみました。
…そのままですね!

package jp.suzushin7.sample.janken;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Janken extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception {        
        Parent root = FXMLLoader.load(getClass().getResource("Janken.fxml"));
        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        
        primaryStage.setTitle("じゃんけん");
        primaryStage.show();
    }
    
    public static void main(String[] args) {
        Application.launch(args);
    }
}

じゃんけんゲームの実行結果

それでは、早速プログラムを実行してみます。

プログラムが実行されると、まず以下のような画面が表示されます。

JavaFX - じゃんけんゲーム

この画面上にある、グー・チョキ・パーのいずれかのボタンをクリックすると、コンピュータとじゃんけんができます。
じゃんけん後は、コンピュータの手・自分の手・じゃんけんの結果が画面上に表示されます。
ちなみに、コンピュータはランダムな手を選びますので、じゃんけんをする度に結果が変わります。

JavaFX - じゃんけんゲームの実行結果

JavaFX - じゃんけんゲームの実行結果

JavaFX - じゃんけんゲームの実行結果

ひとこと

今回は、JavaFXを使って簡単なじゃんけんゲームを作成してみましたが…。
予想していたよりもサクッと作ることができましたよ。

JavaFX入門用の題材としては、このじゃんけんゲームはちょうど良いのではないでしょうか?
もし良かったら、あなたもじゃんけんゲームを作成して遊んでみてくださいね。