Seite 1 von 1

Javascript - Memoryspiel - Anpassungen - Bitte um Hilfe!

Verfasst: 25.01.2012, 19:23
von Fightmeyer
Hallo Leute,

ich möchte auf meiner Homepage ein kleines Memoryspiel einbinden. Ich habe in den Weiten des Netzes auch einen entsprechenden JS-Quellcode gefunden, der ein einfaches Memory-Spiel umsetzt.

Der Code setzt voraus, dass die Bilddateien für die Memorykarten einen fest-definierten Dateinamen haben img1.gif img2.gif img3.gif usw.
Da ich aber bei jedem Spiel unterschiedliche Bilder haben möchte, greife ich auf meine Fotodatenbank auf der Homepage zu. In der sind die Dateinamen der Bilder gespeichert, die alle völlig unterschiedlich sind und keiner definierten Syntax folgen.

Das Problem: Das Javascript benutzt nicht die eigentlichen Bilddateinamen, sondern den jeweiligen Index des Bildarrays und baut dann bei Bedarf den Bilddateinamen zusammen. Das klappt natürlich bei meinen Bildern nun nicht. Daher meine Frage an die Spezies hier im Forum, ob den folgenden JS-Code jemand so anpassen kann, dass ich das array mit echten, individuellen Dateinamen befüllen kann und es dann immer noch funktioniert? Das übersteigt nämlich leider meine JS-Kenntnisse und Fähigkeiten.

So sieht der Code aus.

Code: Alles auswählen

<HEAD>

<SCRIPT LANGUAGE="JavaScript">
<!-- Original:  Brian Gosselin (bgaudiodr@aol.com) -->
<!-- Web Site:  http://www.bgaudiodr.iwarp.com -->

<!-- This script and many more are available free online at -->
<!-- The JavaScript Source!! http://javascript.internet.com -->

<!-- Begin
var pics = new Array();
for (i = 0; i <= 18; i++) {
pics[i] = new Image();
pics[i].src = 'image' + i + '.gif';
}
var map=new Array(1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18);
var user = new Array();
var temparray = new Array();
var clickarray = new Array(0, 0);
var ticker, sec, min, ctr, id, oktoclick, finished;
function init() {
clearTimeout(id);
for (i = 0; i <= 35 ;i++) {
user[i] = 0;
}
ticker = 0;
min = 0;
sec = 0;
ctr = 0;
oktoclick = true;
finished = 0;
document.f.b.value = "";
scramble();
runclk();
for (i = 0; i <= 35; i++) {
document.f[('img'+i)].src = "image0.gif";
   }
}
function runclk() {
min = Math.floor(ticker/60);
sec = (ticker-(min*60))+'';
if(sec.length == 1) {sec = "0"+sec};
ticker++;
document.f.b.value = min+":"+sec;
id = setTimeout('runclk()', 1000);
}
function scramble() {
for (z = 0; z < 5; z++) {
for (x = 0; x <= 35; x++) {
temparray[0] = Math.floor(Math.random()*36);
temparray[1] = map[temparray[0]];
temparray[2] = map[x];
map[x] = temparray[1];
map[temparray[0]] = temparray[2];
      }
   }
}
function showimage(but) {
if (oktoclick) {
oktoclick = false; 
document.f[('img'+but)].src = 'image'+map[but]+'.gif';
if (ctr == 0) {
ctr++;
clickarray[0] = but;
oktoclick = true;
} else {
clickarray[1] = but;
ctr = 0;
setTimeout('returntoold()', 600);
      }
   }
}
function returntoold() {
if ((clickarray[0] == clickarray[1]) && (!user[clickarray[0]])) {
document.f[('img'+clickarray[0])].src = "image0.gif";
oktoclick = true;
} else {
if (map[clickarray[0]] != map[clickarray[1]]) {
if (user[clickarray[0]] == 0) {
document.f[('img'+clickarray[0])].src = "image0.gif";
}
if (user[clickarray[1]] == 0) {
document.f[('img'+clickarray[1])].src = "image0.gif";
   }
}
if (map[clickarray[0]] == map[clickarray[1]]) {
if (user[clickarray[0]] == 0&&user[clickarray[1]] == 0) { finished++; }
user[clickarray[0]] = 1;
user[clickarray[1]] = 1;
}
if (finished >= 18) {
alert('You did it in '+document.f.b.value+' !');
init();
} else {
oktoclick = true;
      }
   }
}
//  End -->
</script>
</HEAD>

<!-- STEP TWO: Insert the onLoad event handler into your BODY tag  -->

<BODY OnLoad="init()">

<!-- STEP THREE: Copy this code into the BODY of your HTML document  -->

<center>
<h2>Concentration</h2>
<form name="f"> 
<table cellpadding="0" cellspacing="0" border="0">
<script language="javascript">
<!-- Begin
for (r = 0; r <= 5; r++) {
document.write('<tr>');
for (c = 0; c <= 5; c++) {
document.write('<td align="center">');
document.write('<a href="javascript:showimage('+((6*r)+c)+')" onClick="document.f.b.focus()">');
document.write('<img src="/image0.gif" name="img'+((6*r)+c)+'" border="0">');
document.write('</a></td>');
}
document.write('</tr>');
}
// End -->
</script>
</table>
<br><br>
<input type="button" value="         " name="b" onClick="init()">
</form>
</center>

<p><center>
<font face="arial, helvetica" size="-2">Free JavaScripts provided<br>
by <a href="http://javascriptsource.com">The JavaScript Source</a></font>
</center><p>

Re: Javascript - Memoryspiel - Anpassungen - Bitte um Hilfe!

Verfasst: 25.01.2012, 19:45
von stundenglas

Code: Alles auswählen

pics[i].src = 'image' + i + '.gif';
Wenn ich mich nicht täusche werden an an dieser Stelle Bilder in das Array geladen, sie sollten dann im selben Ordner liegen wie das (Memory)Skript(.html):

Code: Alles auswählen

MemorySkript.html
image0.gif
image1.gif
image2.gif
image3.gif
....
image18.gif
Wenn du das Spiel auf der Seite spielen kannst, schau doch mal ob du auf dem Server auch "image0.gif" oder "image1.gif" findest an der Stelle wo das Skript liegt.

Etwas das ich noch nicht gefunden habe ist wie die (gleiche) Rückseite der Bilder angezeigt wird. Das könnte "image0.gif" sein, die Bilder aber von 1-18 nur initalisiert werden.

Ah und du musst den Code noch etwas zurechtschneiden dein body-Tag wird z.B. nicht geschlossen in deiner kopie. :)

Re: Javascript - Memoryspiel - Anpassungen - Bitte um Hilfe!

Verfasst: 25.01.2012, 19:55
von Fightmeyer
Das stimmt so weit alles.
Also das mit den Dateinamen.
Das Problem ist aber, dass meine Dateinamen so aussehen:


fgdfgdfg5435jnk.jpg
fsdjfhj3rejfwefsd.jpg
dsf32hfnfdsfsdf3542.jpg
fsdjhfjhw3r3rdfsdf.jpg

usw.

Und bei jedem Spielstart werden andere Bilder verwendet.

Meine Bildnamen dem Array im Javascript zuweisen ist nicht das Problem. Das hab ich hingekriegt, aber das bringt ja nichts, da die JS-Funktion zum aufrufen der Bilder (showimage zum Beispiel) auf den Index des arrays zugreift und über die indexnummer den Dateinamen zusammenbaut. Das funktioniert also nur, wenn die Bilddateien durchnummeriert sind. Sind sie aber bei mir nicht.

Nur nochmal kurz zur Verdeutlichung. Das Spiel läuft an sich auch bei mir. Aber halt nur, wenn die Dateinamen immer die gleichen sind. Sind sie aber halt bei mir nicht.

Hier seht ihr übrigens das Beispiel, von wo ich den Quelltext herhabe.
http://www.javascriptsource.com/games/c ... ation.html

Re: Javascript - Memoryspiel - Anpassungen - Bitte um Hilfe!

Verfasst: 26.01.2012, 07:19
von BENDET
Ohje, ... wird zwar wunderschön definiert, aber nirgends verwendet, stattdessen baut der Mensch die Namen weiter unten explizit nochmal zusammen...

Code: Alles auswählen

document.f[('img'+but)].src = 'image'+map[but]+'.gif';
Alles was Du im Prinzip machen müsstest ist in obiger Zeile

Code: Alles auswählen

'image'+map[but]+'.gif'
durch

Code: Alles auswählen

pics[map[but]]
zu ersetzen und das -Array mit deinen Bilddateinamen zu befüllen (inklusive Pfad).

Also statt:

Code: Alles auswählen

for (i = 0; i <= 18; i++) 
{
    pics[i] = new Image();
    pics[i].src = 'image' + i + '.gif';
}

Code: Alles auswählen

for (i = 0; i <= 18; i++) 
{
    pics[i] = new Image();
    pics[i].src = <RandomImageNameFromDBNotInPicArrayAlready>
}
Wo Du die Bilddateinamen herbekommst überlasse ich Dir. Du wolltest sie ja aus einer Datenbank lesen, ich schätze, Du weißt wie das geht. Das

Code: Alles auswählen

<RandomImageNameFromDBNotInPicArrayAlready>
wäre also entsprechend von Dir zu ersetzen. (Stichwort Funktion!)

[stimmt so nicht, trotzdem einen Gedanken wert]
Dann hast Du allerdings noch einen Indexfehler, also ersetzt noch Du die Zeile

Code: Alles auswählen

var map=new Array(1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18);
durch

Code: Alles auswählen

var map=new Array(0,0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17);
[/stimmt so nicht, trotzdem einen Gedanken wert]

[Edit]Gerade aufgefallen, die Sache mit dem Indexfehler stimmt nicht, da pics 19 Felder enthält, der bestehende Code verwendet trotzdem aber immer fest, image0.gif. Das müsstest Du dann auch entsprechend anpassen, also die Zeilen mit

Code: Alles auswählen

document.f[('img'+clickarray[0])].src = "image0.gif";
und

Code: Alles auswählen

document.f[('img'+clickarray[1])].src = "image0.gif";
durch

Code: Alles auswählen

document.f[('img'+clickarray[0])].src = pic[0];
bzw.

Code: Alles auswählen

document.f[('img'+clickarray[1])].src = pic[0];
ersetzen.

Achja,

Code: Alles auswählen

document.f[('img'+i)].src = "image0.gif";
genau so durch

Code: Alles auswählen

document.f[('img'+i)].src = pic[0];
ersetzen
[/Edit]

Ich hoffe, das hat deine Frage beantwortet.

Was ich von dem Code halte, sage ich besser nicht.
Nur so viel. Ich finde es toll, dass Du Dich von anderen inspirieren läßt. Geh den Code durch, lerne und verstehe ihn, und mach es dann neu und ordentlich(er).

Re: Javascript - Memoryspiel - Anpassungen - Bitte um Hilfe!

Verfasst: 30.01.2012, 20:29
von Fightmeyer
Vielen Dank.
Ich habs jetzt so weit lauffähig bekommen. Allerdings steh ich momentan irgendwie auf dem Schlauch, was die Darstellung der Bilder angeht. Diese liegen in unterschiedlichen Abmessungen vor und sollen aber jeweils mindestens das komplette Kartenfeld ausfüllen.
Die Kartenfelder selber stelle ich mit Divs dar (100px x 100px). Beim img-Tag würd ich jetzt gerne entweder height oder width mit 100% mitgeben. Je nachdem, was kürzer ist, um so auf alle Fälle ine komplette Füllung des Kartenfeldes zu bewirken.
Aber wie bau ich das mit Javascript? Das müsste ja dann irgendwie mit in die Showimage-Funktion, oder? Hat da jemand noch ne Idee?

Das JS im HTML sieht momentan so aus:

Code: Alles auswählen

<div align="center" style="float:left; width:708px;">
<form name="formpairs">

	<script type="text/javascript"> 
	<!-- Begin
	for (r = 0; r <= 5; r++){
		for (c = 0; c <= 5; c++) {
			document.write('<div align="center" style="float:left; width:100px; height:100px; border:thin solid; margin:8px; overflow:hidden">');
			document.write('<a href="javascript:showimage('+((6*r)+c)+') ">');
			document.write('<img src="/../images/deckblatt.gif" name="img'+((6*r)+c)+'">');
			document.write('</a>');
			document.write('</div>');
		}
	}
	// End -->
	</script>
	
</form>
</div>
EDIT:
Ich hab jetzt in der Showimage-Funktion folgenden Code eingebaut, der auch das richtige Ergebnis liefert.

Code: Alles auswählen

	if (pics[map[but]].height<pics[map[but]].width){
		alert("height=100%"); }
	else {
		alert("width=100%");
	}
Ich hab nur irgendwie keinen blassen, wie ich das Ergebnis jetzt in den IMG-Tag reinkrieg.

EDIT2:
Hab jetzt folgende Funktion gebaut:

Code: Alles auswählen

function imagesizestring(but) {
	if (pics[map[but]].height<pics[map[but]].width){
		imagesizestringback="height=100px";
	}
	else {
		imagesizestringback="width=100px";
	}
	alert(imagesizestringback);
	return imagesizestringback;
}
und im HTML folgendes zu stehen.

Code: Alles auswählen

document.write('<img src="/../images/deckblatt.gif" name="img'+((6*r)+c)+'"'+imagesizestring((6*r)+c)+'>');
Aber es funzt nicht. Jemand ne Idee?

Re: Javascript - Memoryspiel - Anpassungen - Bitte um Hilfe!

Verfasst: 30.01.2012, 21:46
von BENDET
Keine Idee, weil ich eigentlich unter anderem richtiges Java programmiere und mit Script nicht so viel am Hut habe, aber mal ne Frage zu deinem <img>-Tag. Wieso beendest Du das nicht?
Also mir fehlt da eindeutig ein <img .... /> oder <img .. ></img>.
Vermutlich wird das deinem Browser egal sein, weil die meist eh versuchen aus jedem bisschen HTML etwas vernünftiges zu machen. Fällt mir nur auf, weil ich eigentlich aus der XML-Welt komme, wo so etwas natürlich ganz böse ist.

Was bekommst Du denn für eine Fehlermeldung (WebDebugging)?

Re: Javascript - Memoryspiel - Anpassungen - Bitte um Hilfe!

Verfasst: 30.01.2012, 22:04
von Fightmeyer
Das IMG-Tag ist ein Standalone-Tag und wird ohne abschließendes Tag verwendet.

Mein Problem ist irgendwie, dass der HTML-Quelltext, der während der Laufzeit durch dsa Javascript zusammengebaut wird, irgendwie den Rückgabewert der Größenfunktion nicht berücksichtigt. Warum auch immer. Vielleicht geht das auch so gar nicht und man kann sich einen HTML-String gar nicht so einfach über JS zusammenbauen. Ich hab keine Ahnung.

Re: Javascript - Memoryspiel - Anpassungen - Bitte um Hilfe!

Verfasst: 30.01.2012, 22:09
von BENDET
Ich würde tippen dass schon, aber für die Details bin ich wirklich der falsche Ansprechpartner. prinzipielle Dinge zu Programmierung und Algotihmen könnte ich Dir erklären, aber für die JavaScript-Details und insbesondere Unterschiede zu Java müsste ich mich erst selber einlesen und einarbeiten, da käme also keine schnelle Antwort von mir.