Seite 1 von 1

Spiel: Minesweeper

Verfasst: 28.08.2009, 21:55
von 1. FC Keller
Ich weiß es nervt langsam aber ich hab schonwieder ein spiel für euch ;-)

Für alle die noch nie an einem PC saßen und langeweile hatten:
In diesem Spiel geht es darum zu "erraten" wo sich die minen befinden. wenn ihr ein feld aufdeckt zeigt es euch an wie viele minen an diesem feld anliegen (horizontal, vertikal oder diagonal) Daher haben die aufgedeckten Felder immer einen wert zwischen 0 und 8. Ist der wert 0, so werden automatisch alle felder aufgedeckt die diesem anliegen.

Der Einbau ist wie immer... den folgenden code angepasst in eine js-Datei speichern und hochladen:

Code: Alles auswählen

mwBlank="http://wktools.net/images/games/4gewinnt/blue/0.gif";
mwFahne="http://wktools.net/images/games/minesweeper/moni/fahne.gif";
mwMineOK="http://wktools.net/images/games/minesweeper/moni/bombe.gif";
mwMineExp="http://wktools.net/images/games/minesweeper/moni/bombee.gif";
mwImgs="http://wktools.net/images/games/minesweeper/moni/";
mwBilder=[mwImgs+"00.gif", mwImgs+"01.gif", mwImgs+"02.gif", mwImgs+"03.gif", mwImgs+"04.gif", mwImgs+"05.gif", mwImgs+"06.gif", mwImgs+"07.gif", mwImgs+"08.gif"];
mwCols=10;
mwRows=12;
mwMines=14;
mwBefehl = "/mw";
mwSpielfeldBorderStyle="1px dotted #006600";
mwTableBorderStyle="";
mwTdBorderStyle="4px outset #444444";
mwAbsolutePosition=1;
mwSpielfeldColor="#aaaaaa";

//feste spielvariablen - nicht aendern!
mwTmpPlayer="";
mwLoesung=[];
mwOffen=[];
mwAnliegend=[];
mwGameRunning=0;

function mwBefehlsAuswertung(eingabe, sender){
  u=strip_tags(eingabe);
  m=strip_tags(sender);
  u2=u.split(" ");
  if(!mwGameRunning && u!=""){
    document.write("im Moment läuft kein Minesweeper-Spiel. Spiel starten per \""+mwBefehl+"\"");
    return;
  }
  if(!mwGameRunning){
    document.write("startet ein Minesweeper-Spiel.");
    tmp="";
    for(i=0;i<mwMines;i++){
      tmp += " "+parseInt(Math.random() * mwCols*mwRows);
    }
    sendeText(mwBefehl+tmp, m);
    mwGameRunning=1;
    mwTmpPlayer=m;
    window.setTimeout("if(mwGameRunning==1)mwGameRunning=0;", 3000); //Wenn kein Spiel innerhalb von 3 Sekunden gestartet wird wird der Status wieder auf "kein Spiel laeuft" gesetzt.
    return;
  }
  if(mwGameRunning==1 && m==mwTmpPlayer){
    mwGameRunning=2;
    mwLoesung=u.split(" ");
    for(i=0;i<mwLoesung.length;i++)mwLoesung[i]=parseInt(mwLoesung[i]);
    mwTmpPlayer="";
    mwZeichneTabelle();
    mwOffen=[];
    mwAnliegend=[];
    mwStatus=0;
    document.getElementsByTagName("table")[document.getElementsByTagName("table").length-1].style.display="none";
    return;
  }
  if(mwGameRunning != 2) return;
  mwZug(u);
}

function mwZug(u){
  u=u.toLowerCase();
  u1=u.split(" ");
  tbls=document.getElementsByTagName("table");
  if(u1.length != 2){
    document.write("ung&uuml;ltiger Zug.");
    return
  }
  u1[0]=parseInt(u1[0]);
  u1[1]=parseInt(u1[1]);
  if(u1[0] == 2){
    parent.rightFrame.document.getElementsByName("mwfeld")[u1[1]].src=mwFahne;
    tbls[tbls.length-1].style.display="none";
    return;
  }
  if(u1[0] == 1){
    if(mwLoesung.inArray(u1[1])){
      document.write("Minesweeper verloren!");
      for(i=0;i<mwLoesung.length;i++)
	parent.rightFrame.document.getElementsByName("mwfeld")[mwLoesung[i]].src=mwMineOK;
      parent.rightFrame.document.getElementsByName("mwfeld")[u1[1]].src=mwMineExp;
      mwGameRunning=0;
      setTimeout('r=parent.rightFrame;r.document.body.removeChild(r.document.getElementById("Minesweeper"))', 3000);
      return;
    }
    if(!mwOffen.inArray(parseInt(u1[1])))mwAufdecken(u1[1]);
    if(mwOffen.length==(mwCols*mwRows-mwMines)){//gewonnen
      document.write("Minesweeper gewonnen!");
      mwGameRunning=0;
      setTimeout('r=parent.rightFrame;r.document.body.removeChild(r.document.getElementById("Minesweeper"))', 3000);
      return;
    }
    else{
      tbls[tbls.length-1].style.display="none";
    }
  }
}

