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

Nach dem Webstart erscheint links oben ein Extra-Fenster mit den beiden Autos:

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!



Wenn die Java-JRE installiert ist, können Sie das Programm jetzt sofort ausführen:

Hier klicken zum Webstart des Autorennens

Danach Öffnen von Autorennen.jnlp (mit Java(TM) Webstart Launcher (Standard)) wählen/bestätigen
und bei evtl. Sicherheitswarnung vor der Ausführung von XAutoRennStart das Risiko akzeptieren und OK drücken.

Wenn Sie außerdem gefragt werden, ob Sie eine Desktop- und eine Startmenüverknüpfung anlegen wollen,
sollten Sie zustimmen, wenn Sie das Autorennen auch nach Verlassen dieser Webseite nochmal spielen wollen.

Wird nach dem Klick Autorennen.jnlp herunter geladen oder werden Sie gefragt, womit Sie Autorennen.jnlp öffnen wollen oder ob/wohin Sie die Datei
speichern wollen, haben Sie entweder kein Java installiert oder ihr Browser (z.B. Opera) unterstützt keinen Webstart.
Im letzten Fall empfiehlt sich nachfolgend der Download der .jar-Datei:

Sie können das Autorennen auch als ausführbare Java-Datei Autorennen(r-krell.de).jar (38 kB) herunter laden und später lokal auf Ihrem Rechner starten (Java-Umgebung JRE vorausgesetzt). Die Ausführung als Applet im Browser wird von mir hingegen nicht mehr angeboten: Gründe, Abhilfe und alle Downloads (in neuem 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 heute der Webstart ermöglicht wird:


zum Inhaltsverzeichnis (oben) / zum Seitenende


Erste Java-Datei: „Fomel1_Auto.java" -- Bauplan für ein bzw. für jedes Auto

// Auto fürs Formel1-Autorennen:
// R. Krell, 9/2003 -- Java-JDK + stiftUndCo
// http://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


Zweite Java-Datei: „Fomel1_Strecke.java" -- Bauplan für die Rennstrecke

// Rennstrecke fürs Formel1-Autorennen:
// R. Krell, 9/2003 -- Java-JDK + stiftUndCo
// http://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


Dritte Java-Datei: „Fomel1_Rennen.java" -- Bauplan für die Steuerung des Rennens

// Renn-Steuerung fürs Formel1-Autorennen:
// R. Krell, 9/2003 -- Java-JDK + stiftUndCo
// http://www.r-krell.de

import stiftUndCo.*;

public class Formel1_Rennen
{
  Formel1_Strecke monza = 
new Formel1_Strecke (1050050);
  Formel1_Auto ferrari, williams;
  Tastatur  taste;
  BuntStift stift;

  
public void spielen ()
  {
    
do
    
{
      monza.zeichneStrecke();
      ferrari  = 
new Formel1_Auto (1080, 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


Vierte Java-Datei: „Fomel1_Start.java" --  Startdatei

// Startdatei fürs Formel1-Autorennen:
// R. Krell, 9/2003 -- Java-JDK + stiftUndCo
// http://www.r-krell.de


public class Formel1_Start extends java.applet.Applet

  
public void init()    // Start als Applet bzw. ..
  
{
    Formel1_Rennen rennSpiel = 
new Formel1_Rennen();
    rennSpiel.spielen();
  }
  
  
public static void main (String[] s) //.. als Application
  
{
    Formel1_Rennen rennSpiel = 
new Formel1_Rennen();
    rennSpiel.spielen();
  }
}




zum Inhaltsverzeichnis (oben) / zum Seitenende


HTML-Datei: Quelltext einer Webseite zum Start als Applet

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)).

Ansicht HTML-Editor mit Quelltext für Webseite zur Applet-Einbettung

Beim Aufruf bzw. bei der Anzeige der Webseite im Browser wurde von älteren Browsern das Applet dann automatisch geladen und gestartet. Das Archiv mit den class-Dateien muss dazu mit der Webseite auf den Server geladen werden - wenn (wie hier) keine besonderen Pfadangaben gemacht werden, muss das Archiv dort ins gleiche Verzeichnis wie die Webseite!

Inzwischen (seit etwa 2016) unterstützen die meisten Browser keine Applets mehr. Jetzt ist die Webstart-Ausführung angesagt (oder das Herunterladen und der lokale Start), wie nachfolgend beschrieben:


zum Inhaltsverzeichnis (oben) / zum Seitenende


JNLP-Datei und Quelltext einer Webseite für den Webstart

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):



Windows-Editor ('notepad') mit jnlp-Datei

Neben dem Ursprungsort und der URL der jnlp-Datei, dem Titel des Programms, dem Autor (auch kostenlose Anbieter müssen im Verkäufer-Tag stehen!) und zwei Beschreibungen sind drei weitere Zeilen bemerkenswert:

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): bei meinem oben abgedruckten Quelltext wäre das Formel1_Start; in meinem ganz oben angebotenen Archiv Autorennen(r-krell).jar hat die Startklasse allerdings statt dessen offenbar den Namen XAutoRennStart.

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):

Foto des HTML-Editors von Rathlev mit HTML-Quelltext mit Webstart-Hyperlink

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!




zurück zur Seite „Informatik mit Java, Teil b)"



zum Anfang dieser Seite
Willkommen/Übersicht   -   Was ist neu?   -   Software   -   Mathematik   -   Physik   -   Informatik   -   Schule: Lessing-Gymnasium und -Berufskolleg   -   Fotovoltaik   -   & mehr   -   Kontakt: e-Mail,  News-Abo, Gästebuch, Impressum   -   Grußkarten, site map, Download und Suche

Diese Seite ist Teil des Webangebots http://www.r-krell.de. Sie können diese Seite per e-Mail weiter empfehlen (tell a friend).