Wird es im Sommer gemacht? Es ist der 10. Adventskalender
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.
-macOS Sierra 10.12.6 -Eclipse Oxygen 4.7.3a (e (fx) Clipse per Plug-In installiert) -Scene Builder2.0
Diesmal ist der Unterschied zum vorherigen Artikel das Element, das Bilder verwendet, um andere Pakete als die Anwendung zu erstellen.
Der diesmal erzeugte Ablauf im Spiel wird wie folgt angenommen.
Diesmal habe ich es von einer kostenlosen Materialseite ausgeliehen.
--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
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.
Die für jeden Standort von BorderPane ausgeführten Vorgänge sind wie folgt.
Top --Label: Schreiben Sie einen Satz nach Titel und Fortschritt. "Label_text" ist in fxid geschrieben.
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.
Left --Label: Ich schreibe "Sie" in den Text der Propaties, damit ich ihn als meinen eigenen identifizieren kann.
Right --Label: Ich habe "Ai" in den Text der Propaties geschrieben, damit ich erkennen kann, dass es die Hand der anderen Partei ist.
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>
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
}
}
}
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.
Startbildschirm![Screenshot 2018-08-22 21.26.09.png](https://qiita-image-store.s3.amazonaws.com/0/281151/426cae40-d493-3de0-328e-80fccf3eed35. png)
Wartebildschirm eingeben
Ergebnis: Drücken Sie die OK-Taste, um zu 1 zurückzukehren.
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