function mwZeichneTabelle(){
  ie=(document.all&&!window.innerWidth && navigator.userAgent.toLowerCase().indexOf("msie") != -1)?1:0;
  r = parent.rightFrame;
  rd=r.document;
  mwTabelle = rd.createElement("table");
  mwTabelle.style.borderCollapse = "collapse";
  mwTabelle.style.borderSpacing = "0px";
  mwTabelle.style.border = mwTableBorderStyle;
  mwTbody = rd.createElement("tbody");
  k=0;
  for(i=0;i<mwRows;i++){
    mwTr = rd.createElement("tr");
    for(j=0;j<mwCols;j++){
      mwTd = rd.createElement("td");
      mwTd.style.border = mwTdBorderStyle;
      if(!ie){
	mwTdImg = new Image();
	mwTdImg.src=mwBlank;
	mwTdImg.style.height = "10px";
	mwTdImg.style.width = "10px";
	mwTdImg.name = "mwfeld";
	eval("mwTdImg.onmouseup = function(e){e=e?e:window.event; k=e.which==1?1:2; parent.mainframe.sendeText('"+mwBefehl+" '+k+' "+k+"');}");
	mwTdImg.oncontextmenu=function(e){return false;};
	mwTd.appendChild(mwTdImg);
      }
      else{
	mwTdImg = "<img src='"+mwBlank+"' style='hight:10px;width:10px;' name='mwfeld' />";
	mwTd.innerHTML += mwTdImg;
	eval('mwTd.getElementsByTagName("img")[0].onmouseup=function(e){e=e?e:parent.rightFrame.event; k=((e.button==1)?1:2); parent.mainframe.sendeText("'+mwBefehl+' "+k+" '+k+'"); return false;}');
	mwTd.getElementsByTagName("img")[0].oncontextmenu=function(e){return false;};
      }
      k++;
      mwTr.appendChild(mwTd);
    }
    mwTbody.appendChild(mwTr);
  }
  mwTabelle.appendChild(mwTbody);
  mwSpielfeld = rd.createElement("p");
  mwSpielfeld.style.backgroundColor=mwSpielfeldColor;
  mwSpielfeld.style.border = mwSpielfeldBorderStyle;
  mwSpielfeld.setAttribute("id", "Minesweeper");
  mwClose = rd.createElement("div");
  mwClose.style.marginBottom="0px";
  mwClose.style.textAlign="right";
  mwCloseLink = rd.createElement("a");
  mwCloseLink.setAttribute("href", "javascript:void(document.body.removeChild(document.getElementById('Minesweeper')));");
  mwCloseLink.appendChild(rd.createTextNode("X"));
  mwClose.appendChild(mwCloseLink);
  mwSpielfeld.appendChild(mwClose);
  mwSpielfeld.appendChild(mwTabelle);
  if(mwAbsolutePosition){
    mwSpielfeld.style.position = "absolute";
    mwSpielfeld.style.zIndex = "2";
    mwSpielfeld.style.bottom = "10px";
    mwSpielfeld.style.right = "15px";
  }
  
  if(rd.getElementById("Minesweeper"))
  rd.body.removeChild(rd.getElementById("Minesweeper"));
  rd.body.insertBefore(mwSpielfeld, rd.getElementsByTagName("p")[0]);
}

