Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

 <<   zurück
JavaScript und AJAX von Christian Wenz
Das umfassende Handbuch
Buch: JavaScript und AJAX

JavaScript und AJAX
839 S., mit DVD, 39,90 Euro
Rheinwerk Computing
ISBN 3-89842-859-1
gp Kapitel 24 Java
  gp 24.1 Allgemeines
    gp 24.1.1 Wie funktioniert Java?
    gp 24.1.2 Kurzeinführung in Java
  gp 24.2 Java und das WWW
    gp 24.2.1 Ein Beispiel-Applet
    gp 24.2.2 HTML-Integration
  gp 24.3 Java ohne Applet
    gp 24.3.1 Exemplarische Java-Objekte
    gp 24.3.2 Blackjack
    gp 24.3.3 Karten initialisieren
    gp 24.3.4 Karten mischen


Rheinwerk Computing

24.3 Java ohne Applet  downtop

Man braucht nicht unbedingt ein Applet, um Java-Methoden von JavaScript aus aufzurufen. Gewisse Grundobjekte von Java können auch direkt aufgerufen werden. Beispielsweise hat man so zu Zeiten des Netscape Navigator 3 versucht, die Höhe und Breite des Bildschirms zu bestimmen, weil es damals screen.width und screen.height noch nicht gab, wohl aber entsprechende Java-Methoden. Diese Vorgehensweise wird jedoch nur relativ selten verwendet; meistens benötigt man nicht nur ein mitgeliefertes Java-Objekt, sondern gleich eine (programmierte) Java-Funktion, und dann muss man ein Applet verwenden.

Wenn Sie eine (programmierte) Java-Funktion verwenden wollen, beispielsweise eine Nullstellenberechnung oder andere mathematische Berechnungen (was mit den JavaScript-Datentypen nicht immer akkurate Ergebnisse liefert), so können Sie ein 1 × 1 Pixel großes Applet verwenden. Das Applet selbst soll keine Aktivität zeigen und fällt aufgrund seiner Größe nicht sonderlich auf, aber Sie können die öffentlichen Funktionen aufrufen und die Ergebnisse verwenden.


Rheinwerk Computing

24.3.1 Exemplarische Java-Objekte  downtop

Ein mögliches Beispiel ist die Java-Variante eines luxuriöseren Arrays, dort Vektor genannt. Die Klasse heißt Vector und wird von JavaScript aus (und übrigens auch von Java) mit java.util.Vector angesprochen.

Mit den folgenden Befehlen wird eine Instanz des Java-Typs Vector erzeugt. Diese Instanz besitzt als Methoden alle als public deklarierten Methoden des Java-Objekts:

if (navigator.javaEnabled()) {
   var v = new java.util.Vector();
}

Dieser Vektor hat im Gegensatz zu einfachen JavaScript-Arrays Funktionen zum einfachen Entfernen und Hinzufügen von Elementen. Zwar gibt es bereits seit JavaScript 1.1 ein paar neue Möglichkeiten für JavaScript-Arrays, mit denen man diese neue Funktionalität ebenfalls erreichen kann, aber das ist nicht das Thema dieses Kapitels.

Ein weiteres interessantes Java-Objekt ist Hashtable. Das ist auch ein Array, aber die Indizes sind nicht numerisch, sondern können auch Zeichenketten sein. Man kann beispielsweise sehr einfach eine Abbildung von Monatsnamen auf Monatszahlen erreichen. JavaScript unterstützt dies zwar auch, jedoch nicht in allen Versionen. (Das übliche Problem: Alte Browser sollten weiterhin unterstützt werden.)

Im folgenden Beispiel könnten sowohl Vector als auch Hashtable verwendet werden. Wir beschränken uns hier aber auf Vector. Stellen Sie sich vor, Sie befinden sich in Las Vegas an einem Blackjack-Tisch. Sie haben ein einzelnes Kartenspiel vor sich und müssen es mischen und an die Spieler verteilen. Außerdem soll bei jedem Spieler angegeben werden, wie viele Punkte er mit seinen Karten erreicht hat. Eine vollständige Implementierung des Spiels ist Ihnen überlassen. J


Rheinwerk Computing

24.3.2 Blackjack  downtop

Zur Vorbereitung in aller Kürze die wichtigsten Blackjack-Regeln:

