Bedingungen und Schleifen

Dieses Tutorial knüpft direkt am “Kommentare und Variablen“-Tutorial an.

Die bisherigen Beispiele waren allesamt noch recht Linear doch mit Schleifen und Bedingungen, können wir etwas interaktivität in unserem Programm einbringen.

Mit Hilfe von Vergleichsoperatoren können wir verschiedene Werte miteinander vergleichen. Als erstes möchte ich aber auf eine häufige Fehlerursache hinweisen, die vor allem Neulinge betrifft. Der Vergleichsoperator für „Gleich“ besteht aus zwei „istgleich“-Zeichen(==). Ein einfaches “=“-Zeichen wird für eine Zuweisung verwenden und kann nicht als Vergleichsoperator verwendet werden. Das sollte man sich gut einprägen.

  • == Gleich
  • > Größer
  • >= Größer gleich
  • < Kleiner
  • <= Kleiner gleich
  • != ungleich

If-Bedingung

Bevor wir uns die if–Bedingung näher anschauen, gibt es hier nochmal den vorherigen Code. Diesen habe ich allerdings um eine Variable und zwei if-Bedingung erweitert.

var punkte = 160254;	                     //Gesamtpunktzahl 
var multiplikator = 503;	             //Multiplikator 
var benoetigteZeit = 34;		     //benötigte Zeit 
var maxZeit = 60;	                     //Zeitbegrenzung 
var zeitBonus = maxZeit % benoetigteZeit;    //Zeitbonus (differenz) 
var highscore = 54236987;	             //aktuelle Highscore  
 
var summe = (punkte + zeitBonus) * multiplikator;  
 
print('Zeitbonus :' + zeitBonus); 
print('Punkte	 :' + punkte); 
print('multiplikator:' + multiplikator); 
print('Gesamtpunkte:' + summe);
 
if (summe > highscore) 
{
    print("neue Highscore!");  
}   
if (summe < highscore) 
{
    print("Highscore wurde nicht geknackt");
}

Hier sehen wir nun die if-Bedingung in Aktion. Das Schlüsselwort if prüft, ob die Bedingungen die zwischen den Klammern stehen, zutreffen. Hier prüfen wir nun ob die Summe größer bzw. kleiner als die aktuelle Highscore ist.

Die if-Bedingung darf übrigens nie mit einem Semikolon enden. Die geschweiften Klammern könnte man in diesem Beispiel auch einfach weglassen. Wenn man aber mehrere Zeilen Code ausführen möchte, dann benutzt man so genannte Codeblöcke, die von geschweiften Klammern umschlossen sind. Ich habe aber auch in diesem Beispiel die geschweiften Klammern genommen, da ich es so einfach wesentlich übersichtlicher finde. Es ist auch möglich, Bedingungen und Schleifen in einemm Codeblock zu schreiben.

Mit einem kleinen aber feinen Schlüsselwort können wir uns in diesem Beispiel noch einige Zeilen Code sparen. Es geht um das Schlüsselwort else. Zum ausprobieren, ersetzen wir die beiden if-Bedingungen aus dem vorherigen Beispiel durch Folgendes:

if (summe > highscore) 
{ 
 	print("neue Highscore!");  
} else { 
	print("Highscore wurde nicht geknackt");  
}
Ist die Endsumme größer als die aktuelle Highscore, dann teilt uns das Programm mit, dass wir eine neue Highscore erreicht haben, ansonsten (else) wird die zweite Meldung ausgegeben. Wir können dem else ebenfalls eine if-Bedingung zuweisen. Das geht wie folgt:

if (summe > highscore) 
{ 
 	print("neue Highscore!");  
} else if (summe < highscore) {
 	print("Highscore wurde nicht geknackt");  
}

So wird der untere Codeblock nur unter der entsprechenden Bedingung ausgeführt. Macht in diesem Beispiel noch nicht viel Sinn, kann aber später noch sehr nützlich werden.

switch und case

Wenn in einem Script viele Bedingungen benötigt werden, kann das mit if und else manchmal sehr unübersichtlich werden. Für den Fall bietet uns JavaScript mit den Schlüsselwörtern switch und case eine elegante Alternative zu if. Switch bedeutet soviel wie „Schalter“ und genauso funktioniert es auch. Case bedeutet schlicht und einfach „falls“. Als Beispiel habe ich mal eine imaginäre Modusauswahl erstellt.

var auswahl = "2";  
 
print ("Bitte wähle den Spielmodus"); //Imaginäre Modiwahl  
switch (auswahl) 
{
 	case "1":
 		print("1: Du hast den Time Attack Modus gewählt");
 	break;
 
  	case "2":
 		print("2: Du hast den Classic Modus gewählt");
 	break;
 
 	case "3":
 		print("3: Du hast den Multiplayer Modus gewählt");
 	break;
 
	default:
 		print("Falsche Eingabe");
 	break; 
}  
 
print("switch ende");

Das Ganze hätten wir selbstverständlich auch via if-else lösen können, allerdings nicht so übersichtlich.

In der ersten Zeile definieren wir unsere Auswahl-Variable. Ich habe sie der Einfachheit zu liebe mal vordefiniert. Wie wir sehen können, folgt auch nach dem switch kein Semikolon und zwischen den Klammern, wird keine Bedingung definiert sondern eine Variable übergeben.

Der case Block beginnt mit case(): (Achtung, hier wird ein Doppelpunkt verwendet, kein Semikolon.) und endet bei break;. Wir haben also unsere Auswahl-Variable an switch übergeben und mit case können wir diese behandeln. Enthält die Variable also den in den Anführungszeichen geschriebenen Wert, so wird der darauf folgende Code ausgeführt. Nachdem das getan ist, kommt break ins Spiel. break sorgt dafür, dass wir aus dem aktuellen Codeblock herausspringen und die Ausführung erst wieder nach dem switch-Block weitergeht. Das wird hier anhand der letzten print() Anweisung noch einmal verdeutlicht. Lässt man break weg, so wird auch der darauf folgende Code ausgeführt.

Was aber, wenn keine der Bedingungen erfüllt wird? Genau für diesen Fall ist default: da. Default ist quasi der Notnagel und wird immer dann ausgeführt, wenn keine der anderen Bedingungen zutrifft.

For-Schleife

Mit der for-Schleife ist es möglich, einen bestimmten Code mehrmals auszuführen. Beispielsweise möchten wir Gegner erzeugen und den ganzen Code nicht für jeden Gegner einzeln schreiben. Das würde nicht nur Unmengen von Code erzeugen sondern auch wesentlich mehr Zeit kosten, wenn man an den Code etwas ändern möchte. Selbstverständlich gibt es auch hierfür ein kleines Beispiel.

var Gegner = "5";
 
for (var i=0; i<Gegner ; i++)
{
	print("Gegner Nr." + i);	
}

Wenn wir diesen Code ausführen, wird der Code im Codeblock der for-Schleife 5 mal ausgeführt. Vor allem die Bedingungen der for-Schleife bedürfen einige Erklärungen.

In der Klammer steht nun wie sich die Schleife verhalten soll. Als erstes wird die Variable i deklariert und gleichzeitig definiert. Dies geschieht nur bei der Initialisierung der Schleife und findet nur beim ersten Durchlauf statt. Der zweite Teil beschreibt die Bedingung unter der die Schleife ausgeführt werden soll. Die Schleife wird also nur solang ausgeführt, bis die Bedingung nicht mehr wahr ist. In diesem Besipiel wird geprüft, ob i kleiner als die Variable Gegner ist. Solang i also kleiner als die Variable ist, wird der Code ausgeführt.

Im nächsten Teil wird eine Aktion definiert, die nach jedem Schleifendurchlauf ausgeführt wird. In diesem Fall zählen wir einfach i um eins hoch. Hier sind alle Rechenoperatoren erlaubt.

Im Codeblock lassen wir uns dann etwas Text ausgeben, der uns zudem den Wert von i zeigt. Die Variable i ist übrigens nur in der Schleife gültig. Außerhalb der Schleife haben wir keinen Zugriff auf diese Variable.

Man kann sich das ganze Verhalten recht einfach merken:

for (Initialisierung;Bedingung;Aktion)
{
     ausführung;
}

Die Initialisierung geschieht nur einmal, die Bedingung wird bei jedem Durchlauf geprüft, dann folgt die Ausführung des Codeblocks und erst jetzt wird der Aktionsteil ausgeführt.

do-while

Es gibt aber noch weitere Möglichkeiten, einen bestimmten Code mehrfach auszuführen.

var Gegner = 0;
while (Gegner != 10) 
{
 	print(Gegner + " Gegner wurden erzeugt");
 	Gegner++; 
}
Der Code wird nun solang ausgeführt, wie die Bedingung Gegner != 10 wahr ist. Unter verschiedenen Bedingungen kann es vorkommen, dass die Bedingung für die while Schleife nicht zutrifft, so wird die Schleife erst garnicht ausgeführt. Dafür gibt es zusaätzlich das Schlüsselwort do.
var Gegner = 0;
 
do
{
 	print(Gegner + " Gegner wurden erzeugt");
 	Gegner++;
} while (Gegner != 10);

Mit dem Schlüsselwort do wird der Codeteil mindestens einmal ausgeführt, denn erst wird die Bedingung überprüft.

tutorials/scripting/01_bedingungen_und_schleifen.txt · Zuletzt geändert: 2009/02/24 15:17 von dave
CC Attribution-Noncommercial-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki Recent changes RSS feed Valid XHTML 1.0