function mwAufdecken(mwFeldID){
  var mineCount=0;
  var anliegend=[];
  mwFeldID=parseInt(mwFeldID);
  mwOffen[mwOffen.length]=mwFeldID;
  if(mwFeldID>=mwCols){
    j=mwFeldID-mwCols;
    if(mwFeldID%mwCols)j--;
    for(;(j%mwCols || (mwFeldID%mwCols<2)) && j<(mwFeldID-mwCols+2);j++){
      if(mwLoesung.inArray(j))mineCount++;
      anliegend[anliegend.length]=j;
    }
  }
  if(mwFeldID<(mwCols*(mwRows-1))){
    j=mwFeldID+mwCols;
    if(mwFeldID%mwCols)j--;
    for(;(j%mwCols || (mwFeldID%mwCols<2)) && j<(mwFeldID+mwCols+2);j++){
      //console.log("100ercheck"+j);
      if(mwLoesung.inArray(j))mineCount++;
      anliegend[anliegend.length]=j;
    }
  }
  if(mwFeldID%mwCols){
    //console.log(mwFeldID+"%"+mwCols+"="+(mwFeldID%mwCols))
    if(mwLoesung.inArray(mwFeldID-1))mineCount++;
    anliegend[anliegend.length]=mwFeldID-1;
  }
  if((mwFeldID+1)%mwCols){
    if(mwLoesung.inArray(mwFeldID+1))mineCount++;
    anliegend[anliegend.length]=mwFeldID+1;
  }
  //console.log(mwFeldID + " "+ anliegend + " " + mineCount);
  parent.rightFrame.document.getElementsByName("mwfeld")[mwFeldID].parentNode.style.border="solid 1px #eeeeee";
  //console.log(parent.rightFrame.document.getElementsByName("mwfeld")[mwFeldID].src=mwBilder[mineCount]);
  parent.rightFrame.document.getElementsByName("mwfeld")[mwFeldID].src=mwBilder[mineCount];
  if(mwOffen.length==(mwCols*mwRows-mwMines))return;
  if(mineCount==0){
    for(mwTmp=0;mwTmp<anliegend.length;mwTmp++){
      //console.log("offen:");
      //console.log(mwOffen);
      if(!mwAnliegend.inArray(anliegend[mwTmp]))mwAnliegend[mwAnliegend.length]=(anliegend[mwTmp]);
    }
  }
  for(mwTmp=0;mwTmp<mwAnliegend.length;mwTmp++){
    if(!mwOffen.inArray(mwAnliegend[mwTmp]))mwAufdecken(mwAnliegend[mwTmp]);
  }
}
In den ersten Zeilen stellt ihr die bilder-urls ein. zuerst ein transparentes, dann die fahne , dann die normale und die explodierte mine.
danach kommt das verzeichnis in dem alle zahlen-bilder liegen und anschließend die auflistung der zahlenbilder. für die 0 könnt ihr auch ein transparentes bild nehmen. die bilder haben maße von 10x10 pixel. moni hat wie immer ein paar bildchen für euch vorbereitet: http://wktools.net/images/games/mineswe ... r-moni.zip ladet euch dieses zip-File runter, entpackt es und ladet die bilder auf euren Webspace hoch.

Die Zahl hinter mwCols ist die Anzahl an spalten (nebeneinander), mwRows die Zeilen (höhe) und mwMines die Anzahl der Minen die zufällig im feld verteilt werden.

mwBefehl ist wie bei den letzten 3 Spielen auch der Befehl den ihr euch selbst aussuchen könnt.
In den folgenden 5 Zeilen könnt ihr wie immer das Desgn des Spielfeldes idividuell anpassen. mwSpielfeldColor ist dabei so ziemlich das wichtigste. Das ist die Hintergrundfarbe des spielfeldes. Die anderen style-einstellungen sind eher unwichtig.

anschließend legt ihr wie immer den zuvor eingestellten chatefehl an.

Code: Alles auswählen

<script type=text/javascript>if(parent.info){mwBefehlsAuswertung('%user%','%me%');}else{document.write('spielt Minesweeper')}</script>

Re: Minesweeper

Verfasst: 28.08.2009, 22:24
von craig
hab es eingebaut funktioniert super :D

Re: Minesweeper

Verfasst: 29.08.2009, 02:34
von iDark
bei mir geht es irgendwie nicht.

Wenn ich /ms befehl eingebe, wird das Spiel nach ne Sek. wieder beendet :[

(02:32) iDark startet ein Minesweeper-Spiel.
(02:32) iDark im Moment läuft kein Minesweeper-Spiel. Spiel starten per "/ms"

Bilder eingetragen
Grundscript
JS-Datei
Befehl ist auch in ordnung >.<

Re: Minesweeper

Verfasst: 29.08.2009, 02:46
von 1. FC Keller
das problem hatte ich selbst auch, hab aber den folgenden Lösungsansatz selbst noch nicht getestet. in der ersten Funktion findest du folgende Zeile:

Code: Alles auswählen

window.setTimeout("if(mwGameRunning==1)mwGameRunning=0;", 3000); //Wenn kein Spiel innerhalb von 3 Sekunden gestartet wird wird der Status wieder auf "kein Spiel laeuft" gesetzt.
Diese sorgt dafür dass ein Spielstart-Befehl innerhalb von 3 Sekunden Quittiert werden muss und wenn das nicht passiert dieser als Ungültig angesehen wird. Allerdings kann dies bei zu stark verzögertem Laden des Streams oder auch im Problemmodus zu problemen führen, da die Antwort dann ggf. dann nicht binnen 3 Sekunden ankommt. Um das Problem zu lösen erhöht einfach die 3000 vekiebig (bspw auf 10 000). Bedenkt dabei allerdings dass es, je höher dieses Zeitlimit ist desto einfacher wird bei diesem spiel zu schummeln.

Re: Minesweeper

Verfasst: 29.08.2009, 02:58
von iDark
Mh.. egal wie hoch ich Zeitlimit setze, ändert sich Ergebnis nicht. :oops:

wieso lief es bei Craig problemlos und bei mir macht es solche probleme ..habe ich vllt doch irgendwas übersehen :-O


EDIT: Nun zeigen die ganze 'Minispiele' + Hangman + Mastermind + Minesweeper gleiche Fehl-Ergebnisse
(07:21) iDark startet ein Hangman-Spiel.
(07:21) iDark im Moment läuft kein Hangman-Spiel
(07:24) iDark startet ein Mastermind-Spiel.
(07:24) iDark im Moment läuft kein Mastermind-Spiel. Spiel starten per "/mm"
Minispiele:
(07:28) iDark
(07:28) iDark schmeisst den einarmigen Banditen an: BILD!

Schreibleiste: /bandit 18
Jetzt spinnen fast alle Spiele [bis auf wordmix-4gewinnt-ttt-dame]

Re: Minesweeper

Verfasst: 29.08.2009, 16:24
von craig
probier mal den befehl unter /mw zu speichern :)

Re: Minesweeper

Verfasst: 29.08.2009, 22:45
von DarkModi
Ich hab das Script jetzt nicht getestet, aber geh mal bei Minesweeper davon aus, dass es ein Singleplayer-Game ist und auch niemand zusehen kann. Wieso werden die Befehle also dann über den Chatserver zuerst in den Stream gepostet und dann clientseitig interpretiert anstatt einfach direkt clientseitig über JS ausgeführt zu werden?

Keine Kritik oder so, fiel mir halt nur beim Drüberfliegen auf. (Die Frage hat sich natürlich erledigt, falls das Spiel zum Zuschauen gedacht ist.)

Re: Minesweeper

Verfasst: 29.08.2009, 22:46
von TauchBlubba
Ist Multi :wink:

Re: Minesweeper

Verfasst: 09.09.2009, 19:21
von InvaderX
1. FC Keller hat geschrieben:das problem hatte ich selbst auch, hab aber den folgenden Lösungsansatz selbst noch nicht getestet. in der ersten Funktion findest du folgende Zeile:

Code: Alles auswählen

window.setTimeout("if(mwGameRunning==1)mwGameRunning=0;", 3000); //Wenn kein Spiel innerhalb von 3 Sekunden gestartet wird wird der Status wieder auf "kein Spiel laeuft" gesetzt.
Diese sorgt dafür dass ein Spielstart-Befehl innerhalb von 3 Sekunden Quittiert werden muss und wenn das nicht passiert dieser als Ungültig angesehen wird. Allerdings kann dies bei zu stark verzögertem Laden des Streams oder auch im Problemmodus zu problemen führen, da die Antwort dann ggf. dann nicht binnen 3 Sekunden ankommt. Um das Problem zu lösen erhöht einfach die 3000 vekiebig (bspw auf 10 000). Bedenkt dabei allerdings dass es, je höher dieses Zeitlimit ist desto einfacher wird bei diesem spiel zu schummeln.
Jetzt geht des bei mir im Chat ohne Probleme thx für die Lösung und des Spiel

Re: Spiel: Minesweeper

Verfasst: 12.11.2009, 12:35
von Blachy66
Ein dickes Lob an 1 FC Keller super Game für den Chat und auch ein Danke für die tolle Hilfe. :)
Hilfe indem mit der Tipp gegeben wurde wie man das Spiel weiter nach rechts verschiebt.
Hier die Lösung:
mwSpielfeld.style.zIndex = "2";
mwSpielfeld.style.bottom = "10px";
mwSpielfeld.style.right = "0px"; <-- vorher 15