ich freue mich heute ein neues spiel für eure Chats präsentieren zu können. Es handelt sich um Mastermind.
Es geht darum, einen zufällig gewählten Farbcode zu erraten. Dabei helfen einem die bis zu 4 kleinen Kästchen neben den bereits geratenen Farbcodes. Ist ein Feld schwarz eingefärbt, so hat man die Farbe einer Position genau erraten. Ein weißes Feld bedeutet zwar die richtige Farbe aber noch nicht die richtige Position.
Es gibt unterschiedliche Versionen dieses Spiels. In dieser kann jede Farbe auch mehrfach vorkommen.
Nun zum Einbau des Spiels. Es wird mal wieder die Grundscriptsammlung gebraucht.
Legt eine js-Datei mit dem folgenden Inhalt an und ladet sie auf einen Webspace.
Code: Alles auswählen
mmBlank="http://wktools.net/images/games/4gewinnt/blue/0.gif";
mmColors=["#ff0000","#00ff00","#0000ff","#ff6600","#00ffff","#ff00ff"];
mmExact="#000000";
mmRightColor="#ffffff";
mmCodeLength=4;
mmRoundCount=8;
mmBefehl = "/mm";
mmSpielfeldBorderStyle="1px dotted #006600";
mmTableBorderStyle="";
mmTdBorderStyle="1px dotted #444444";
mmAbsolutePosition=1;
mmSpielfeldColor="#aaaaaa";
//feste spielvariablen - nicht aendern!
mmTmpPlayer="";
mmTmpColors=[-1,-1,-1,-1];
mmColor="";
mmLoesung="";
mmStatus=0;
mmGameRunning=0;
function mmBefehlsAuswertung(eingabe, sender){
if(mmRoundCount<mmColors.length){
alert("Fehler: Es sind mehr Farben als Runden angegeben.");
}
u=strip_tags(eingabe);
m=strip_tags(sender);
u2=u.split(" ");
if(!mmGameRunning && u!=""){
document.write("im Moment läuft kein Mastermind-Spiel. Spiel starten per \""+mmBefehl+"\"");
return;
}
if(!mmGameRunning){
document.write("startet ein Mastermind-Spiel.");
tmpLoesung = mmBefehl+" ";
for(i=0;i<mmCodeLength;i++)
tmpLoesung += (parseInt(Math.random() * mmColors.length));
sendeText(tmpLoesung, m);
mmGameRunning=1;
mmTmpPlayer=m;
window.setTimeout("if(mmGameRunning==1)mmGameRunning=0;", 5000); //Wenn kein Spiel innerhalb von 3 Sekunden gestartet wird wird der Status wieder auf "kein Spiel laeuft" gesetzt.
return;
}
if(mmGameRunning==1 && m==mmTmpPlayer){
mmGameRunning=2;
mmLoesung=u;
mmTmpPlayer="";
mmZeichneTabelle();
mmStatus=0;
document.getElementsByTagName("table")[document.getElementsByTagName("table").length-1].style.display="none";
return;
}
if(mmGameRunning != 2) return;
mmZug(u);
}
function mmZug(u){
u=u.toLowerCase();
if(u.length!=mmCodeLength){
document.write("ungültiger Lösungsversuch.");
return;
}
loes=mmLoesung.split("");
u1=u.split("");
exact=0;
rightColor=0;
for(i=0;i<u1.length;i++){
//document.write('"'+u1[i]+'"')
parent.rightFrame.document.getElementsByName("mmSpalte"+i)[mmStatus].style.backgroundColor=mmColors[u1[i]];
if(u1[i]==loes[i])exact++;
}
for(i=0;i<u1.length;i++){
for(j=0;j<loes.length;j++){
if(loes[j] == u1[i]){
rightColor++;
loes[j]=-1; //damit bei mehrfach gleicher farbe nur je einmal gezaehlt wird
break;
}
}
}
for(i=0;i<exact;i++){
parent.rightFrame.document.getElementsByName("mmCheck"+i)[mmStatus].style.backgroundColor=mmExact;
}
for(;i<rightColor;i++){
parent.rightFrame.document.getElementsByName("mmCheck"+i)[mmStatus].style.backgroundColor=mmRightColor;
}
if(u==mmLoesung){
loes=mmLoesung.split("");
loesStr="";
for(i=0;i<loes.length;i++){
loesStr += "<img src='"+mmBlank+"' style='background-color:"+mmColors[loes[i]]+";width:16px;height:16px;'> ";
}
document.write("Mastermind gelöst! "+loesStr);
mmGameRunning=0;
setTimeout('r=parent.rightFrame;r.document.body.removeChild(r.document.getElementById("Mastermind"))', 3000);
return;
}
if(mmStatus==mmRoundCount-1){
loes=mmLoesung.split("");
loesStr="";
for(i=0;i<loes.length;i++){
loesStr += "<img src='"+mmBlank+"' style='background-color:"+mmColors[loes[i]]+";width:16px;height:16px;'> ";
}
document.write("Mastermind leider nicht gelöst. Lösung: "+loesStr);
mmGameRunning=0;
setTimeout('r=parent.rightFrame;r.document.body.removeChild(r.document.getElementById("Mastermind"))', 3000);
return;
}
tbls=document.getElementsByTagName("table");
tbls[tbls.length-1].style.display="none";
mmStatus++;
}
function mmZeichneTabelle(){
ie=(document.all&&!window.innerWidth && navigator.userAgent.toLowerCase().indexOf("msie") != -1)?1:0;
r = parent.rightFrame;
rd=r.document;
mmTabelle = rd.createElement("table");
mmTabelle.style.borderCollapse = "collapse";
mmTabelle.style.borderSpacing = "0px";
mmTabelle.style.border = mmTableBorderStyle;
mmTbody = rd.createElement("tbody");
for(i=0;i<mmRoundCount;i++){
mmTr = rd.createElement("tr");
mmTd = rd.createElement("td");
if(i<mmColors.length){
mmTd.style.border = mmTdBorderStyle;
if(!ie){
mmTdImg = new Image();
mmTdImg.src=mmBlank;
mmTdImg.style.height = "16px";
mmTdImg.style.width = "16px";;
mmTdImg.style.backgroundColor = mmColors[i];
mmTdImg.name = "farbfeld";
eval("mmTdImg.onclick = function(e){parent.mainframe.mmColor="+i+"}");
mmTd.appendChild(mmTdImg);
}
else{
mmTdImg = "<img src='"+mmBlank+"' style='hight:16px;width:16px;background-color:"+mmColors[i]+"' onclick='parent.mainframe.mmColor="+i+"' name='farbfeld' />";
mmTd.innerHTML += mmTdImg;
}
}
mmTr.appendChild(mmTd);
mmTd = rd.createElement("td");
mmTd.style.width = "16px";
mmTr.appendChild(mmTd);
for(j=0;j<mmCodeLength;j++){
mmTd = rd.createElement("td");
mmTd.style.border = mmTdBorderStyle;
if(!ie){
mmTdImg = new Image();
mmTdImg.src=mmBlank;
mmTdImg.style.height = "16px";
mmTdImg.style.width = "16px";
mmTdImg.name = "mmSpalte"+j;
eval("mmTdImg.onclick = function(e){parent.mainframe.mmColor='"+j+"'}");
mmTd.appendChild(mmTdImg);
}
else{
mmTdImg = "<img src='"+mmBlank+"' style='hight:16px;width:16px' onclick='parent.mainframe.mmBtnClick("+j+")' name='mmSpalte"+j+"' />";
mmTd.innerHTML += mmTdImg;
}
mmTr.appendChild(mmTd);
}
mmTd = rd.createElement("td");
mmTd.style.border = mmTdBorderStyle;
for(j=0;j<mmCodeLength;j++){
if(!ie){
mmTdImg = new Image();
mmTdImg.src=mmBlank;
mmTdImg.style.height = "8px";
mmTdImg.style.width = "8px";
mmTdImg.name = "mmCheck"+j;
//eval("mmTdImg.onclick = function(e){parent.mainframe.mmBtnClick("+")}");
mmTd.appendChild(mmTdImg);
if(j==1)mmTd.appendChild(rd.createElement("br"));
}
else{
mmTdImg = "<img src='"+mmBlank+"' style='hight:8px;width:8px'"+
//" onclick='parent.mainframe.mmBtnClick("+")'"+
"name='mmCheck"+j+"' />";
mmTd.innerHTML += mmTdImg+(j==1?"<br>":"");
}
}
mmTr.appendChild(mmTd);
mmTbody.appendChild(mmTr);
}
mmTr=rd.createElement("tr");
mmTd = rd.createElement("td");
mmTr.appendChild(mmTd);
mmTd = rd.createElement("td");
mmTr.appendChild(mmTd);
for(j=0;j<mmCodeLength;j++){
mmTd = rd.createElement("td");
mmTd.style.border = mmTdBorderStyle;
if(!ie){
mmTdImg = new Image();
mmTdImg.src=mmBlank;
mmTdImg.style.height = "16px";
mmTdImg.style.width = "16px";
mmTdImg.name = "loes"+j;
eval("mmTdImg.onclick = function(e){parent.mainframe.mmTmpColors["+j+"]=parent.mainframe.mmColor; this.style.backgroundColor=parent.mainframe.mmColors[parent.mainframe.mmColor];}");
mmTd.appendChild(mmTdImg);
}
else{
mmTdImg = "<img src='"+mmBlank+"' style='hight:16px;width:16px' onclick='parent.mainframe.mmTmpColors["+j+"]=parent.mainframe.mmColor; this.style.backgroundColor=parent.mainframe.mmColors[parent.mainframe.mmColor];' name='loes"+j+"' />";
mmTd.innerHTML += mmTdImg;
}
mmTr.appendChild(mmTd);
}
mmTd=rd.createElement("td");
mmTd.style.cursor="pointer";
mmTd.style.border = mmTdBorderStyle;
mmTd.appendChild(rd.createTextNode("OK"));
mmTd.onclick=function(){parent.mainframe.mmOK()};
mmTr.appendChild(mmTd);
mmTbody.appendChild(mmTr);
mmTabelle.appendChild(mmTbody);
mmSpielfeld = rd.createElement("p");
mmSpielfeld.style.backgroundColor=mmSpielfeldColor;
mmSpielfeld.style.border = mmSpielfeldBorderStyle;
mmSpielfeld.setAttribute("id", "Mastermind");
mmClose = rd.createElement("div");
mmClose.style.marginBottom="0px";
mmClose.style.textAlign="right";
mmCloseLink = rd.createElement("a");
mmCloseLink.setAttribute("href", "javascript:void(document.body.removeChild(document.getElementById('Mastermind')));");
mmCloseLink.appendChild(rd.createTextNode("X"));
mmClose.appendChild(mmCloseLink);
mmSpielfeld.appendChild(mmClose);
mmSpielfeld.appendChild(mmTabelle);
if(mmAbsolutePosition){
mmSpielfeld.style.position = "absolute";
mmSpielfeld.style.zIndex = "2";
mmSpielfeld.style.bottom = "10px";
mmSpielfeld.style.right = "15px";
}
if(rd.getElementById("Mastermind"))
rd.body.removeChild(rd.getElementById("Mastermind"));
rd.body.insertBefore(mmSpielfeld, rd.getElementsByTagName("p")[0]);
}
function mmOK(){
if(!parent.mainframe.mmTmpColors.inArray(-1)){
parent.mainframe.sendeText(parent.mainframe.mmBefehl+" "+parent.mainframe.mmTmpColors.join(""));
mmTmpColors=[-1,-1,-1,-1];
for(i=0;i<mmCodeLength;i++)
parent.rightFrame.document.getElementsByName("loes"+i)[0].style.backgroundColor="transparent";
}
else{
alert("Es muessen alle "+mmCodeLength+" Felder belegt sein.");
}
}
Code: Alles auswählen
<script type="text/javascript" src="http://script-url.js"></script>
Die 2. Zeile bestimmt wieviele und welche Farben zur Wahl stehen.
Code: Alles auswählen
mmColors=["#ff0000","#00ff00","#0000ff","#ff6600","#00ffff","#ff00ff"];

