Rheinwerk Design < openbook > Rheinwerk Design - Know-how für Kreative.
Know-how für Kreative.

Inhaltsverzeichnis
Vorwort
1 Flash für ActionScript
2 ActionScript in Flash
3 Flash Pro für ActionScript
4 Grundlagen der Programmierung
5 Einfache Filmsteuerung
6 Bildschirme und Präsentationen
7 Drucken und das Kontextmenü
8 Textfelder
9 Tasten
10 Datum und Zeit
11 Rechnen
12 Farbe wechseln und Drag
13 Zeichnen und Zufall
14 Von Mäusen und Duplikaten
15 Kollisionstest
16 Sound
17 Video
18 Externe Filme
19 Vorladen und Player erkennen
20 Formulare und UI-Komponenten
21 Komponenten anpassen
22 Formulare versenden
23 Warenkorb
24 Ausblick auf ActionScript 3
Stichwort
Ihre Meinung?

Spacer
 <<   zurück
Einstieg in ActionScript von Christian Wenz, Tobias Hauser, Armin Kappler
Aktuell zu Flash 8
Buch: Einstieg in ActionScript

Einstieg in ActionScript
brosch., mit CD und QuickFinder und Referenz
416 S., 24,90 Euro
Rheinwerk Design
ISBN 978-3-89842-774-6
Pfeil 11 Rechnen
  Pfeil 11.1 Einfache Rechenhilfen
  Pfeil 11.2 Bögen und Trigonometrie
  Pfeil 11.3 Zufall und Runden


Rheinwerk Computing - Zum Seitenanfang

11.3 Zufall und Runden  topZur vorigen Überschrift

Zufallszahlen spielen in ActionScript eine große Rolle. Sie sind die Basis für interessante Animationen (siehe Kapitel 13, »Zeichnen und Zufall«) und bringen Abwechslung in Spiele. Zufallszahlen treffen Entscheidungen für Sie, wenn Sie nicht wissen, ob Sie A oder B wählen möchten. Bevor Sie aber ihre erste Zufallszahl generieren, erklären wir Ihnen, wie Sie krumme Zahlen runden und in ganze Zahlen verwandeln.

Runden und Artverwandtes

Das Math-Objekt bietet verschiedene Methoden, um aus krummen Zahlen gerade bzw. ganze Zahlen zu machen:

  • Math.round(Zahl) rundet eine Zahl zur nächsten ganzen Zahl auf oder ab:
Math.round(3.62); //ergibt 4
  • Math.ceil(Zahl) erhöht eine Zahl auf die nächste ganze Zahl:
Math.ceil(3.43); //ergibt 4
  • Math.floor(Zahl) verringert eine Zahl auf die nächstkleinere ganze Zahl:
Math.floor(3.65); //ergibt 3
  • Math.max(Zahl1, Zahl2) liefert die größere der beiden Zahlen:
Math.max(2.1, 2.2); //ergibt 2.2
  • Math.min(Zahl1, Zahl2) nennt die geringere der beiden Zahlen:
Math.min(2.1, 2.2); //ergibt 2.1

Altes Flash

In Flash 4 gab es das Math-Objekt noch nicht. Eine Zufallszahl entstand durch die Funktion random(Maximalzahl), die es in Flash 8 immer noch gibt. random() liefert eine ganze Zufallszahl ohne Kommastelle zwischen 0 und der Maximalzahl abzüglich 1. Das heißt also, es werden insgesamt so viele Zufallszahlen ausgegeben, wie die Höhe der Maximalzahl beträgt. Bei Math.random() müssen Sie für das gleiche Ergebnis zwar etwas mehr tun, da aber hier die Zufallszahlen-Berechnung besser ist, geben wir Math.random() den Vorzug.


Ist Ihnen etwas aufgefallen? Sie können mit keiner der Methoden auf Nachkommastellen runden. Dazu benötigen Sie einen kleinen Trick: Sie multiplizieren die zu rundende Zahl zuerst mit 10 für jede Nachkommastelle, die Sie möchten. Nach dem Runden teilen Sie wieder. Wir zeigen Ihnen das am Beispiel von . Ziel ist, auf zwei Stellen nach dem Komma zu runden. Dafür multiplizieren Sie mit 100 (10 × 10), runden dann und teilen anschließend durch 100:

Math.round(Math.PI * 100) / 100;

Das Ergebnis ist 3.14.

Beliebige Zufallszahlen

Die Methode random() des Math-Objekts liefert eine Zufallszahl. Soweit die gute Nachricht, die schlechte: Diese Zahl liegt irgendwo zwischen 0 und kleiner 1, und zwar mit einer Unmenge an Nachkommastellen.

Abbildung 11.8 ActionScript liefert eine Zufallszahl mit vielen Nachkommastellen.

In der Praxis benötigen Sie meist eine bestimmte Anzahl an Zufallszahlen. Sie wollen beispielsweise die sechs Zahlen eines Würfels simulieren, eine Entscheidung zwischen zwei Zuständen treffen oder eine aus 255 Farben auswählen.

Folgende Überlegungen helfen Ihnen beim Grundverständnis von Zufallszahlen weiter: Die unten stehende Formel liefert zufällige Zahlen zwischen der unteren Grenze A und der oberen B.

var zahl_num:Number = A + Math.floor(Math.random() * (B – A + 1));

An einem Beispiel sehen Sie, dass die folgende Zeile die zufälligen Zahlen zwischen 1 und 11 ausgibt:

var zahl_num:Number = 1 + Math.floor(Math.random() * (11 – 1 + 1));

Vorsicht, Sie dürfen zum Runden nicht Math.round() nehmen, wenn die Zufallszahlen gleich verteilt sein sollen. Mit Math.round() wären die erste Zufallszahl (hier 1) und die letzte (11) Zahl unwahrscheinlicher, als die anderen Werte.

Das nächste Beispiel besteht hauptsächlich aus Textfeldern und soll ein einfaches »17 und 4«-Spiel simulieren (auch bekannt als »Black Jack«). Bei diesem Spiel zieht der Nutzer eine Karte, die einen Wert zwischen 1 und 11 hat. Der Spieler darf so lange ziehen, wie er will. Wichtig ist allerdings, dass er mit dem gesamten Kartenwert nicht über 21 Punkte kommt. Er muss aber möglichst nahe an den Wert 21 gelangen, um den Computer zu besiegen. Die Ausgangsdatei finden Sie unter dem Namen 17und4.fla auf der CD-ROM (in den Ordnern Flash8, FlashMX2004 und FlashMX).


Zufall in Flash 5

Der Flash-Player 5 generiert in manchen Versionen die Zufallszahl inklusive der 1.0. In dem Beispiel wäre das Ergebnis für diesen seltenen Fall die 7. Sie können das Ergebnis mit einer do-while-Schleife aussortieren, wenn Sie noch für den Flash-Player 5 produzieren:

do {

var zufall_num:Number = Math.random();

} while (zufall_num == 1);

var zahl_num:Number = 1 + Math.floor(zufall_num * (11 – 1 +1));


Abbildung 11.9 Der Aufbau des »17 und 4«-Films.

Zum Steuern des Spiels gibt es drei Schaltflächen: Start zieht für den Nutzer und den Computer eine Karte. Karte legt dem Nutzer eine Karte nach. Der Computer soll je nach Punktzahl entscheiden. Ein Klick auf Ende wertet das Spiel, der Computer kann vorher noch Karten ziehen.

Wenn Sie ein solches Spiel oder eine ähnliche Anwendung in Angriff nehmen, müssen Sie ganz zu Anfang gut überlegen, welche Funktionaliät Ihre Anwendung haben soll. Programmieren besteht zu einem großen Teil aus Logik; Vorausdenken hilft, die Pfade der Logik nicht zu verlassen.

Abbildung 11.10 Die drei Schaltflächen links unten dienen zur Steuerung des Spiels.

Schritt für Schritt: »17 und 4«

Der Code landet im ersten Schlüsselbild des Hauptfilms auf der Ebene ActionScript. Für die drei Schaltflächen arbeiten Sie mit Ereignisprozeduren.

Wie meistens benötigen Sie am Anfang einige Variablen:

var summeS_num:Number, summeC_num:Number;
var karteS_num:Number, karteC_num:Number;

summeS_num nimmt die Gesamtpunktzahl des Spielers auf, summeC_num die des Computers. karteS_num speichert den gerade gezogenen Kartenwert des Spielers, karteC_num den des Computers.

Noch ein kleiner Tipp: Wenn Sie beim Programmieren sind, fällt es oft schwer, wichtige Variablen an den Anfang zu stellen und zu definieren. Die Variablen tauchen eher später im Code auf. Sie können sie dann beim zweiten Durchgehen an den Anfang des Codes stellen, um ihn übersichtlicher zu gestalten.

Rufen Sie eine Funktion auf, die die Anfangswerte für den Spieler und den Computer setzt:

initialisierung();

Warum packen wir diese Anweisungen in eine Funktion und schreiben sie nicht einfach so hin? Denken Sie an das Ende eines Spiels, auch dort müssen Sie die Werte wieder zurücksetzen, um ein neues Spiel zu starten. Genauso können Sie die Funktion initialisierung() wieder verwenden.

Setzen Sie jetzt mit der Funktion initialisierung() die Grundwerte:

function initialisierung() {
   kartenwertSpieler_str = "0";
   gesamtwertSpieler_str = "0";
   kartenwertComp_str = "0";
   gesamtwertComp_str = "0";
   summeS_num = 0;
   summeC_num = 0;
}

Die Textfelder für die Gesamtpunktzahl und die Punktzahl der aktuellen Karte werden für Spieler und Computer auf »0« gesetzt. Die Summen von Spieler und Computer erhalten ebenfalls den Wert 0. Letzteres ist wichtig, wenn vorher bereits ein Spiel stattgefunden hat.

Abbildung 11.11 Die Funktion initialisierung() setzt die Startwerte auf »0«.

Das eigentliche Spiel beginnt bei einem Klick auf die Start-Schaltfläche. Dafür geben Sie diesen Code ein:

start_btn.onRelease = function() {
   anzeige_str = "Los gehts!";
   initialisierung();
   karteziehen();
   computerzug();
};

Es passiert Folgendes: Der Text in der Anzeige oben ändert sich, die Werte werden mit der Funktion initialisierung() zurückgesetzt (dies ist wichtig, wenn bereits ein Spiel stattgefunden hat). Der Nutzer zieht eine Karte (Funktion karteziehen()) und der Computer zieht eine Karte (Funktion computerzug()).

Dieses Beispiel veranschaulicht, wie Sie mit Funktionen Code wiederverwendbar machen.

Nun kommt die erste Zufallszahl zum Einsatz. Den Wert der Karte, die der Spieler zieht, bestimmen Sie mit einer Zufallszahl:

function karteziehen() {
   karteS_num = 1 + Math.floor(Math.random() * 11);

Die Zufallszahl liefert einen Wert zwischen 1 und 11. Der Wert der Karte wird zur Gesamtsumme aller Kartenwerte des Spielers addiert:

   summeS_num = summeS_num + karteS_num;

Zum Schluss geben Sie beide Ergebnisse zu Strings umgewandelt in die zugehörigen Textfelder aus:

   kartenwertSpieler_str = karteS_num.toString();
   gesamtwertSpieler_str = summeS_num.toString();
}

Der Zug des Computers verläuft genauso wie der Zug des Spielers:

   karteC_num = 1 + Math.floor(Math.random() * 11);
   summeC_num = summeC_num + karteC_num;
   kartenwertComp_str = karteC_num.toString();
   gesamtwertComp_str = summeC_num.toString();
   return summeC_num;
}

Abbildung 11.12 Nach einem Klick auf Start ziehen Spieler und Computer automatisch eine Karte.

Den Spieler lassen Sie bei Klick auf die Karte-Schaltfläche erneut eine Karte ziehen (Funktion karteziehen()). Der Computer zieht dagegen nur dann eine neue Karte, wenn die Gesamtsumme seiner gezogenen Werte 18 oder weniger beträgt:

karte_btn.onRelease = function() {
   karteziehen();
   if (summeC_num <= 18) {
      computerzug();
   }
};

Die Computerlogik ist hier sehr einfach aufgebaut. Im Casino wird eine ähnliche Logik verwendet, allerdings reagiert der Croupier hier auf <= 16, wobei die Wahrscheinlichkeit eine Karte mit dem Wert 10 dort auch höher ist. Sie können diese Logik beliebig erweitern und den Computer beispielsweise auf die Augenzahl reagieren lassen, die der Nutzer zu diesem Zeitpunkt besitzt.

Abbildung 11.13 Zweiter Zug: Spieler und Computer ziehen erneut eine Karte.

Wenn der Spieler genug Karten gezogen hat, klickt er auf die Ende-Schaltfläche. Der Computer zieht so lange weiter, bis er eine Gesamtsumme von mehr als 18 hat. Dazu verwenden Sie eine while-Schleife:

ende_btn.onRelease = function() {
   while (summeC_num <= 18) {
      computerzug();
   }

Ist der Computer fertig, rufen Sie die Funktion vergleich() auf, die das Spiel auswertet:

   vergleich();
};

Sie müssen die Funktion vergleich() programmieren, damit sie mit einer if-else if-Fallunterscheidung überprüft, wer gewonnen hat:

function vergleich() {
   if (summeS_num > summeC_num && summeS_num <= 21) {
      anzeige_str = "Sie haben gewonnen!";
   }
   else if (summeS_num <= summeC_num && summeC_num <= 21) {
      anzeige_str = "Sie haben verloren!";
   }
   else if (summeC_num > 21 && summeS_num <= 21) {
      anzeige_str = "Sie haben gewonnen!";
   }
   else if (summeS_num > 21) {
      anzeige_str = "Sie haben verloren!";
   }
}

Der Spieler hat gewonnen, wenn der Geamtwert seiner Karten höher ist als der des Computers, aber maximal 21. Hat der Spieler weniger als 21, aber auch weniger oder nur genauso viele Punkte wie der Computer, hat er verloren (Sie könnten hier ein Unentschieden einführen). Hat der Spieler einen maximalen Wert von 21, der Computer aber mehr als 21, hat der Spieler gewonnen. Sobald der Spieler mehr als 21 Punkte hat, hat er immer verloren.

Abbildung 11.14 Das war ein deutlicher Sieg!

Da unser Beispiel sehr komplex und nicht gerade einfach war, sollten Sie es noch einmal in Ruhe nachvollziehen. Sie finden die fertige Datei unter dem Namen 17und4_AS2.fla im Ordner Flash8 bzw. FlashMX2004 oder unter 17und4_AS1.fla im Ordner FlashMX. Falls Sie verschiedene Variationen ausprobieren möchten, empfehlen wir Ihnen, zuerst die Taktik des Computers ein wenig zu verfeinern. Wir bieten Ihnen auf der CD-ROM die Datei 17und4_ci_AS2.fla bzw. für Flash MX 17und4_ci_AS1.fla an; sie wurde um die entsprechende Logik erweitert. Die Erklärungen dazu finden Sie in den Kommentaren im Code.

 



Ihre Meinung

Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.

 <<   zurück
  
  Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: ActionScript 3 – Das Praxisbuch
ActionScript 3
Das Praxisbuch

bestellen
 Ihre Meinung?
Wie hat Ihnen das Openbook gefallen?
Ihre Meinung

 Buchtipps
Zum Rheinwerk-Shop: JavaScript






 JavaScript


Zum Rheinwerk-Shop: jQuery






 jQuery


Zum Rheinwerk-Shop: Responsive Webdesign






 Responsive Webdesign


Zum Rheinwerk-Shop: Suchmaschinen-Optimierung






 Suchmaschinen-
 Optimierung


Zum Rheinwerk-Shop: Schrödinger lernt HTML5, CSS3 und JavaScript






 Schrödinger lernt
 HTML5, CSS3
 und JavaScript


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




Copyright © Rheinwerk Verlag GmbH 2006
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 GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern