Spiel: Mastermind

Infos zu Spielen, Bots und Tools.
1. FC Keller
Moderator
Beiträge: 866
Registriert: 04.07.2004, 17:10
Wohnort: heimat:// Thüringen.Deutschland.eu/ Zeulenroda
Kontaktdaten:

Spiel: Mastermind

Ungelesener Beitrag von 1. FC Keller » 24.08.2009, 23:22

Hallo,

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&auml;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&uuml;ltiger L&ouml;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&ouml;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&ouml;st. L&ouml;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.");
  }
}
Anschließend wird diese js-Datei wie immer in die normale und die Gastankündigung eingebunden...

Code: Alles auswählen

<script type="text/javascript" src="http://script-url.js"></script>
Es wird nur ein transparentes gif-bild gebraucht. Klickt einfach mit rechts hier und wählt "Ziel speichern unter" (kann je nach browser etwas anders lauten). Anschließend ladet ihr es hoch und setzt die URL in der ersten Zeile ein.

Die 2. Zeile bestimmt wieviele und welche Farben zur Wahl stehen.

Code: Alles auswählen

mmColors=["#ff0000","#00ff00","#0000ff","#ff6600","#00ffff","#ff00ff"];
Es wird nicht geprüft ob eine Farbe hier mehrfach vorkommt.. dafür müsst ihr selbst sorgen ;)
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 13.09.09: man kann nun auch die Länge des Codes einestellen (standard ist 4)
Edit 22.12.09: Das Spiel funktioniert nun auch im IE.
Zuletzt geändert von 1. FC Keller am 22.12.2009, 15:56, insgesamt 6-mal geändert.
Grund: Spiel funktionierte im IE nicht korrekt

TauchBlubba
Beiträge: 79
Registriert: 21.10.2007, 19:04
Wohnort: Altenstadt (Mittelhessen)
Kontaktdaten:

Re: Spiel: Mastermind

Ungelesener Beitrag von TauchBlubba » 25.08.2009, 15:26

Ich fasse mich mal kurz: GENIAL :!: :mrgreen:

TauchBlubba
Beiträge: 79
Registriert: 21.10.2007, 19:04
Wohnort: Altenstadt (Mittelhessen)
Kontaktdaten:

Re: Spiel: Mastermind

Ungelesener Beitrag von TauchBlubba » 27.08.2009, 18:59

Ähm kurze Frage : )

Wenn ein Spiel gestartet wird, und anschliessend kommt jemand in den Chat, steht bei demjenigen bei jeder Farbauswahl folgendes
(18:54) Username im Moment läuft kein Mastermind-Spiel. Spiel starten per "/mm"
Kann man das unterbinden? Verwirrend wenn der noch ein Spiel startet ect.

--------------------------------------------
Tipp an die anderen: Script möglichst oben in die Ankündigung packen.

1. FC Keller
Moderator
Beiträge: 866
Registriert: 04.07.2004, 17:10
Wohnort: heimat:// Thüringen.Deutschland.eu/ Zeulenroda
Kontaktdaten:

Re: Spiel: Mastermind

Ungelesener Beitrag von 1. FC Keller » 27.08.2009, 19:13

Dieses Problem ist mir bekannt... das gibts ebenfalls bei hangman, wordmix (beide ^^) und dem spiel das ich gerade schreibe... aber hab bisher keine idee wie man das lösen kann... höchstens halt statt der fehlermeldungen grundsätzlich nix ausgeben und die chatzeilen verstecken. aber trotzdem könnte der user auch ohne diese fehlermeldungen ein eigenes spiel starten, was wieder im chaos endet... am ende hilft nurnoch /cls um bei allen wieder den gleichen stand zu erreichen.

TommyboyTSK
Beiträge: 9
Registriert: 23.12.2006, 22:45
Kontaktdaten:

Re: Spiel: Mastermind

Ungelesener Beitrag von TommyboyTSK » 13.09.2009, 02:02

Hi,

erstmal ein dickes Danke für dieses Chat-Game, aber nu hab ich eine Frage.
Ist es möglich das man das script so modifiziert, dass man 5 Farben erraten muss statt wie bisher 4, also sprich 5 statt 4 Reihen ? Das wär nämlich noch eine weitere Spielvariante von Mastermind, eine sehr schwierige.

Ich weiß jetzt net wie aufwändig die modifizierung für solches Vorhaben ist, weil dazu müsste man noch ein weiteres Prüffeld dazufügen, deswegen ist das nur eine Frage von mir.

lg

1. FC Keller
Moderator
Beiträge: 866
Registriert: 04.07.2004, 17:10
Wohnort: heimat:// Thüringen.Deutschland.eu/ Zeulenroda
Kontaktdaten:

Re: Spiel: Mastermind

Ungelesener Beitrag von 1. FC Keller » 13.09.2009, 15:09

Habe den Code nun so angepasst dass man die Länge des Codes frei einstellen kann.
Passt dazu nur diese Zeile an:

Code: Alles auswählen

mmCodeLength=4;
das höchste was vom Script unterstützt wird ist 10 wobei derartig lange codes sowieso viel zu schwierig wären und auch von der breite her gar nicht in die onlineliste passen.

Blachy66
Beiträge: 9
Registriert: 10.11.2009, 23:01
Wohnort: Lünen

Re: Spiel: Mastermind

Ungelesener Beitrag von Blachy66 » 25.11.2009, 12:06

Also bei mir funz garnichts :) fehlt da nicht der Pfad wie beim Minesweeper?
mwImgs="http://.............../spiele/minesweeper/";
Ist nur eine Frage, da bei mir nichts passiert oder braucht man wieder diverse Bildchen?

1. FC Keller
Moderator
Beiträge: 866
Registriert: 04.07.2004, 17:10
Wohnort: heimat:// Thüringen.Deutschland.eu/ Zeulenroda
Kontaktdaten:

Re: Spiel: Mastermind

Ungelesener Beitrag von 1. FC Keller » 25.11.2009, 12:55

Dieses Spiel braucht nur ein 1x1 Pixel transparentes gif-Bildchen. Alles andere wird per CSS gemacht.

1. FC Keller
Moderator
Beiträge: 866
Registriert: 04.07.2004, 17:10
Wohnort: heimat:// Thüringen.Deutschland.eu/ Zeulenroda
Kontaktdaten:

Re: Spiel: Mastermind

Ungelesener Beitrag von 1. FC Keller » 22.12.2009, 15:59

Es wundert mich dass bisher niemandem aufgefallen ist dass das Spiel im IE nicht läuft... da ich selbst keinen IE nutze ist mir das leider auch nicht aufgefallen. Nun habe ich den Code jedenfalls so abgeändert dass es auch im IE funzt.

Antworten

Wer ist online?

Mitglieder in diesem Forum: Ahrefs [Bot] und 32 Gäste