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

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
// 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


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

// 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


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
// https://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
// 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.


HTML-Datei: Quelltext einer Webseite mit 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)). Leider unterstützen seit ca. 2016 viele Browser keinen Applet-Aufruf mehr.

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!


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.


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

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!

Vgl. auch meine Extraseite Übersicht über meine Java-Programme - Appletprobleme und Downloads (in neuem Tab)


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 https://www.r-krell.de.