www.r-krell.de |
Webangebot für Schule und Unterricht, Software, Fotovoltaik und mehr |
Willkommen/Übersicht > Informatik > Informatik mit Java, Teil b) > Java-Autorennen
Autorennen für zwei Personen
Bedienungsanleitung:
Taste [S] drücken, um Straße /
Fenster sichtbar zu machen bzw. neu zu zeichnen.
Wer seine Taste [R] oder [B] schneller bzw. öfter
drückt, gewinnt!
Bitte speichern Sie zunächst die
Programmdatei
Autorennen(r-krell.de).jar (54 kB) |
auf Ihrem Computer und starten ("öffnen")
Sie dann die herunter geladene Datei durch Anklicken.
Am besten schieben Sie danach das geöffnete Programmfenster
nach oben links,
sodass Sie gleichzeitig diese Seite lesen können.
Mehr zum Start von Java-Programmen als Application (und nicht mehr als Applet) auf meiner Extraseite Übersicht über meine Java-Programme - Appletprobleme und Downloads (erscheint in neuem Browser-Tab)
Nachfolgend der Quelltext des Autorennens „Formel 1", der auf vier Dateien verteilt ist:
Außerdem wird dargestellt, wie früher ein Applet aus einer Webseite aufgerufen werden konnte bzw. wie einige Jahre lang der Webstart ermöglicht wurde:
zum Inhaltsverzeichnis (oben) / zum Seitenende
// Auto fürs Formel1-Autorennen:
// R. Krell, 9/2003 -- Java-JDK + stiftUndCo
// https://www.r-krell.de
import stiftUndCo.*;
import java.awt.*; // für Color
public class Formel1_Auto
{
private BuntStift stift = new BuntStift();
private String name;
private int x, y;
public Formel1_Auto (int xPos, int yPos, Color farbe, String bezeichnung)
{ // Konstruktor
x = xPos; // füllt Datenfelder mit den übergebenen Werten ..
y = yPos;
name = bezeichnung;
stift.setzeFarbe (farbe);
zeichneAuto (true); // .. und zeichnet Auto erstmalig
}
private void zeichneAuto (boolean sichtbar)
{
if (sichtbar)
{
stift.normal();
}
else
{
stift.radiere();
}
stift.hoch();
stift.bewegeBis (x, y);
stift.runter();
stift.bewegeBis (x+42, y);
stift.bewegeBis (x+1, y-12);
stift.bewegeBis (x, y); //..Karosserie
stift.hoch();
stift.bewegeBis (x+8, y-2);
stift.zeichneKreis (7); // Hinterrad
stift.bewegeBis (x+33, y);
stift.zeichneKreis (5); // Vorderrad
}
public void fahreUm (int deltaX)
{
zeichneAuto (false); // löscht altes Auto
x = x + deltaX;
zeichneAuto (true); // zeichnet neues Auto
}
public int wo ()
{
return (x+42); // x-Position der Spitze des Autos
}
public String wer ()
{
return (name);
}
}
zum Inhaltsverzeichnis (oben) / zum Seitenende
// Rennstrecke fürs Formel1-Autorennen:
// R. Krell, 9/2003 -- Java-JDK + stiftUndCo
// https://www.r-krell.de
import stiftUndCo.*;
public class Formel1_Strecke
{
Bildschirm gelände;
BuntStift stift;
int x0, x1, y0;
public Formel1_Strecke (int xStart, int xZiel, int yStart)
{ // Konstruktor :
x0 = xStart; // füllt Datenfelder ..
x1 = xZiel;
y0 = yStart;
gelände = new Bildschirm (x1+20, y0+200,
"Autorennen -- [S]=(wieder) sichtbar machen) -- www.r-krell.de");
stift = new BuntStift(); // .. und erzeugt Bildschirn und Stift
}
public void zeichneStrecke()
{
gelände.löscheAlles(); // für nochmaligen Start
stift.bewegeBis (x0, y0); // zeichnet Straße
stift.runter();
stift.bewegeBis (x1, y0);
stift.hoch();
stift.bewegeBis (x0, y0+50);
stift.runter();
stift.bewegeBis (x1, y0+50);
stift.hoch();
stift.bewegeBis (x0, y0+100);
stift.runter();
stift.bewegeBis (x1, y0+100);
stift.hoch();
stift.bewegeBis (x0, y0+120); // beschriftet Start und Ziel
stift.schreibe ("Start");
stift.bewegeBis (x1-20, y0+120);
stift.schreibe ("Ziel");
stift.bewegeBis(175,200); // Spielanleitung
stift.schreibe ("Tasten [R] und/oder [B] drücken!");
}
}
zum Inhaltsverzeichnis (oben) / zum Seitenende
// Renn-Steuerung fürs Formel1-Autorennen:
// R. Krell, 9/2003 -- Java-JDK + stiftUndCo
// https://www.r-krell.de
import stiftUndCo.*;
public class Formel1_Rennen
{
Formel1_Strecke monza = new Formel1_Strecke (10, 500, 50);
Formel1_Auto ferrari, williams;
Tastatur taste;
BuntStift stift;
public void spielen ()
{
do
{
monza.zeichneStrecke();
ferrari = new Formel1_Auto (10, 80, Farbe.ROT, "Der rote Ferrari");
williams = new Formel1_Auto (10,130, Farbe.BLAU, "Der blaue BMW-Williams");
taste = new Tastatur ();
stift = new BuntStift();
rennen();
siegerEhrung ();
} while (nochmal());
}
private void rennen ()
{
while ((ferrari.wo()<500)&&(williams.wo()<500))
// Autos bewegen, solange keins am Ziel
{
if (taste.wurdeGedrueckt())
{
switch (taste.zeichen())
{
case 'r' : ;
case 'R' : ferrari.fahreUm (2); break; // Taste [R]: ferrari
case 'b' : ;
case 'B' : williams.fahreUm (2); break; // Taste [B]: williams
case 's' : ;
case 'S' : monza.zeichneStrecke(); // Taste [S]: alles nochmal ..
ferrari.fahreUm (0); //.. ohne Bewegung zeichnen,
williams.fahreUm (0); //.. weil Fenster verdeckt war
}
}
}
}
private void siegerEhrung ()
{
stift.bewegeBis (50,180); // löscht Spielanleitung
stift.setzeFarbe (Farbe.WEISS);
stift.setzeFuellMuster(Muster.GEFUELLT);
stift.zeichneRechteck(450,30);
stift.setzeFarbe (Farbe.SCHWARZ);
stift.bewegeBis(100,200); // nennt Gewinner
if (ferrari.wo()>=500)
{ // wenn ferrari vorne steht
stift.schreibe (ferrari.wer()+" hat gewonnen");
}
else
{
stift.schreibe (williams.wer()+" hat gewonnen");
}
}
private boolean nochmal ()
{
stift.schreibe (" -- [N]=Neustart, [E]=Ende");
char zchn;
do // do-Schleife: Wartet auf Taste [N] oder [E]
{
while (!taste.wurdeGedrueckt()); // nichts tun: Warten, auf Taste
zchn = taste.zeichen();
if ((zchn == 's')||(zchn == 'S')) // evtl. noch bei Taste [S]
{ // Hinweis auf erwartete Eingabe
stift.bewegeBis(140,200);
stift.schreibe("Rennen beendet -- [N]=Neustart, [E]=Ende");
}
} while ((zchn!='e')&&(zchn!='E')&&(zchn!='n')&&(zchn!='N'));
return ((zchn=='n')||(zchn=='N')); // true: nochmal Neustart gewünscht
}
}
zum Inhaltsverzeichnis (oben) / zum Seitenende
// Startdatei fürs Formel1-Autorennen:
// R. Krell, 9/2003 -- Java-JDK + stiftUndCo
// https://www.r-krell.de
public class Formel1_Start extends java.applet.Applet
{
public void init() // Start als Applet (inzwischen
unnötig, da nicht mehr
erlaubt) ..
{
Formel1_Rennen rennSpiel = new Formel1_Rennen();
rennSpiel.spielen();
}
public static void main (String[] s) //.. bzw. als Application
{
Formel1_Rennen rennSpiel = new Formel1_Rennen();
rennSpiel.spielen();
}
}
zum Inhaltsverzeichnis (oben) / zum Seitenende
Nur noch von historischem Interesse sind die nachfolgenden Ausführungen zur Einbettung von Applets in Webseiten. Seit 2016/2017 wurde aus Sicherheitsgründen die Ausführung von Programmen in Webseiten leider abgeschafft.
Hier die wesentlichen Elemente einer HTML-Seite, die das Applet aufruft - wie in der Quelltext-Ansicht des HTML-Editors phase 5 angezeigt (Bezugsquelle siehe meine Java-Seite a)). Leider unterstützen seit ca. 2016 viele Browser keinen Applet-Aufruf mehr.
zum Inhaltsverzeichnis (oben) / zum Seitenende
Ebenfalls nur noch von historischem Interesse sind die nachfolgenden Ausführungen zum Webstart, der ab 2016 als Ersatz und Nachfolger für den seinerzeit abgeschafften Start als Applet propagiert wurde, seit etwa 2020 aber auch nicht mehr erlaubt ist.
Um das Autorennen per Webstart auszuführen (das Rennen wird nicht mehr im, sondern nur noch vom Browser gestartet), reicht es, dass in der Startdatei Formel1_Start.java die main-Methode für eine Application steht. Alle kompilierten .class-Dateien werden dann - hier zusammen mit den Dateien für stiftUndCo - am besten aus dem Javaeditor heraus in eine .jar-Datei gepackt (der Javaeditor erzeugt auf Knopfdruck F5 bzw. per Menübefehl Start > Jar-Datei > Erzeugen eine .jar-Datei mit allen Klassen aus dem aktuellen Verzeichnis und mit einem passenden Manifest-Text). Auf Umlaute und Leerzeichen sollte im Dateinamen verzichtet werden! Grundsätzlich ist aber eine .jar-Datei nur ein umbenanntes .zip-Archiv, sodass sich der Inhalt der .jar-Datei nach Umbenennen in .zip auch leicht kontrollieren oder ergänzen lässt, bevor man die Archiv-Endung wieder in .jar zurück benennt. Diese .jar-Datei kann zum Download angeboten und auf jedem System mit Java-Runtime-Umgebung JRE ohne Weiteres (meist einfach per Doppelklick) lokal gestartet werden.
Für den Webstart ist neben dem Programm in der .jar-Datei aber noch eine zusätzliche Datei nötig, die sich als xml-Datei auch mit einem einfachen Texteditor erzeugen lässt, aber nachher statt .txt die Endung .jnlp kriegen muss (xml = eXtended Markup Language = die grundsätzliche Vereinbarung, Informationen zwischen so genannten Tags [<Tag>..</Tag>] hierarchisch anzuordnen; jnlp = Java Network Launching Protokoll = die spezielle Vorgabe, welche Informationen eine zum Webstart vorgesehene .jar-Datei begleiten sollen):
Am Ende des
Informations-Abschnitts wird mit
<offline-allowed/>
zugelassen, dass das im Browser gestartete Autorennen auch nach
Verlassen meiner Webseite im Java-Cache des abrufenden Surfers
gespeichert bleibt und später vom diesem auch ohne
Internet-Verbindung wieder gespielt werden kann. Zusätze
könnten noch regeln, wann/wie nach Updates im Netz gesucht
werden soll. Auf dem Rechner des Spielers wird beim ersten
Webstart für den Offline-Modus meist ein Eintrag
"Autorennen" im Startmenü angelegt (der oft sogar noch
bleibt, wenn der Spieler seinen Java-Cache ausdrücklich
löscht. Dann sollte man auch den Menüeintrag entfernen.
Manchmal wird beim ersten Webstart mit einer Integrationswarnung
gefragt, ob Verknüpfungen auf dem Desktop und im
Startmenü angelegt werden sollen, und der Benutzer kann das
auch ablehnen). Fehlt die Offline-Erlaubnis, muss zur
Ausführung des Autorennens immer wieder die Webseite
aufgesucht werden.
Durch den Eintrag
<default/>
im Sicherheits-Abschnitt werden keine Festlegungen getroffen,
sodass die Angaben im Manifest der .jar-Datei bzw. die
Java-Sicherheitseinstellungen des Benutzers verwendet werden.
Alternativ könnte auch <sandbox/> für eine
sichere Ausführung mit stark eingeschränkten Rechten
oder <all-permissions/> für die Ausführung mit
Zugriff auf das Dateisystem des Spieler-Computers stehen. Im
letzten Fall sollte eine gleiche Erlaubnis im Manifest der
.jar-Datei stehen und die .jar-Datei signiert sein.
Zum Schluss wird in der Anwendungsbeschreibung der .jnlp-Datei der Name der Java-Start-Datei genannt (die die main-Methode enthält): wie im oben abgedruckten Quelltext ist das Formel1_Start.
In der Webseite wird jetzt alles sehr einfach: Es gibt keinen speziellen Applet-Code mehr, sondern einfach einen ganz normalen Hyperlink zur .jnlp-Datei (s.u. in den Zeilen 11 bis 13):
Beim Klick auf den Link "Hier klicken zum Werbstart des Autorennens" wird aber nicht die jnlp-Datei geöffnet bzw. angezeigt, sondern das dort beschriebene Autorennen gestartet - wenn der Surfer eine Java-Umgebung auf seinem Rechner hat (und der Browser den Webstart unterstützt). Sonst wird Autorennen.jnlp herunter geladen oder der Benutzer wird gefragt, womit er Autorennen.jnlp öffnen will oder ob er es herunter laden will. Beides nützt nichts - ohne Java und ohne die .jar-Datei kann man das Autorennen nicht ausführen!
Vgl. auch meine Extraseite Übersicht über meine Java-Programme - Appletprobleme und Downloads (in neuem Tab)
zurück zur Seite „Informatik mit
Java, Teil b)"