gp  Das Kartenspiel enthält in den vier Farben (Herz, Karo, Pik, Kreuz) die Nummernkarten 2 bis 10 sowie die Bildkarten Bube, Dame, König und das Ass. Insgesamt erhält man so ein Spiel (Deck) aus 52 Karten.
gp  Das Ziel des Spiels ist es, so nahe wie möglich an 21 Punkte heranzukommen, vor allem näher als die Bank, ohne jedoch die 21 Punkte zu überschreiten (das hat den sofortigen Verlust zur Folge).
gp  Eine Nummernkarte zählt so viele Punkte, wie auf der Karte stehen. Eine Bildkarte zählt zehn Punkte. Ein As zählt 11 Punkte, außer wenn der Spieler mit seinen Karten über 21 Punkte kommen würde (»überbieten«), dann zählt es einen Punkt. Hat ein Spieler also ein As und eine 7, so hat er 18 Punkte. Zwei Asse zählen als 12 Punkte, denn würden beide Asse mit 11 Punkten zählen, hätte der Spieler 22 Punkte und damit überboten. Analog zählen drei Asse als 13 Punkte.
gp  Hat der Spieler ein As und eine Karte, die zehn Punkte wert ist (eine Bildkarte oder die Zehn), so hat er einen »Blackjack«.
gp  Am Anfang des Spiels bekommt jeder Spieler zwei Karten zugeteilt.
gp  Weitere Regeln, etwa, was die Bank zu tun hat und wie man mehr Karten bekommen kann, sind nicht Thema dieses Buchs.

Die Strategie für die Blackjack-Applikation ist die folgende:

gp  In einer Schleife wird ein Array mit allen möglichen Karten gefüllt.
gp  Die Karten werden gemischt, indem immer ein Element aus dem Array zufällig ausgewählt, einem Spieler zugeteilt und aus dem Array entfernt wird.
gp  Bei jedem Spieler wird die Punktzahl seiner beiden Karten bestimmt. Diese Punktzahl wurde zuvor für einen schnellen Zugriff in einer Hashtable abgespeichert.

Rheinwerk Computing

24.3.3 Karten initialisieren  downtop

Jede Karte wird als Zeichenkette gespeichert. Hierbei werden die Farbe und die Kartenbezeichnung durch ein Trennzeichen, beispielsweise einen Leerzeichen, voneinander getrennt. Die äußere Schleife geht von 1 bis 13 (die Karten von 2 bis 10, König, Bube, Dame, Ass). Die innere Schleife geht von eins bis vier und umfasst die vier Farben. Die einzelnen Werte werden in einem Java-Vector gespeichert (natürlich nur zu Übungszwecken, denn, wie bereits gesagt wurde, geht das mit minimalem Mehraufwand auch mit reinen JavaScript-Mitteln). Die zugehörige, als public deklarierte Methode zum Einfügen eines Elements in ein Vector-Objekt heißt addElement(). Um noch ein wenig mehr Java zu verwenden, wird das zu übergebende String-Objekt auch als Java-Objekt generiert, obwohl man auch einfach die (JavaScript-)Zeichenkette hätte übergeben können.

function deck() {
   // Hilfsvariablen
   var kartenname = new Array();
   kartenname[0]="Zwei"; kartenname[1]="Drei";
   kartenname[2]="Vier"; kartenname[3]="Fünf";
   kartenname[4]="Sechs"; kartenname[5]="Sieben";
   kartenname[6]="Acht"; kartenname[7]="Neun";
   kartenname[8]="Zehn"; kartenname[9]="Bube";
   kartenname[10]="Dame"; kartenname[11]="König";
   kartenname[12]="Ass";
   var farben = new Array();
   farben[0] = "Herz"; farben[1] = "Karo";
   farben[2] = "Pik"; farben[3] = "Kreuz";
   //Array initialisieren; als Java-Vector!
   var cards = new java.util.Vector();
   for (var i=0; i<13; i++) {
      for (var j=0; j<4; j++) {
         temp = farben[j] + " " + kartenname[i];
         karte = new java.lang.String(temp);
         cards.addElement(karte);
      }
   }
   return cards;
}

Rheinwerk Computing

24.3.4 Karten mischen  toptop

