JavaScript-Memory
Hallo!
Also, ich möchte gerne ein Memory haben, welches beispielsweise 15 Karten hat. Jetzt soll es aber nicht so sein, dass ich 16 Bilder habe, die jedes Mal in dem Memory vorkommen, sondern ich habe 160 Bilder, von denen immer 16 in dem Memory vorkommen. Also es sollen eben nicht immer die gleichen 15 Bilder sein.
Ich habe für das Memory folgenden Quelltext im Internet gefunden:
<html>
<head>
<title>Maximilians JavaScript-Memory</title>
<script language="JavaScript">
/* Dieses Skript ist mir nach drei Naechten und zwei Tagen harter */
/* Arbeit geglueckt. Die Anzahl der Motive betraegt 8, die in den */
/* Bildern a1 bis a8.jpg gespeichert werden. Mit ein bisschen */
/* Nachdenken laesst sich die Zahl der Spielkarten veraendern. */
/* Dieses Skript könnt Ihr frei verwenden. Ich freue mich aber ueber */
/* eine Dankeschoen-E-Mail */
/* */
/* Maximilian Eberl, 1.-4. Januar 2000 */
/* maximilianeberl@web.de */
var auf=0; // Anzahl der offenen Karten
var ersteauf=0; // Bildnummer der ersten aufgedeckten Karte
var zweiteauf=0; // Bildnummer der zweiten aufgedeckten Karte
var versuche=0;
var treffer=0;
leer = new Array(16);
for (w=0;w<=15;w++)
{
leer[w]=false; // d.h. alle Karten liegen zu Anfang och da
}
;
/* Diese Funktion generiert bei jedem Aufruf eine Pseudozufallszahl zwischen 1 und 8 */
/* Sie wird von den anderen Funktionen mehrfach aufgerufen. */
function zufall()
{
x1=Math.random();
x2=((x1*100)+1);
x3=parseInt(x2);
x4=x3 % 16;
x5=x4+1;
return(x5);
}
/* Diese Funktion produziert eine Reihe aus 16 Zufallszahlen zwischen 1 und 16, */
/* in der keine Zahl zweimal vorkommt. */
function machreihe()
{
reihe = new Array(16); // Die Reihe wird initialisiert, alle Werte auf null gesetzt;
for ( s=0;s<=15;s++ )
{reihe[s]=0}
;
y=zufall(); // Die erste Zahl der Reihe wird 'gezogen'
reihe[0]=y;
for ( t=1;t<=15;t++ )
{
y=zufall();
vorkommen=0;
for ( u=0;u<=15;u++ )
{
if ( reihe==y ) vorkommen++;
}
;
if (vorkommen!=0)
{reihe[t]=0;t--} // ein bisschen brutal, ich weiss - aber es funktioniert
else
reihe[t]=y;
}
;
return(reihe);
}
/* Jetzt wird die Funktion machreihe() aufgerufen */
r = new Array(16);
r = machreihe();
/* Jede Zahl der Reihe wird in eine einzelne Platzhaltervariable geschrieben */
p0=r[0]-1;
p1=r[1]-1;
p2=r[2]-1;
p3=r[3]-1;
p4=r[4]-1;
p5=r[5]-1;
p6=r[6]-1;
p7=r[7]-1;
p8=r[8]-1;
p9=r[9]-1;
p10=r[10]-1;
p11=r[11]-1;
p12=r[12]-1;
p13=r[13]-1;
p14=r[14]-1;
p15=r[15]-1;
/* d.h. die Platzhalter sind jetzt entsprechend der Zufallsreihe gemischt. */
bild=new Array(16);
/* nun werden die Kartenbilder entsprechend der Zufallsreihe nacheinander eingelesen, */
/* jede genau zwei mal. */
bild[p0]=new Image();
bild[p0].src='a1.jpg';
bild[p1]=new Image();
bild[p1].src='a1.jpg';
bild[p2]=new Image();
bild[p2].src='a2.jpg';
bild[p3]=new Image();
bild[p3].src='a2.jpg';
bild[p4]=new Image();
bild[p4].src='a3.jpg';
bild[p5]=new Image();
bild[p5].src='a3.jpg';
bild[p6]=new Image();
bild[p6].src='a4.jpg';
bild[p7]=new Image();
bild[p7].src='a4.jpg';
bild[p8]=new Image();
bild[p8].src='a5.jpg';
bild[p9]=new Image();
bild[p9].src='a5.jpg';
bild[p10]=new Image();
bild[p10].src='a6.jpg';
bild[p11]=new Image();
bild[p11].src='a6.jpg';
bild[p12]=new Image();
bild[p12].src='a7.jpg';
bild[p13]=new Image();
bild[p13].src='a7.jpg';
bild[p14]=new Image();
bild[p14].src='a8.jpg';
bild[p15]=new Image();
bild[p15].src='a8.jpg';
function aufdecken(nummer)
{
switch(leer[nummer])
{
case false: // d.h. da liegt eine Karte
switch(auf) // Beginn switch
{
case 0: // d.h. es ist die erste aufgedeckte Karte
ersteauf=nummer;
window.document.images[nummer].src=bild[nummer].src;
auf=auf+=1;
break;
case 1: // d.h. es ist die zweite aufgedeckte Karte
zweiteauf=nummer;
if ( zweiteauf==ersteauf )
{
alert("Sie haben schon auf diese Karte geklickt !");
}
else
{
window.document.images[nummer].src=bild[nummer].src;
auf=auf+=1;
versuche=versuche+=1;
setTimeout("pruefen()",1500);
};
break;
case 2:
alert("Es sind zu viele Karten auf !");
break;
default:
alert("Da stimmt was nicht in der switch-auf-Schleife !");
break;
} // Ende Switch-auf
break;
case true:
alert("Da ist keine Karte mehr !");
break;
default:
alert("Da stimmt was nicht in der switch-leer-Schleife !");
break;
} // Ende switch-leer
} // Ende der Funktion 'aufdecken'
function pruefen() // Haben beide Karten die gleiche Quelldatei ?
{
if ( window.document.images[ersteauf].src == window.document.images[zweiteauf].src )
{
treffer=treffer + 1;
window.document.images[ersteauf].src="leer.gif";
window.document.images[zweiteauf].src="leer.gif";
leer[ersteauf]=true;
leer[zweiteauf]=true;
auf=0;
if ( treffer==8)
{
alert("Sie haben " + versuche + " Versuche gebraucht.");
window.document.open();
window.document.write("<html><body bgcolor='#E1DFC9'><center><br><br><br>");
window.document.write("<form><input type='button' value='Noch ein Spiel ?' onClick='history.back()'></form>");
window.document.write(" <bgcolor='#E1DFC9'></center></body></html>")
window.document.close();
}
}
else
{
window.document.images[ersteauf].src="a0.jpg";
window.document.images[zweiteauf].src="a0.jpg";
leer[ersteauf]=false;
leer[zweiteauf]=false;
auf=0;
}
} // Ende der Funktion 'pruefen'
</script>
</head>
<body bgcolor="#E1DFC9" text="#663333">
<center>
<a href="#" onClick="aufdecken(0)"><img src="a0.jpg" hspace="5" vspace="5" border="0"></a>
<a href="#" onClick="aufdecken(1)"><img src="a0.jpg" hspace="5" vspace="5" border="0"></a>
<a href="#" onClick="aufdecken(2)"><img src="a0.jpg" hspace="5" vspace="5" border="0"></a>
<a href="#" onClick="aufdecken(3)"><img src="a0.jpg" hspace="5" vspace="5" border="0"></a><br>
<a href="#" onClick="aufdecken(4)"><img src="a0.jpg" hspace="5" vspace="5" border="0"></a>
<a href="#" onClick="aufdecken(5)"><img src="a0.jpg" hspace="5" vspace="5" border="0"></a>
<a href="#" onClick="aufdecken(6)"><img src="a0.jpg" hspace="5" vspace="5" border="0"></a>
<a href="#" onClick="aufdecken(7)"><img src="a0.jpg" hspace="5" vspace="5" border="0"></a><br>
<a href="#" onClick="aufdecken(8)"><img src="a0.jpg" hspace="5" vspace="5" border="0"></a>
<a href="#" onClick="aufdecken(9)"><img src="a0.jpg" hspace="5" vspace="5" border="0"></a>
<a href="#" onClick="aufdecken(10)"><img src="a0.jpg" hspace="5" vspace="5" border="0"></a>
<a href="#" onClick="aufdecken(11)"><img src="a0.jpg" hspace="5" vspace="5" border="0"></a><br>
<a href="#" onClick="aufdecken(12)"><img src="a0.jpg" hspace="5" vspace="5" border="0"></a>
<a href="#" onClick="aufdecken(13)"><img src="a0.jpg" hspace="5" vspace="5" border="0"></a>
<a href="#" onClick="aufdecken(14)"><img src="a0.jpg" hspace="5" vspace="5" border="0"></a>
<a href="#" onClick="aufdecken(15)"><img src="a0.jpg" hspace="5" vspace="5" border="0"></a><br>
</center>
</body>
</html>
Wie kann ich den Quelltext nun ändern, sodass aus den 160 Bildern immer zufällig 16 Bilder im Memory vorkommen?
ich wäre sehr froh, wenn mir jemand helfen könnte:-)
Viele Grüße von Christine
Antwort schreiben
Antwort 1 von son_quatsch vom 18.12.2020, 13:18 Options
Sorry, das war etwas zu vermurkst, um es hier und da zu flicken. Habs neugeschrieben. Achten musst du auf die Zeile
, iMin= 1, iMax= 13; // niedrigstes und höchstes Bild
Die
1 steht dafür, dass die erste Bilddatei
a1.jpg heißt. Die
13 logischerweise dafür, dass die letzte Bilddatei
a13.jpg heißt. Hier setzt du also 160 stattdessen ein. Das Bild für eine verdeckte Karte ist übrigens nachwievor
a0.jpg.
<!doctype html public "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html><head>
<title>Maximilians JavaScript-Memory</title>
<style type="text/css">
div {
text-align: center;
}
img {
border: 2px solid #00F;
margin: 5px;
cursor: pointer;
}
img.fail {
border: 2px solid #F00;
}
img.solv {
border: 2px solid #0F0;
}
</style>
<script type="text/javascript">
var i1, i2, i3, e1, e2, e3
, iErste= 0, iZweite= 0, iVersuch= 0, iTreffer= 0, iAuf= 0
, aLeer= new Array(16)
, aZufall= new Array(8)
, aBild= new Array(16)
, iMin= 1, iMax= 13; // niedrigstes und höchstes Bild
for (i1= 0; i1< 16; i1++) {
aLeer[i1]= false;
aBild[i1]= null;
}
for (i1= 0; i1< 8; i1++) do {
bDoppelt= false;
aZufall[i1]= iZufall();
for (i2= 0; i2< i1; i2++) if (aZufall[i2]== aZufall[i1]) {
bDoppelt= true;
break;
}
} while (bDoppelt);
for (i1= 0; i1< 8; i1++) {
do {
i2= Math.floor(Math.random()* 16);
} while (aBild[i2]);
do {
i3= Math.floor(Math.random()* 16);
} while (aBild[i3]|| i3== i2);
aBild[i2]= new Image();
aBild[i2].src= 'a'+ aZufall[i1]+ '.jpg';
aBild[i3]= new Image();
aBild[i3].src= 'a'+ aZufall[i1]+ '.jpg';
}
function iZufall() {
return Math.floor(Math.random()* (iMax- iMin+ 1)+ iMin);
}
function vAufdecken(iNummer) {
if (!aLeer[iNummer]) {
switch (iAuf) {
case 0:
iErste= iNummer;
break;
case 1:
iZweite= iNummer;
if (iZweite== iErste ) return;
break;
default:
alert('Es sind zu viele Karten aufgedeckt!');
return;
}
e3= document.getElementById('i'+ iNummer);
e3.src= aBild[iNummer].src;
e3.className= 'fail';
iAuf++;
if (iAuf== 2) {
iVersuch++;
vPruefen();
}
}
}
function vBildpaar(bRichtig) {
if (bRichtig) e1.className= e2.className= 'solv'; else {
e1.src= e2.src= 'a0.jpg';
e1.className= e2.className= '';
}
iAuf= 0;
}
function vPruefen() {
e1= document.getElementById('i'+ iErste);
e2= document.getElementById('i'+ iZweite);
if (e1.src== e2.src) {
iTreffer++;
vBildpaar(true);
aLeer[iErste]= aLeer[iZweite]= true;
if (iTreffer== 8) {
if (confirm('Sie haben '+ iVersuch+ ' Versuche gebraucht.\nNochmal spielen?')) location.reload();
}
} else window.setTimeout('vBildpaar(false);', 1500);
}
</script>
</head><body>
<div>
<img onclick="javascript:vAufdecken(0);" src="a0.jpg" id="i0" alt="" />
<img onclick="javascript:vAufdecken(1);" src="a0.jpg" id="i1" alt="" />
<img onclick="javascript:vAufdecken(2);" src="a0.jpg" id="i2" alt="" />
<img onclick="javascript:vAufdecken(3);" src="a0.jpg" id="i3" alt="" /><br />
<img onclick="javascript:vAufdecken(4);" src="a0.jpg" id="i4" alt="" />
<img onclick="javascript:vAufdecken(5);" src="a0.jpg" id="i5" alt="" />
<img onclick="javascript:vAufdecken(6);" src="a0.jpg" id="i6" alt="" />
<img onclick="javascript:vAufdecken(7);" src="a0.jpg" id="i7" alt="" /><br />
<img onclick="javascript:vAufdecken(8);" src="a0.jpg" id="i8" alt="" />
<img onclick="javascript:vAufdecken(9);" src="a0.jpg" id="i9" alt="" />
<img onclick="javascript:vAufdecken(10);" src="a0.jpg" id="i10" alt="" />
<img onclick="javascript:vAufdecken(11);" src="a0.jpg" id="i11" alt="" /><br />
<img onclick="javascript:vAufdecken(12);" src="a0.jpg" id="i12" alt="" />
<img onclick="javascript:vAufdecken(13);" src="a0.jpg" id="i13" alt="" />
<img onclick="javascript:vAufdecken(14);" src="a0.jpg" id="i14" alt="" />
<img onclick="javascript:vAufdecken(15);" src="a0.jpg" id="i15" alt="" />
</div>
</body></html>
Antwort 2 von katy vom 18.12.2020, 16:10 Options
Hallo dolphinscry
Solltest du bei deinem Code bleiben wollen, genügt folgendes hinter die Zeile
bild=new Array(16);
einzufügen:
var alleBilder=new Array(160);
for (var i=0; i<160; i++) {
alleBilder[i]="a"+(i+1)+".jpg";
}
for (i=0; i<152; i++) {
var z=Math.floor(Math.random()*alleBilder.length);
alleBilder.splice(z,1);
}
for (i=0; i<8; i++) {
bild[window["p"+(2*i)]]=new Image();
bild[window["p"+(2*i)]].src=alleBilder[i];
bild[window["p"+(2*i+1)]]=new Image();
bild[window["p"+(2*i+1)]].src=alleBilder[i];
}
dafür entfällt der Code von:
bild[p0]=new Image();
bis
bild[p15].src='a8.jpg';
katy
@son_quatsch:
in die onclick-Attribute gehört kein "javascript:"-Pseudoprotokoll. Der Hinweis auf die verwendete Scriptsporache muss im head-Bereich als meta-Tag stehen.
Netterweise ist den heutigen Browsern aber beides egal.
Antwort 3 von son_quatsch vom 18.12.2020, 16:47 Options
@katy:
Ja, hast recht. Flüchtigkeitsfehler :-)
Btw nette Idee, aus einer fertigen Folge solange zufällig welche zu löschen, bis nur noch 8 übrigbleiben.
Antwort 4 von dolphinscry vom 18.12.2020, 22:33 Options
WOOOOOOOOW, ich bin begeistert:-)))) Es funktioniert doch tatsächlich! Meine Rettung!!! Ganz ganz herzlichen Dank, ihr habts echt drauf:-)!!!!
Liebe Grüße von Christine
Antwort 5 von dolphinscry vom 18.12.2020, 23:50 Options
Huhu, leider habe ich beim mehrmaligen Durchspielen eben noch einen Fehler entdeckt:
Irgendwie werden immer dieselben Bilder aus dem Vorrat benutzt.
Woran kann das liegen?
Das ist nun der Quelltext:
<!doctype html public "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html><head>
<title>Maximilians JavaScript-Memory</title>
<style type="text/css">
div {
text-align: center;
}
img {
border: 2px solid #00F;
margin: 5px;
cursor: pointer;
}
img.fail {
border: 2px solid #F00;
}
img.solv {
border: 2px solid #0F0;
}
</style>
<script type="text/javascript">
var i1, i2, i3, e1, e2, e3
, iErste= 0, iZweite= 0, iVersuch= 0, iTreffer= 0, iAuf= 0
, aLeer= new Array(16)
, aZufall= new Array(8)
, aBild= new Array(16)
, iMin= 1, iMax= 13; // niedrigstes und höchstes Bild
for (i1= 0; i1< 16; i1++) {
aLeer[i1]= false;
aBild[i1]= null;
}
for (i1= 0; i1< 8; i1++) do {
bDoppelt= false;
aZufall[i1]= iZufall();
for (i2= 0; i2< i1; i2++) if (aZufall[i2]== aZufall[i1]) {
bDoppelt= true;
break;
}
} while (bDoppelt);
for (i1= 0; i1< 8; i1++) {
do {
i2= Math.floor(Math.random()* 16);
} while (aBild[i2]);
do {
i3= Math.floor(Math.random()* 16);
} while (aBild[i3]|| i3== i2);
aBild[i2]= new Image();
aBild[i2].src= 'a'+ aZufall[i1]+ '.jpg';
aBild[i3]= new Image();
aBild[i3].src= 'a'+ aZufall[i1]+ '.jpg';
}
function iZufall() {
return Math.floor(Math.random()* (iMax- iMin+ 1)+ iMin);
}
function vAufdecken(iNummer) {
if (!aLeer[iNummer]) {
switch (iAuf) {
case 0:
iErste= iNummer;
break;
case 1:
iZweite= iNummer;
if (iZweite== iErste ) return;
break;
default:
alert('Es sind zu viele Karten aufgedeckt!');
return;
}
e3= document.getElementById('i'+ iNummer);
e3.src= aBild[iNummer].src;
e3.className= 'fail';
iAuf++;
if (iAuf== 2) {
iVersuch++;
vPruefen();
}
}
}
function vBildpaar(bRichtig) {
if (bRichtig) e1.className= e2.className= 'solv'; else {
e1.src= e2.src= 'a0.jpg';
e1.className= e2.className= '';
}
iAuf= 0;
}
function vPruefen() {
e1= document.getElementById('i'+ iErste);
e2= document.getElementById('i'+ iZweite);
if (e1.src== e2.src) {
iTreffer++;
vBildpaar(true);
aLeer[iErste]= aLeer[iZweite]= true;
if (iTreffer== 8) {
if (confirm('Sie haben '+ iVersuch+ ' Versuche gebraucht.\nNochmal spielen?')) location.reload();
}
} else window.setTimeout('vBildpaar(false);', 1500);
}
</script>
</head><body>
<div>
<img onclick="javascript:vAufdecken(0);" src="a0.jpg" id="i0" alt="" />
<img onclick="javascript:vAufdecken(1);" src="a0.jpg" id="i1" alt="" />
<img onclick="javascript:vAufdecken(2);" src="a0.jpg" id="i2" alt="" />
<img onclick="javascript:vAufdecken(3);" src="a0.jpg" id="i3" alt="" /><br />
<img onclick="javascript:vAufdecken(4);" src="a0.jpg" id="i4" alt="" />
<img onclick="javascript:vAufdecken(5);" src="a0.jpg" id="i5" alt="" />
<img onclick="javascript:vAufdecken(6);" src="a0.jpg" id="i6" alt="" />
<img onclick="javascript:vAufdecken(7);" src="a0.jpg" id="i7" alt="" /><br />
<img onclick="javascript:vAufdecken(8);" src="a0.jpg" id="i8" alt="" />
<img onclick="javascript:vAufdecken(9);" src="a0.jpg" id="i9" alt="" />
<img onclick="javascript:vAufdecken(10);" src="a0.jpg" id="i10" alt="" />
<img onclick="javascript:vAufdecken(11);" src="a0.jpg" id="i11" alt="" /><br />
<img onclick="javascript:vAufdecken(12);" src="a0.jpg" id="i12" alt="" />
<img onclick="javascript:vAufdecken(13);" src="a0.jpg" id="i13" alt="" />
<img onclick="javascript:vAufdecken(14);" src="a0.jpg" id="i14" alt="" />
<img onclick="javascript:vAufdecken(15);" src="a0.jpg" id="i15" alt="" />
</div>
</body></html>
Viele Grüße von Christine
Antwort 6 von dolphinscry vom 18.12.2020, 23:54 Options
Juchu, habs selbst rausgefunden:-)))