Ein einfaches Stein-Papier-Scheren-Spiel mit JavaFX und SceneBuilder

Wird es im Sommer gemacht? Es ist der 10. Adventskalender

Einführung

Dieses Mal möchte ich ein einfaches Stein-Papier-Scheren-Spiel mit dem Titel machen. Ich hoffe, Sie werden es mit der Anerkennung der Fortsetzung des JavaFX-Einführungsartikels lesen, den ich zuvor veröffentlicht habe.

Umgebung

-macOS Sierra 10.12.6 -Eclipse Oxygen 4.7.3a (e (fx) Clipse per Plug-In installiert) -Scene Builder2.0

Tatsächlicher Erstellungsprozess

Diesmal ist der Unterschied zum vorherigen Artikel das Element, das Bilder verwendet, um andere Pakete als die Anwendung zu erstellen.

Bild von dem, was du machen willst

Der diesmal erzeugte Ablauf im Spiel wird wie folgt angenommen.

  1. Standby-Bildschirm
  2. Starte das Spiel (warte auf Eingabe mit "Saisho is Goo, Janken ...")
  3. Empfangen Sie die Eingaben des Spielers und gehen Sie zum Janken-Ergebnisbildschirm 4.1 Wechseln Sie zum Standby-Bildschirm

Bild vorbereitet von Janken

Diesmal habe ich es von einer kostenlosen Materialseite ausgeliehen.

Paketstruktur im Projekt

--Anwendung: Quellen zur FX-GUI finden Sie hier --game: Die Verarbeitung dieses Janken geht hier --pic: Ich werde ein Bild von Janken's Hand setzen. Goo: Rock.png, Choki: Scissors.png, Par: Papaer.png

Operationen in SceneBuilder

Arbeiten Sie in SceneBuilder. Erstellen Sie als vorläufige Vorbereitung ein JavaFX-Projekt mit Eclipse auf dieselbe Weise wie beim letzten Mal. Der Projektname sollte "JankenFX" sein. (Es kann alles sein) Sobald das Projekt generiert wurde, schreiben Sie Main.java teilweise in das Anwendungspaket. Scene scene = new Scene(root,400,400); Die Linie, die ist Scene scene = new Scene(root, 500 ,400); Umschreiben an. Das ist alles zur Vorbereitung.
Öffnen Sie nach Abschluss der Vorbereitung Form.fxml mit SceneBuilder. Zunächst befindet sich nichts in der Mitte. Klicken Sie daher unten links auf dem Bildschirm auf Randbereich und stellen Sie im Layout auf der rechten Seite des Bildschirms die Voreinstellungsbreite auf 500 und die Voreinstellungshöhe auf 400 ein. Zu diesem Zeitpunkt sollte in der Mitte des Bildschirms ein weißes Feld angezeigt werden.

Ich werde das Bild des Status einfügen, wenn die Arbeit mit diesem Scene Builder zuerst abgeschlossen ist. スクリーンショット 2018-08-22 20.42.53.png

Die für jeden Standort von BorderPane ausgeführten Vorgänge sind wie folgt.

  1. Top --Label: Schreiben Sie einen Satz nach Titel und Fortschritt. "Label_text" ist in fxid geschrieben.

  2. Center -HBox: Die Teile innerhalb der HBox sind gleichmäßig horizontal angeordnet. Die Ausrichtung in Propaties ist auf CENTER eingestellt. In HBox --ImageView (links): Zeichnet die Hand deines eigenen Janken. Ich schreibe "image_player" in fxid. --ImageView (rechts): Zeichnet die Hand des Gegners Janken. Ich schreibe "image_enemy" in fxid.

  3. Left --Label: Ich schreibe "Sie" in den Text der Propaties, damit ich ihn als meinen eigenen identifizieren kann.

  4. Right --Label: Ich habe "Ai" in den Text der Propaties geschrieben, damit ich erkennen kann, dass es die Hand der anderen Partei ist.

  5. Bottom --HBox: Erklärung weggelassen In HBox

Die bisher betriebene und ausgefüllte Form.fxml lautet wie folgt.

