Da das Spiel Hangman gewünscht wurde habe ich mich mal hingesetzt und ein Script dazu gebastelt.
Wie so oft braucht ihr die Grundscriptsammlung in der Ankündigung.
Dann speichert ihr den folgenden Code als .js ab und ladet die Datei auf einen Webspace:
Code: Alles auswählen
hmWords = ["Webkicks", "Chat", "Keller", "WkTools", "Moni", "Zischdings", "Hangman"];
//hmImgPfad= "http://wktools.net/images/games/hangman/black_handgemalt/";
hmImgPfad= "http://wktools.net/images/games/hangman/black_strichliste/";
//hmBilder=[hmImgPfad+"hm0.gif", hmImgPfad+"hm1.gif", hmImgPfad+"hm2.gif", hmImgPfad+"hm3.gif", hmImgPfad+"hm4.gif", hmImgPfad+"hm5.gif", hmImgPfad+"hm6.gif", hmImgPfad+"hm7.gif", hmImgPfad+"hm8.gif", hmImgPfad+"hm9.gif", hmImgPfad+"hm10.gif", hmImgPfad+"hm11.gif"];
hmBilder=[hmImgPfad+"hm10.gif", hmImgPfad+"hm9.gif", hmImgPfad+"hm8.gif", hmImgPfad+"hm7.gif", hmImgPfad+"hm6.gif", hmImgPfad+"hm5.gif", hmImgPfad+"hm4.gif", hmImgPfad+"hm3.gif", hmImgPfad+"hm2.gif", hmImgPfad+"hm1.gif", hmImgPfad+"hm0.gif"];
hmAllowOwnWords=1;
hmBefehl = "/hm";
hmSpielfeldBorderStyle="1px dotted #006600";
hmAbsolutePosition=1;
hmUmlaute=1;
//feste spielvariablen - nicht aendern!
hmTmpPlayer="";
hmWord="";
hmLetters = [];
hmStatus=0;
hmGameRunning=0;
function hmBefehlsAuswertung(eingabe, sender){
u=strip_tags(eingabe);
m=strip_tags(sender);
u2=u.split(" ");
if(!hmGameRunning && (u!="" && !hmAllowOwnWords || hmAllowOwnWords && (u2.length<2 || u2[0]!="s") && u != "")){
document.write("im Moment läuft kein Hangman-Spiel. Spiel starten per \"/hm s wort\" oder \"/hm\"");
return;
}
if(!hmGameRunning){
document.write("startet ein Hangman-Spiel.");
if(hmAllowOwnWords && u2.length>1){
if(u2.shift()=="s"){
if(!u.match(/\w+[a-z\s]+/i)){
document.write(" Fehler: Ungültiges Wort: "+u);
return;
}
hmWord=u2.join(" ");
hmGameRunning=2;
hmZeichneTabelle(hmWord);
hmLetters=[];
hmStatus=0;
}
}
else{
sendeText(hmBefehl+" "+(parseInt(Math.random() * hmWords.length)), m);
hmGameRunning=1;
hmTmpPlayer=m;
window.setTimeout("if(hmGameRunning==1)hmGameRunning=0;", 3000); //Wenn kein Spiel innerhalb von 3 Sekunden gestartet wird wird der Status wieder auf "kein Spiel laeuft" gesetzt.
}
return;
}
if(hmGameRunning==1 && m==hmTmpPlayer){
hmGameRunning=2;
hmWord=hmWords[u];
hmTmpPlayer="";
hmZeichneTabelle(hmWord);
hmLetters=[];
hmStatus=0;
document.getElementsByTagName("table")[document.getElementsByTagName("table").length-1].style.display="none";
return;
}
if(hmGameRunning != 2) return;
hmZug(u);
}
function hmZug(u){
u=u.toLowerCase();
if(u.length!=1){
if(u==hmWord.toLowerCase()){
document.write("Gelöst: "+hmWord);
hmGameRunning=0;
setTimeout('r=parent.rightFrame;r.document.body.removeChild(r.document.getElementById("Hangman"))', 3000);
}
else{
document.write("Falsche Lösung: "+u+((hmStatus==(hmBilder.length-1))?(" Game Over :-( Lösung: "+hmWord):""));
hmStatus++;
parent.rightFrame.document.getElementById("hmBild").src=hmBilder[hmStatus];
if(hmStatus==(hmBilder.length-1)){
hmGameRunning=0;
setTimeout('r=parent.rightFrame;r.document.body.removeChild(r.document.getElementById("Hangman"))', 3000);
}
}
return;
}
if(hmUmlaute && !u.match(/^[a-zäöüß]$/i) || !hmUmlaute && !u.match(/^[a-z]$/i)){
document.write("immer nur ein Buchstabe!");
return;
}
if(!hmLetters.inArray(u))hmLetters[hmLetters.length]=u;
if(!(hmWord.toLowerCase().match(u))){
hmStatus++;
parent.rightFrame.document.getElementById("hmBild").src=hmBilder[hmStatus];
document.write("sendet ein "+u+". Leider falsch."+((hmStatus==(hmBilder.length-1))?(" Game Over :-( Lösung: "+hmWord):""));
if(hmStatus==(hmBilder.length-1)){
hmGameRunning=0;
setTimeout('r=parent.rightFrame;r.document.body.removeChild(r.document.getElementById("Hangman"))', 3000);
}
}
else{
tmpWord=hmWord;
if(hmUmlaute){
tmpArr=[];
for(i=0;i<tmpWord.length;i++){
if(tmpWord.charAt(i).match(/([^a-zäöüß ])/i)){//Sonderzeichen ausser ÄÖÜß ausschliessen!
tmpSonderzeichen=RegExp.$1;
if(!tmpArr.inArray("\\"+tmpSonderzeichen))tmpArr[tmpArr.length]="\\"+tmpSonderzeichen;
}
}
eval("tmpWord=tmpWord.replace(/[^"+hmLetters.join("")+tmpArr.join("")+" ]/gi, '_');");
}
else eval("tmpWord=tmpWord.replace(/[^"+hmLetters.join("")+"0-9\\W ]/gi, '_');");
parent.rightFrame.document.getElementById("hmText").innerHTML=tmpWord;
document.write("sendet ein "+u+". Das ist ein Treffer."+(tmpWord==hmWord?(" Gelöst! Lösung: "+hmWord):""));
if(tmpWord==hmWord){
hmGameRunning=0;
setTimeout('r=parent.rightFrame;r.document.body.removeChild(r.document.getElementById("Hangman"))', 3000);
}
}
if(hmUmlaute)b=["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z", "ä", "ö", "ü", "ß"];
else b=["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"];
bb="";
for(i=0;i<b.length;i++){
if(!hmLetters.inArray(b[i]))
bb+=" <span onclick='parent.mainframe.sendeText(\""+hmBefehl+" "+b[i]+"\")'>"+b[i]+"</span>";
}
parent.rightFrame.document.getElementById("hmBuchstaben").innerHTML=bb+"<br><span onclick='with(parent.info.document.eingabe.message){value=\""+hmBefehl+" \"+document.getElementById(\"hmText\").innerHTML; focus(); if(createTextRange){pos=createTextRange(); pos.collapse(false); pos.select();}}'>lösen</span>";
}
function hmZeichneTabelle(word){
ie=(document.all&&!window.innerWidth && navigator.userAgent.toLowerCase().indexOf("msie") != -1)?1:0;
r = parent.rightFrame;
hmSpielfeld = r.document.createElement("p");
hmSpielfeld.style.border = hmSpielfeldBorderStyle;
hmSpielfeld.setAttribute("id", "Hangman");
hmClose = r.document.createElement("div");
hmClose.style.marginBottom="0px";
hmClose.style.textAlign="right";
hmCloseLink = r.document.createElement("a");
hmCloseLink.setAttribute("href", "javascript:void(document.body.removeChild(document.getElementById('Hangman')));");
hmCloseLink.appendChild(r.document.createTextNode("X"));
hmClose.appendChild(hmCloseLink);
hmSpielfeld.appendChild(hmClose);
if(hmAbsolutePosition){
hmSpielfeld.style.position = "absolute";
hmSpielfeld.style.zIndex = "2";
hmSpielfeld.style.bottom = "10px";
hmSpielfeld.style.right = "15px";
}
hmGameBildP = r.document.createElement("p");
hmGameBild = r.document.createElement("img");
hmGameBild.src = hmBilder[0];
hmGameBild.setAttribute("id", "hmBild");
hmGameBildP.appendChild(hmGameBild);
hmSpielfeld.appendChild(hmGameBildP);
hmGameText = r.document.createElement("span");
hmGameText.setAttribute("id", "hmText")
if(hmUmlaute)hmGameText.appendChild(r.document.createTextNode(word.replace(/[a-zäöüß]/gi, "_")));
else hmGameText.appendChild(r.document.createTextNode(word.replace(/[a-z]/gi, "_")));
hmSpielfeld.appendChild(hmGameText);
hmGameBuchstaben = r.document.createElement("div");
hmGameBuchstaben.setAttribute("id", "hmBuchstaben");
if(hmUmlaute)b=["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z", "ä", "ö", "ü", "ß"];
else b=["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"];
bb="";
for(i=0;i<b.length;i++){
bb+=" <span onclick='parent.mainframe.sendeText(\""+hmBefehl+" "+b[i]+"\")'>"+b[i]+"</span>";
}
hmGameBuchstaben.innerHTML = bb+"<br><span onclick='with(parent.info.document.eingabe.message){value=\""+hmBefehl+" \"+document.getElementById(\"hmText\").innerHTML; focus(); if(createTextRange){pos=createTextRange(); pos.collapse(false); pos.select();}}'>lösen</span>";
hmSpielfeld.appendChild(hmGameBuchstaben);
if(r.document.getElementById("Hangman"))
r.document.body.removeChild(r.document.getElementById("Hangman"));
r.document.body.insertBefore(hmSpielfeld, r.document.getElementsByTagName("p")[0]);
}
hmWords ist ein Array der Vorgegebenen Worte. Gebt dort einfach alle Worte in Anführungszeichen und durch Komma getrennt ein, die im Spiel zu erraten sein sollen.
hmImgPfad ist der Pfad, in dem die Bilder gespeichert sind. Das dient lediglich dazu, den Code in der nächsten Zeile zu verkürzen da in aller Regel die Bilder ja in einem Verzeichnis liegen.
hmBilder ist ein Array der Hangman-Bilder, also vom leeren Bild das sich dann immer weiter aufbaut bis das Männchen am Galgen hängt... Wem das Galgenmännchen nicht gefällt der kann auch eine Strichliste herunterzählen lassen oder sich irgendwas anderes ausdenken... der Fantasie sind keine Grenzen gesetzt

Wenn euch die Schreibweise zu unübersichtlich ist oder ihr (z.B. durch einen Bildhoster) darauf angewiesen seid unterschiedliche Verzeichnisse für die Bilder zu nutzen könnt ihr auch auf hmImgPfad verzichten und im Code direkt die ganzen Bild-URLs eintragen:
Code: Alles auswählen
hmBilder=["http://wktools.net/images/games/hangman/black_handgemalt/hm0.gif", "http://wktools.net/images/games/hangman/black_handgemalt/hm1.gif", "http://wktools.net/images/games/hangman/black_handgemalt/hm2.gif", "http://wktools.net/images/games/hangman/black_handgemalt/hm3.gif", "http://wktools.net/images/games/hangman/black_handgemalt/hm4.gif", "http://wktools.net/images/games/hangman/black_handgemalt/hm5.gif", "http://wktools.net/images/games/hangman/black_handgemalt/hm6.gif", "http://wktools.net/images/games/hangman/black_handgemalt/hm7.gif", "http://wktools.net/images/games/hangman/black_handgemalt/hm8.gif", "http://wktools.net/images/games/hangman/black_handgemalt/hm9.gif", "http://wktools.net/images/games/hangman/black_handgemalt/hm10.gif", "http://wktools.net/images/games/hangman/black_handgemalt/hm11.gif"];
Moni postet im folgenden Beitrag auch gleich einige Bilder-Sets... Wer selbst welche erstellt kann diese natürlich auch gerne hier veröffentlichen.
hmAllowOwnWords entscheidet ob die User eigene Worte anbieten können oder ob nur die fest eingetragenen zufällig gewählt werden. Ist es auf 1, so können die User per /hm s WORT ein Hangmanspiel mit einem eigenen Wort starten, ansonsten geht es nur per /hm und es wird ein zufälliges Wort aus dem Array gewählt.
in hmBefehl wird der Chatbefehl eingestellt, den ihr angelegt habt. /hm empfiehlt sich da er kurz ist und man ihn in dem Spiel recht häufig eingeben muss

Über hmSpielfeldBorderStyle könnt ihr per CSS den Rahmen des Spielfeldes einstellen.
hmAbsolutePosition bestimmt darüber ob das Spielfeld in der OL absolut positioniert wird und damit die Nicks überlagert oder fest oberhalb der Nicks angezeigt wird.
hmUmlaute bestimmt ob im Spiel auch Umlaute (ÄÖÜ und ß) verwendet werden dürfen. Wenn man diesen Wert auf 0 setzt werden diese Zeichen wie alle Sonderzeichen behandelt und direkt angezeigt. Man sollte dann in den zu erratenden Worten ä durch ae, ß durch ss usw. umschreiben.
Anschließend wird die JS-Datei wie gewohnt in die normale und die Gastankündigung eingebunden:
Code: Alles auswählen
<script type='text/javascript' src='http://URL der JS-Datei'></script>
Code: Alles auswählen
<script type=text/javascript>if(parent.info){hmBefehlsAuswertung('%user%','%me%');}else{document.write('spielt Hangman')}</script>
Raten kann man dann mit "/hm x" (x natürlich durch einen beliebigen Buchstaben ersetzen) oder durch Klicken auf den Buchstaben in der Onlineliste.
Lösen kann man per "/hm Wort".
Hier schonmal 2 Bildersets von mir:























Changelog:
23.12.2009: Es können nun auch Umlaute verwendet werden. Diese Funktion lässt sich deaktivieren, sodass Umlaute mit ae, etc. umschrieben werden müssen.