The Night of the Rabbit
Aktuelle Zeit: 20.06.2013, 07:25

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
BeitragVerfasst: 25.01.2012, 20:23 
Riesiger Roboteraffe
Riesiger Roboteraffe
Benutzeravatar

Registriert: 16.12.2004, 23:51
Beiträge: 6429
Wohnort: Potsdam
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:
<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>


Nach oben
 Profil  
 
BeitragVerfasst: 25.01.2012, 20:45 
Profi-Abenteurer
Profi-Abenteurer

Registriert: 20.11.2009, 21:07
Beiträge: 918
Code:
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:
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. :)


Nach oben
 Profil  
 
BeitragVerfasst: 25.01.2012, 20:55 
Riesiger Roboteraffe
Riesiger Roboteraffe
Benutzeravatar

Registriert: 16.12.2004, 23:51
Beiträge: 6429
Wohnort: Potsdam
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


Nach oben
 Profil  
 
BeitragVerfasst: 26.01.2012, 08:19 
Adventure-Treff
Adventure-Treff
Benutzeravatar

Registriert: 20.03.2006, 09:48
Beiträge: 7087
Wohnort: Großraum Stuttgart
Ohje, ...
Code:
pics
wird zwar wunderschön definiert, aber nirgends verwendet, stattdessen baut der Mensch die Namen weiter unten explizit nochmal zusammen...

Code:
document.f[('img'+but)].src = 'image'+map[but]+'.gif';


Alles was Du im Prinzip machen müsstest ist in obiger Zeile
Code:
'image'+map[but]+'.gif'

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

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


Code:
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:
<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:
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:
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:
document.f[('img'+clickarray[0])].src = "image0.gif";

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

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

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

Achja,
Code:
document.f[('img'+i)].src = "image0.gif";

genau so durch
Code:
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).


Nach oben
 Profil  
 
BeitragVerfasst: 30.01.2012, 21:29 
Riesiger Roboteraffe
Riesiger Roboteraffe
Benutzeravatar

Registriert: 16.12.2004, 23:51
Beiträge: 6429
Wohnort: Potsdam
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:
<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:
   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:
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:
document.write('<img src="../images/deckblatt.gif" name="img'+((6*r)+c)+'"'+imagesizestring((6*r)+c)+'>');


Aber es funzt nicht. Jemand ne Idee?


Nach oben
 Profil  
 
BeitragVerfasst: 30.01.2012, 22:46 
Adventure-Treff
Adventure-Treff
Benutzeravatar

Registriert: 20.03.2006, 09:48
Beiträge: 7087
Wohnort: Großraum Stuttgart
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)?


Nach oben
 Profil  
 
BeitragVerfasst: 30.01.2012, 23:04 
Riesiger Roboteraffe
Riesiger Roboteraffe
Benutzeravatar

Registriert: 16.12.2004, 23:51
Beiträge: 6429
Wohnort: Potsdam
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.


Nach oben
 Profil  
 
BeitragVerfasst: 30.01.2012, 23:09 
Adventure-Treff
Adventure-Treff
Benutzeravatar

Registriert: 20.03.2006, 09:48
Beiträge: 7087
Wohnort: Großraum Stuttgart
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.


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de