Das Mischen gestaltet sich, wie bereits beschrieben, mit einem Vektor relativ einfach. Es wird ein beliebiges Element des Vector-Objekts bestimmt und aus dem Vektor herausgenommen. Parallel dazu wird ein neuer Vektor erzeugt, der die Elemente des »alten« Vektors enthält, nur in einer neuen, zufälligen Reihenfolge.

Um dies zu bewerkstelligen, werden die folgenden Java-Methoden des Vector-Objekts benötigt:

gp  size(): Liefert die Anzahl der Elemente im Vektor zurück.
gp  elementAt(i): Liefert das Element an der Position i im Vektor zurück. (Die Zählung beginnt – wie bei Arrays auch – bei 0.)
gp  removeElementAt(i): Löscht das Element an der Position i aus dem Vektor.
function mischen(alt) {
   var neu = new java.util.Vector();
   for (var i=alt.size(); i>0; i--) {
      var zufall = Math.floor(Math.random()*i);
      neu.addElement(alt.elementAt(zufall));
      alt.removeElementAt(zufall);
   }
   return neu;
}

Die Kartenverteilung und die Punktberechnung werden an dieser Stelle nicht dargestellt. An dieser Stelle folgt lediglich eine Beispielseite, die ein Kartenblatt mischt und auf dem Bildschirm ausgibt. Hierzu wird die toString()-Methode eines Vector-Objekts verwendet, die die Elemente des Vektors als Zeichenkette ausgibt.

Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 24.3     Das gemischte Kartenblatt

<html>
<head>
<title>Karten mischen</title>
<script "text/javascript"><!--
function deck() {
   // Hilfsvariablen
   var kartenname = new Array();
   kartenname[0]="Zwei"; kartenname[1]="Drei";
   kartenname[2]="Vier"; kartenname[3]="Fünf";
   kartenname[4]="Sechs"; kartenname[5]="Sieben";
   kartenname[6]="Acht"; kartenname[7]="Neun";
   kartenname[8]="Zehn"; kartenname[9]="Bube";
   kartenname[10]="Dame"; kartenname[11]="König";
   kartenname[12]="Ass";
   var farben = new Array();
   farben[0] = "Herz"; farben[1] = "Karo";
   farben[2] = "Pik"; farben[3] = "Kreuz";
   //Array initialisieren; als Java-Vector!
   var cards = new java.util.Vector();
   for (var i=0; i<13; i++) {
      for (var j=0; j<4; j++) {
         temp = farben[j]+" "+kartenname[i];
         karte = new java.lang.String(temp);
         cards.addElement(karte);
      }
   }
   return cards;
}
function mischen(alt) {
   var neu = new java.util.Vector();
   for (var i=alt.size(); i>0; i--) {
      var zufall = Math.floor(Math.random()*i);
      neu.addElement(alt.elementAt(zufall));
      alt.removeElementAt(zufall);
   }
   return neu;
}
function verteilen() {
   var c1 = deck();
   var c2 = mischen(c1);
   document.write(c2.toString());
}

//--></script>
</head>
<body>
<h3>Karten mischen</h3>
<script "text/javascript"><!--
   if (navigator.javaEnabled()) {
      verteilen();
   }

//--></script>
</body>
</html>

Auch wenn man darüber diskutieren kann, ob Java im Web noch eine Relevanz hat: Mit JavaScript ist es sehr einfach, auf Java zuzugreifen, sei es in Form eines Applets oder auch in Form eines Direktzugriffs auf Java-Klassen.




1  Bei Galileo Press ist ein vorzügliches Buch zu diesem Thema erschienen: »Java ist auch eine Insel« von Christian Ullenboom! Das findet man heute kaum noch, da es dem Spieler einen Vorteil gegenüber der Bank bringt.

 <<   zurück
  
  Zum Rheinwerk-Shop
Neuauflage: JavaScript
Neuauflage: JavaScript
bestellen
 Ihre Meinung?
Wie hat Ihnen das Openbook gefallen?
Ihre Meinung

 Buchtipps
Zum Rheinwerk-Shop: jQuery






 jQuery


Zum Rheinwerk-Shop: Einstieg in JavaScript






 Einstieg in JavaScript


Zum Rheinwerk-Shop: Responsive Webdesign






 Responsive Webdesign


Zum Rheinwerk-Shop: Suchmaschinen-Optimierung






 Suchmaschinen-
 Optimierung


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
InfoInfo




Copyright © Rheinwerk Verlag GmbH 2007
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern