Banner
{ Deutsch | English }
Mastermind

Mastermind − LX



Quellcode


Als erstes − wie immer − die Deklarationen der globalen Variablen.
<SCRIPT type="text/javascript">
Dies sind die Bilder für die verschiedenfarbigen Stifte. Das transparente Bild ist für ein leeres Loch.
var rot = new Image; rot.src = "rot.gif"; var gelb = new Image; gelb.src = "gelb.gif"; var gruen = new Image; gruen.src = "gruen.gif"; var orange = new Image; orange.src = "orange.gif"; var braun = new Image; braun.src = "braun.gif"; var blau = new Image; blau.src = "blau.gif"; var weiss = new Image; weiss.src = "weiss.gif"; var schwarz = new Image; schwarz.src = "schwarz.gif"; var select = new Image; select.src = "select.gif"; var leer = new Image; leer.src = "transparent.gif";
Die folgenden 3 Arrays beinhalten die Kombinationen. In Kombination[] wird die Auswahl des Computers abgelegt. Die anderen beiden sind temporäre Variablen für die Kombination des Computers und den Versuch des Spielers.
var Kombination = new Array(); var tKombination_comp = new Array(); var tKombination_play = new Array();
Das Spielfeld und Variablen für Zeilen und Spalten (und noch 2 temporäre Variablen).
var Spielfeld = new Array(); var Reihe,Spalte,tReihe,tSpalte;
das momentan ausgewählte Loch
var aktuellesFeld = 11;
für den Zufallsgenerator
var Zufall;
zwei Zählvariablen
var Zaehler,Zaehler2;
der aktuelle Versuch (man hat 7 um das Spiel zu gewinnen)
var Runde = 1;
eine Variable, um festzulegen, ob der Computer 2 Stifte derselben Farbe in seiner Kombination haben darf (1) oder nicht (0)
var doppelt = 1;
eine weitere temporäre Variable
var Temp;
Ausgabe ist zur Prüfung des Versuchs des Spielers. Output ist das gegenwärtige Loch, in welches der Computer seinen nächsten schwarzen oder weißen Stift stecken wird.
var Ausgabe,Output;
Dieser Teil initialisiert das Spielfeld.
for (Zaehler = 0; Zaehler < 7; Zaehler++) { Spielfeld[Zaehler] = new Array("leer","leer","leer","leer"); }
Diese Funktion tauscht Grafiken aus. Die Parameter bestimmen, welches Bild zuWelchem geändert wird.
function Wechsel(welches,zuWelchem) { window.document.images[welches].src = zuWelchem.src; }
Diese Funktion initialisiert das Spiel, wenn das Spiel zum ersten Mal aufgerufen oder ein neues Spiel gestartet wird.
function newGame() {
Das Spielbrett beinhaltet 7 Zeilen mit je 4 Löchern. Diese werden zu Beginn geleert, ebenso wie die 4 Löcher für die Auswertung des Computers.
for (Zaehler = 0; Zaehler < 7; Zaehler++) { for (Zaehler2 = 0; Zaehler2 < 4; Zaehler2++) { Wechsel('R' + Zaehler + 'Z' + Zaehler2, leer); Spielfeld[Zaehler][Zaehler2] = "leer"; } for (Zaehler2 = 6; Zaehler2 < 10; Zaehler2++) { Wechsel('R' + Zaehler + 'Z' + Zaehler2, leer); } }
Dieser Aufruf versteckt den Teil, in dem der Computer seine Kombination am Ende des Spiels verrät.
window.document.getElementById('ergebnis').style.visibility = 'hidden';
Jetzt wird die erste Runde definiert und alle bis auf den ersten OK-Button versteckt.
Runde = 1; window.document.getElementById('button0').style.visibility = 'visible'; window.document.getElementById('button1').style.visibility = 'hidden'; window.document.getElementById('button2').style.visibility = 'hidden'; window.document.getElementById('button3').style.visibility = 'hidden'; window.document.getElementById('button4').style.visibility = 'hidden'; window.document.getElementById('button5').style.visibility = 'hidden'; window.document.getElementById('button6').style.visibility = 'hidden';
Jetzt muss der Computer eine Kombination wählen und das erste Loch der ersten Reihe wird ausgewählt.
Kombi_waehlen(); auswaehlen(11); }
Diese Funktion wählt eine zufällige Farbe aus und gibt diese zurück.
function Farben() { Zufall = Math.random(); if (Zufall <= (1/6)) return "rot"; else if (Zufall <= (2/6)) return "orange"; else if (Zufall <= (3/6)) return "gelb"; else if (Zufall <= (4/6)) return "blau"; else if (Zufall <= (5/6)) return "braun"; else return "gruen"; }
Diese Funktion lässt den Computer seine Farben wählen.
function Kombi_waehlen() {
Wenn der Computer mehrere Stifte derselben Farbe in seiner Kombination haben darf, wird die eben beschriebene Funktion einfach viermal in Folge aufgerufen.
if (doppelt) { for (Zaehler = 0; Zaehler < 4; Zaehler++) { Kombination[Zaehler] = Farben(); } }
Ansonsten muss geprüft werden, ob die aktuelle Farbe bereits in der Kombination auftritt. Ist dies der Fall, so wird die Farben()-Funktion erneut aufgerufen, ansonsten wird die Farbe der gegenwärtigen Kombination hinzugefügt.
else { Kombination[0] = Farben(); while(1) { Kombination[1] = Farben(); if (Kombination[1] != Kombination[0]) break; } while(1) { Kombination[2] = Farben(); if ((Kombination[2] != Kombination[0]) && (Kombination[2] != Kombination[1])) break; } while(1) { Kombination[3] = Farben(); if ((Kombination[3] != Kombination[0]) && (Kombination[3] != Kombination[1]) && (Kombination[3] != Kombination[2])) break; } } }
Die folgende Funktion wählt das Loch aus, auf das der Spieler geklickt hat.
function auswaehlen(Feld) { Reihe = Math.floor(Feld / 10) - 1;
Natürlich sollte dieses sich in der momentan aktiven Zeile befinden, sonst gibt es keine Reaktion.
if (Reihe == Runde - 1) {
Wenn das soeben ausgewählte Loch leer geblieben ist, so wird das rote Quadrat einfach mit der transparenten Grafik ersetzt. Ansonsten bleibt die dort befindliche Grafik bestehen.
tReihe = Math.floor(aktuellesFeld / 10) - 1; tSpalte = aktuellesFeld % 10 - 1; if (Spielfeld[tReihe][tSpalte] == "leer") Wechsel('R' + tReihe + 'Z' + tSpalte,leer);
Das angeklickte Loch wird jetzt ausgewählt und geleert, unabhängig davon, ob sich hier vorher bereits ein Stift befand.
Spalte = (Feld % 10) - 1; Wechsel('R' + Reihe + 'Z' + Spalte,select); aktuellesFeld = Feld; Spielfeld[Reihe][Spalte] = "leer"; } }
Diese Funktion steckt einen farbigen Stift (die Farbe wird per Parameter übergeben) in das aktive Loch.
function einstecken(Farbe) { Reihe = Math.floor(aktuellesFeld / 10) - 1; Spalte = (aktuellesFeld % 10) - 1; Wechsel('R' + Reihe + 'Z' + Spalte,eval(Farbe)); Spielfeld[Reihe][Spalte] = Farbe; }
Diese Funktion wird aufgerufen, wenn der Spieler seinen Versuch beendet hat und die Auswertung des Computers haben möchte.
function checken(knopf) {
Es wird nichts passieren, solange ein Loch der aktiven Zeile leer geblieben ist.
if ((Spielfeld[knopf][0] != "leer") && (Spielfeld[knopf][1] != "leer") && (Spielfeld[knopf][2] != "leer") && (Spielfeld[knopf][3] != "leer")) {
Zuerst wird der OK-Button ausgeblendet. Dann werden 2 temporäre Variablen erzeugt, die den Versuch des Spielers und die Kombination des Computers beinhalten. Ausgabe beinhaltet zu Beginn 4×1 für die 4 Stifte. Wenn es einen genauen Treffer auf einer Position gibt, so wird die entsprechende Ziffer um 2 erhöht. Stimmt die Farbe eines Stiftes, aber nicht dessen Position, so wird die Stelle um 1 inkrementiert.
window.document.getElementById('button' + knopf).style.visibility = 'hidden'; Ausgabe = 1111; for (Zaehler = 0; Zaehler < 4; Zaehler++) { tKombination_comp[Zaehler] = Kombination[Zaehler]; tKombination_play[Zaehler] = Spielfeld[knopf][Zaehler]; }
Output zeigt auf das Loch, in welches der Computer seinen nächsten Stift stecken wird. Dann werden die beiden Kombinationen verglichen und wenn ein exakter Treffer gefunden wird, wird der entsprechende Stift aus der temporären Kombination entfernt und ein schwarzer Stift in das von Output definierte Loch gesteckt.
Output = 6; for (Zaehler = 0; Zaehler < 4; Zaehler++) { if (tKombination_play[Zaehler] == Kombination[Zaehler]) { Ausgabe += (2 * Math.pow(10,Zaehler)); Wechsel('R' + knopf + 'Z' + Output,schwarz); Output++; tKombination_comp[Zaehler] = "leer"; tKombination_play[Zaehler] = "leer"; } }
Dann wird auf Stifte derselben Farbe an anderen Positionen geprüft.
for (Zaehler = 0; Zaehler < 4; Zaehler++) { if (tKombination_play[Zaehler] != "leer") { for (Zaehler2 = 0; Zaehler2 < 4; Zaehler2++) { if (tKombination_play[Zaehler] == tKombination_comp[Zaehler2]) { Ausgabe += Math.pow(10,Zaehler); Wechsel('R' + knopf + 'Z' + Output,weiss); Output++; tKombination_play[Zaehler] = "leer"; tKombination_comp[Zaehler2] = "leer"; break; } } } }
Wenn alle Ziffern um 2 erhöht wurden, sind die beiden Kombinationen identisch. Ist dies der Fall, ist das Spiel zu Ende und die Ergebnis()-Funktion wird aufgerufen.
if (Ausgabe == 3333) Ergebnis();
Andernfalls wird geprüft, ob der Spieler noch einen weiteren Versuch hat. Trifft das zu, wird der entsprechende OK-Button eingeblendet, die aktuelle Runde erhöht und das erste Loch der nächsten Reihe selektiert. Ansonsten ist das Spiel ebenfalls vorbei und Ergebnis() wird aufgerufen.
else if (knopf < 6) { window.document.getElementById('button' + (knopf + 1)).style.visibility = 'visible'; Runde++; auswaehlen(eval(Runde + '1')); } else Ergebnis(); } }
Diese Funktion beendet das Spiel. Der Computer verrät seine Kombination und Runde ist erhöht, sodass keine weitere Aktionen mehr ausgeführt werden können.
function Ergebnis() { window.document.getElementById('ergebnis').style.visibility = 'visible'; for (Zaehler = 0; Zaehler < 4; Zaehler++) { Wechsel('E' + Zaehler,eval(Kombination[Zaehler])); } Runde = 10; } </SCRIPT>
Nun zum HTML-Teil des Spiels. Ich lasse die Formatierungen wieder aus und zeige nur die Elemente, die für das Spiel benötigt werden. Wir brauchen 7 OK-Buttons, ...
<TABLE> <TR> <TD> <INPUT id="button6" type="button" value="OK" onClick="checken(6)"> </TD> </TR> <TR> <TD> <INPUT id="button5" type="button" value="OK" onClick="checken(5)"> </TD> </TR> <TR> <TD> <INPUT id="button4" type="button" value="OK" onClick="checken(4)"> </TD> </TR> <TR> <TD> <INPUT id="button3" type="button" value="OK" onClick="checken(3)"> </TD> </TR> <TR> <TD> <INPUT id="button2" type="button" value="OK" onClick="checken(2)"> </TD> </TR> <TR> <TD> <INPUT id="button1" type="button" value="OK" onClick="checken(1)"> </TD> </TR> <TR> <TD> <INPUT id=button"0" type="button" value="OK" onClick="checken(0)" style="visibility:visible"> </TD> </TR> </TABLE>
... 7×4 Ausgabe-Löcher für die Auswertung des Computers, ...
<TABLE> <TR> <TD> <IMG src="transparent.gif" name=R6Z8 alt=""> <IMG src="transparent.gif" name=R6Z9 alt=""> <BR> <IMG src="transparent.gif" name=R6Z6 alt=""> <IMG src="transparent.gif" name=R6Z7 alt=""> </TD> </TR> <TR> <TD> <IMG src="transparent.gif" name=R5Z8 alt=""> <IMG src="transparent.gif" name=R5Z9 alt=""> <BR> <IMG src="transparent.gif" name=R5Z6 alt=""> <IMG src="transparent.gif" name=R5Z7 alt=""> </TD> </TR> . . . <TR> <TD> <IMG src="transparent.gif" name=R0Z8 alt=""> <IMG src="transparent.gif" name=R0Z9 alt=""> <BR> <IMG src="transparent.gif" name=R0Z6 alt=""> <IMG src="transparent.gif" name=R0Z7 alt=""> </TD> </TR> </TABLE>
... 7×4 Eingabe-Löcher für die Versuche des Spielers, ...
<TABLE> <TR> <TD> <IMG src="transparent.gif" name=R6Z0 alt="" onclick="auswaehlen(71)"> <IMG src="transparent.gif" name=R6Z1 alt="" onclick="auswaehlen(72)"> <IMG src="transparent.gif" name=R6Z2 alt="" onclick="auswaehlen(73)"> <IMG src="transparent.gif" name=R6Z3 alt="" onclick="auswaehlen(74)"> </TD> </TR> <TR> <TD> <IMG src="transparent.gif" name=R5Z0 alt="" onclick="auswaehlen(61)"> <IMG src="transparent.gif" name=R5Z1 alt="" onclick="auswaehlen(62)"> <IMG src="transparent.gif" name=R5Z2 alt="" onclick="auswaehlen(63)"> <IMG src="transparent.gif" name=R5Z3 alt="" onclick="auswaehlen(64)"> </TD> </TR> . . . <TR> <TD> <IMG src="transparent.gif" name=R0Z0 alt="" onclick="auswaehlen(11)"> <IMG src="transparent.gif" name=R0Z1 alt="" onclick="auswaehlen(12)"> <IMG src="transparent.gif" name=R0Z2 alt="" onclick="auswaehlen(13)"> <IMG src="transparent.gif" name=R0Z3 alt="" onclick="auswaehlen(14)"> </TD> </TR> </TABLE>
... 4 Löcher für die Kombination des Computers, die gezeigt wird, wenn das Spiel vorbei ist, ...
<TABLE id="ergebnis" style="visibility:hidden"> <TR> <TD> <IMG src="transparent.gif" name=E0 alt=""> <IMG src="transparent.gif" name=E1 alt=""> <IMG src="transparent.gif" name=E2 alt=""> <IMG src="transparent.gif" name=E3 alt=""> </TD> </TR> </TABLE>
... einen Button, um das Spiel neu zu starten, ...
<FORM name="out" action=""> <INPUT type="button" onClick="newGame()" value="New Game">
... eine Auswahl, ob der Computer mehrere Stifte derselben Farbe in seiner Kombination haben darf ...
<INPUT type="radio" checked onClick="doppelt = 1; newGame()" name="schalter"> yes/ja<BR> <INPUT type="radio" onClick="doppelt = 0; newGame()" name="schalter"> no/nein</FORM>
und schließlich natürlich 6 farbige Stifte zum Anklicken, um sie in die Löcher zu stecken.
<A href="javascript:einstecken('rot')"> <IMG src="rot.gif" alt="" border="0"> </A> <A href="javascript:einstecken('gelb')"> <IMG src="gelb.gif" alt="" border="0"> </A> <A href="javascript:einstecken('gruen')"> <IMG src="gruen.gif" alt="" border="0"> </A> <A href="javascript:einstecken('orange')"> <IMG src="orange.gif" alt="" border="0"> </A> <A href="javascript:einstecken('braun')"> <IMG src="braun.gif" alt="" border="0"> </A> <A href="javascript:einstecken('blau')"> <IMG src="blau.gif" alt="" border="0"> </A>
Zuletzt muss nur noch das Spiel gestartet werden, nachdem der HTML-Part geladen ist.
<SCRIPT type="text/javascript"> Kombi_waehlen(); auswaehlen(11); </SCRIPT>