Ihr dürft nicht mehr als 10 Farben einstellen, da es sonst zu Fehlern kommt... aber ich denke das ist nicht so tragisch... ein code mit 10 Farben hätte 10000 möglichkeiten und das ist wohl kaum noch zu knacken.
Zum Vergleich: diese standard-variante mit 6 farben hat nur 1296 mögliche Lösungen... ein achtel!
mmExact ist die Farbe der "indikator-Felder" wenn farbe und position stimmen.
mmRightColor ist die Farbe der "indikatorfelder" wenn man die richtige farbe an falscher position hat.
mmCodeLength bestimmt über die Länge der Farbcodes. Diese Zahl darf nicht größer als 9 sein.
mmRoundCount bestimmt darüber wie viele Versuche man hat. Allein schon aus design-gründen, aber auch weil es anders ziemlich sinnlos wäre muss es immer mindestens so viele runden geben wie farben. andernfalls gibts ein fehlermeldungs-alert.
mmBefehl ist der Chatbefehl, den ihr später auch noch anlegen müsst. Dieser muss nur jeweils einmal zum Starten eingegeben werden. Alles andere funktioniert dann automatisch per klick im spielfeld. Daher ist es nicht unbedingt so wichtig dass der Name kurz gehalten wird. könnt ihn auch z.B. /mastermind nennen.
Die folgenden 3 Felder bestimmen über die Rahmen von Spielfeld, Tabelle und Zellen im Spielfeld.
ist mmAbsolutePosition auf 1 gesetzt, so erscheint das spielfeld absolut positioniert und überlagert ggf. die Nicks der Onlineliste. Setzt man es auf 0, so wird es fest oberhalb "Derzeit im Raum" angezeigt und verschiebt damit den eigentlichen Inhalt der OL nach unten.
per mmSpielfeldColor könnt ihr die Hintergrundfarbe des Spielfeldes einstellen. Durch die vielen Farben im Spiel ist hier ein neutrales grau vermutlich angemessen, ihr könnt aber auch gerne etwas anderes probieren

Alles was darunter steht muss und sollte nichtmehr angepasst werden.
Nun der Chatbefehl den ihr anlegen müsst... Wie ihr ihn nennt ist wie gesagt euch überlassen (empfehlung /mm oder /mastermind) Ihr müsst den angelegten Befehl dann nur auch im Script eintragen.
Code: Alles auswählen
<script type=text/javascript>if(parent.info){mmBefehlsAuswertung('%user%','%me%');}else{document.write('spielt Mastermind')}</script>
Edit 22.12.09: Das Spiel funktioniert nun auch im IE.