Form.fxml



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

<?import javafx.scene.image.*?>
<?import javafx.scene.text.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.BorderPane?>

<BorderPane minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="500.0" 
xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="application.FormController">
   <bottom>
      <HBox alignment="CENTER" prefHeight="100.0" prefWidth="200.0" BorderPane.alignment="CENTER">
         <children>
            <Button fx:id="button_OK" mnemonicParsing="false" onAction="#onOKClicked" text="OK" />
            <Button fx:id="button_Rock" mnemonicParsing="false" onAction="#onRockClicked" text="Schmiere" />
            <Button fx:id="button_Scissors" mnemonicParsing="false" onAction="#onScissorsClicked" text="Choki" />
            <Button fx:id="button_Paper" mnemonicParsing="false" onAction="#onPaperClicked" text="Par" />
         </children>
      </HBox>
   </bottom>
   <top>
      <Label fx:id="label_text" alignment="CENTER" prefHeight="80.0" prefWidth="400.0" text="Janken-Spiel" BorderPane.alignment="CENTER">
         <font>
            <Font size="20.0" />
         </font>
      </Label>
   </top>
   <center>
      <HBox alignment="CENTER" prefHeight="100.0" prefWidth="200.0" BorderPane.alignment="CENTER">
         <children>
            <ImageView fx:id="image_player" fitHeight="188.0" fitWidth="200.0">
               <image>
                  <Image url="@../pic/Rock.png " />
               </image>
            </ImageView>
            <ImageView fx:id="image_enemy" fitHeight="188.0" fitWidth="200.0">
               <image>
                  <Image url="@../pic/Rock.png " />
               </image>
            </ImageView>
         </children>
      </HBox>
   </center>
   <right>
      <Label text="Öffnen" BorderPane.alignment="CENTER">
         <font>
            <Font size="15.0" />
         </font>
      </Label>
   </right>
   <left>
      <Label text="Sie" BorderPane.alignment="CENTER">
         <font>
            <Font size="15.0" />
         </font>
      </Label>
   </left>
</BorderPane>

Quellenerstellung in Eclipse

Es müssen zwei Programme erstellt werden: Das eine ist das Hinzufügen von FormController.java und das andere das Erstellen von Battle.java im Spielpaket. Ich denke, dass die Quelle, die dieses Mal erstellt wurde, aufgrund der Unerfahrenheit des Autors eine verschwenderische Quelle ist. Bitte beachten Sie.

FormController.java Die umgeschriebene Version lautet wie folgt.

FormController.java


package application;

import java.util.Random;
import game.Battle;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;

public class FormController {
	@FXML private Button button_OK;
	@FXML private Button button_Rock;
	@FXML private Button button_Scissors;
	@FXML private Button button_Paper;
	@FXML private Label label_text;
	@FXML private ImageView image_player;
	@FXML private ImageView image_enemy;

	private Battle battle= new Battle();
	private final Image ROCK= new Image("pic/Rock.png ");
	private final Image SCISSORS= new Image("pic/Scissors.png ");
	private final Image PAPER= new Image("pic/Paper.png ");

	private int hand_player;
	private int hand_enemy;
	private int result; //Halten Sie das Ergebnis von Janken in int

	private Random rand= new Random(); //Generiere zufällig die Hand des Gegners


//Fortschritt 1(Warten auf Eingabe von Janken)Fortschritte zu anderen Zeiten als
	@FXML
	public void onOKClicked() {
		if(battle.getPhase() != 1){
		battle.nextPhase();
		draw();
		}
	}
	@FXML
	public void onRockClicked() {
		if(battle.getPhase() == 1) {
		hand_player= 1;
		hand_enemy= rand.nextInt(3)+ 1;
		result= battle.battle(hand_player, hand_enemy, battle.getPhase());
		battle.nextPhase();
		draw();
		}
	}
	@FXML
	public void onScissorsClicked() {
		if(battle.getPhase() == 1) {
		hand_player= 2;
		hand_enemy= rand.nextInt(3)+ 1;
		result= battle.battle(hand_player, hand_enemy, battle.getPhase());
		battle.nextPhase();
		draw();
		}
	}
	@FXML
	public void onPaperClicked() {
		if(battle.getPhase() == 1) {
		hand_player= 3;
		hand_enemy= rand.nextInt(3)+ 1;
		result= battle.battle(hand_player, hand_enemy, battle.getPhase());
		battle.nextPhase();
		draw();
		}
	}

//Aktualisieren Sie die Zeichnung entsprechend dem Fortschritt
	public void draw() {
		switch (battle.getPhase()) {
		case 0:
			label_text.setText("Scherzspiel");
			image_player.setImage(ROCK);
			image_enemy.setImage(ROCK);
			break;
		case 1:
			label_text.setText("Saisho ist Goo, Janken...");
			break;
		case 2:
			image_player.setImage(changeImage(hand_player));
			image_enemy.setImage(changeImage(hand_enemy));
			switch (result) {
			case 1:
				label_text.setText("Du gewinnst! !!");
				break;
			case 2:
				label_text.setText("Du verlierst...");
				break;
			case 3:
				label_text.setText("Das ist Aiko!");
			default:
				break;
			}
			break;

		default:
			break;
		}
	}

//Aktualisiere das Bild von Janken's Hand
	private Image changeImage(int hand) {
		switch (hand) {
		case 1:
			return ROCK;
		case 2:
			return SCISSORS;
		case 3:
			return PAPER;
		default:
			return ROCK; //Ausnahme
		}
	}
}

Als nächstes kommt Battle.java, das Janken verarbeitet.

Battle.java


package game;

//Klasse, die Janken verarbeitet
public class Battle {

	private int phase; //Halte den Fortschritt des Spiels

//Fortschritt 0 bei der Objekterstellung:Initialisieren Sie auf dem ersten Standby-Bildschirm
	public Battle() {
		this.phase= 0;
	}

//Verarbeiten Sie den Müll. 1, wenn Sie gewinnen,2 wenn Sie verlieren,Gibt 3 für Aiko zurück
	public int battle(int p, int e, int phase) { //p:Meine Hand, e,Hand des Gegners
		if(phase==1) {  //Fortschritt 1:Funktioniert nur, wenn auf eine Eingabe gewartet wird
//Janken's Hand ist gut:1,Choki:2,Par:3
			if(p==1) {
				if(e==1) return 3;
				else if(e==2) return 1;
				else if(e==3) return 2;
			}

			else if(p==2) {
				if(e==1) return 2;
				else if(e==2) return 3;
				else if(e==3) return 1;
			}

			else if(p==3) {
				if(e==1) return 1;
				else if(e==2) return 2;
				else if(e==3) return 3;
			}
		}
		return -1; //Ausnahme
	}

	//Fahren Sie mit der nächsten Stufe fort. Aktualisieren Sie auf 0, wenn die Phase 3 erreicht
	public void nextPhase() {
		phase++;
		if(phase>2)phase= 0;
	}

	//Progress Getter
	public int getPhase() {
		return phase;
	}
}

Sobald Sie die beiden oben genannten Klassen erstellt und das Bild von Janken's Hand kopiert und in das Bildpaket eingefügt haben, sind Sie fertig. Ist Prost auf gute Arbeit.

Eigentlich bewegen

  1. Startbildschirm![Screenshot 2018-08-22 21.26.09.png](https://qiita-image-store.s3.amazonaws.com/0/281151/426cae40-d493-3de0-328e-80fccf3eed35. png)

  2. Wartebildschirm eingeben スクリーンショット 2018-08-22 21.26.13.png

  3. Ergebnis: Drücken Sie die OK-Taste, um zu 1 zurückzukehren. スクリーンショット 2018-08-22 21.26.21.png

abschließend

Dieses Mal habe ich in der Position einer Erweiterung aus der vorherigen Hello World ein Janken-Spiel erstellt, indem ich eine Klasse in einem anderen Paket verwendet und Bilder gelesen habe. Wir würden uns freuen, wenn Sie es als Übungsmaterial verwenden könnten, indem Sie das zu verwendende Bild oder das Layout mit SceneBuilder ändern.

Vielen Dank, dass Sie so weit gelesen haben.

Recommended Posts

Ein einfaches Stein-Papier-Scheren-Spiel mit JavaFX und SceneBuilder
Ich habe versucht, mit Javafx ein einfaches Spiel zu machen ① "Lass uns Glücksspiel finden" (unvollendet)
Entwerfen und implementieren Sie ein Block Breaking-Spiel mit einer sauberen Architektur
Entwerfen und implementieren Sie ein Block Breaking-Spiel mit einer sauberen Architektur
Ich habe versucht, ein einfaches Spiel mit Javafx zu machen ① "Lass uns Glücksspiel finden" (unvollendete Version ②)
[Anfänger] Versuchen Sie, mit Java ein einfaches RPG-Spiel zu erstellen ①
Erstellen Sie mit JavaFX ein Diashow-Tool
Hallo Welt mit Kotlin und JavaFX
Ziehen Sie Dateien mit JavaFX per Drag & Drop
Machen Sie ein Tippspiel mit Ruby
Mit Rubin ● × Game und Othello (Grundlegende Bewertung)
Erstellen Sie mit Dropwizard eine einfache Webanwendung
Einfache Janken
Erstellen Sie eine einfache CRUD mit SpringBoot + JPA + Thymeleaf ② ~ Bildschirm- und Funktionserstellung ~
Erstellen Sie mit Spring Batch eine einfache On-Demand-Charge
[Schienenentnahme] Erstellen Sie eine einfache Entnahmefunktion mit Schienen
Erstellen eines einfachen Balkendiagramms mit MPAndroidChart
Vergrößern / verkleinern und parallel zu JavaFX Canvas verschieben (Revenge Edition)
[Docker] [Nginx] Erstellen Sie mit Nginx eine einfache ALB
Janken-Spiel
Ich habe eine Janken App mit Kotlin gemacht
Eine einfache und bequeme Methode für HashMap
Ich habe eine Janken App mit Android gemacht
Erstellen Sie mit Spring Boot eine einfache Such-App
Erstellen Sie mit Java + MySQL ein einfaches Bulletin Board
Memo beim Tappen und Entwickeln mit JavaFX
Ich habe ein Janken-Spiel in Java (CLI) gemacht.
Bereiten Sie eine Scraping-Umgebung mit Docker und Java vor
Zeigen Sie eine einfache Hallo Welt mit SpringBoot + IntelliJ
Ich habe ein einfaches Berechnungsproblemspiel in Java gemacht
[Anfänger] Erstellen Sie ein wettbewerbsfähiges Spiel mit grundlegenden Java-Kenntnissen
Erstellen eines Chinchiro-Spiels mit Ruby 4. Erstellen eines Spielfortschrittsprozesses
[Ruby] Ich habe einen Crawler mit Anemone und Nokogiri gemacht.
Implementieren Sie eine einfache Rest-API mit Spring Security mit Spring Boot 2.0
Zeigen Sie ein Ladebild in JavaFX an und zeigen Sie dann ein anderes Bild an
Erstellen Sie mit Spring Security 2.1 eine einfache Demo-Site mit Spring Security
Bereiten Sie die Umgebung für Java11 und JavaFx mit Ubuntu 18.4 vor
Ein Janken-Spiel für zwei Spieler mit Java, das zwischen Threads konkurriert
JavaFX-Schaltflächen und Beschriftungen
Hallo Welt mit Kotlin und JavaFX
Ziehen Sie Dateien mit JavaFX per Drag & Drop
== und gleich
Vergrößern / verkleinern und parallel zu JavaFX Canvas verschieben (Revenge Edition)
JavaFx-Memorandum
Memo beim Tappen und Entwickeln mit JavaFX
Ich habe versucht, JavaFX und Spring Framework zu verknüpfen.
Ein einfaches Stein-Papier-Scheren-Spiel mit JavaFX und SceneBuilder