var Laufend = '';
var Zeitgeber;
function Vorfuehre(Schalter) {
  if (Laufend!='' && (eval(Laufend+'Zuende()') || Schalter!='')) {
    document.forms[Laufend+'Brett'].VSchalter.value = 'Vorf'+unescape("%FC")+'hren';
    clearTimeout(Zeitgeber);
    Laufend = ''
    }
  else {
    if (Laufend=='') eval(Schalter+'Starte()')
    else eval(Laufend+'Finde()');
    Zeitgeber = setTimeout('Vorfuehre("")',500);
    if (Laufend=='') Laufend = Schalter;
    document.forms[Laufend+'Brett'].VSchalter.value = 'Anhalten'
  } }
function Warte(Frist) {
  var Zeit = new Date();
  var Jetzt = new Date();
  while (Jetzt.getTime()-Zeit.getTime()<Frist) {
    Jetzt = null;
    Jetzt = new Date()
    }
  Jetzt = null
  }
function Lade() {
  with (document.Computer) {
    RAuswahl[Reihenfolge].checked = true;
    SAuswahl[Staerke].checked = true;
    }
  document.WBrett.VAuswahl[WVariante].checked = true
  }
function Entlade() {
  if (Laufend) clearTimeout(Zeitgeber)
  }

// Spielstärke
var Reihenfolge = 1;
var Staerke = 1;

// Silberdollarspiel / Welters Spiel
var WVariante = 0;
var WFelder = 16; // skalierbar
var WBesetzt = new Array(WFelder);
var WBeginn;
var WEnde;
var WSpieler;
var WZug;
var WKandidat = -1;
function WZeichne() {
  document.write('<table align="center" bgcolor="#DDDDDD" border="5" cellpadding="0" cellspacing="1"><tr>');
  for (var Feld = 0; Feld<WFelder; Feld++)
    document.write('<td><a href="javascript:WWaehle('+Feld+')">'+
      '<img src="spiele/w00.gif" name="w'+Feld+'" border="0" height="30" width="30" /></a></td>');
  document.write('</tr><tr align="center">');
  for (var Feld = 0; Feld<WFelder; Feld++)
    document.write('<td>'+(Feld+1)+'</td>');
  document.write('</tr></table>');
  WStarte()
  }
function WZeige(Feld,Markiert) {
  document.images['w'+Feld].src =
    'spiele/w'+(WBesetzt[Feld]?(WVariante==0?'1':'2'):'0')+(Markiert?(WVariante==0?'1':'2'):'0')+'.gif';
  document.WBrett.Zuege.value = WZug
  }
function WMarkiere(Ziel,Start) {
  WZeige(Ziel,true);
  WZeige(Start,true);
  Warte(500);
  WZeige(Ziel,false);
  WZeige(Start,false)
  }
function WStarte() {
  WVariante = (document.WBrett.VAuswahl[1].checked?1:0);
  WZug = 0;
  var Rest = 3+Math.random()*5;
  for (var Feld = 0; Feld<WFelder; Feld++) {
    WBesetzt[Feld] = Feld>0 && Math.random()<Rest/(WFelder-Feld);
    if (WBesetzt[Feld]) Rest--
    }
  WBeginn = 0;
  WEnde = WFelder-1;
  WBegrenze();
  for (var Feld = 0; Feld<WFelder; Feld++) WZeige(Feld,false);
//WMarkiere(0,0);
  WKandidat = -1;
  WSpieler = (Reihenfolge+1)%3;
  if (WSpieler==0) WWaehle(0)
  }
function WZiehe(Ziel,Start) {
  if (!WBesetzt[Ziel] && WBesetzt[Start] && Ziel<Start) {
    ++WZug;
    WMarkiere(Ziel,Start);
    WBesetzt[Ziel] = true;
    WBesetzt[Start] = false;
    WMarkiere(Ziel,Start);
    WBegrenze();
    if (Laufend=='' && !WZuende()) WSpieler = 3-Reihenfolge-WSpieler
  } }
var Reihe1 = new Array(WFelder);
var Reihe2 = new Array(WFelder);
function WBewertung() {
  if (WVariante==0) {
    var Ende = WBeginn;
    var Summe = 0;
    var Speicher = 0;
    for (var Beginn = WBeginn; Beginn<=WEnde; Beginn++)
      if (WBesetzt[Beginn]) {
        var Zahl = Summe;
        Summe = Speicher;
        Speicher = Zahl;
        Summe = Summe^(Beginn-Ende);
        Ende = Beginn+1
        }
    return Summe==0
    }
  else {
    var Anzahl = 0;
    for (var Feld1 = WBeginn; Feld1<=WEnde; Feld1++)
      if (WBesetzt[Feld1]) {
        Reihe1[++Anzahl] = Feld1-WBeginn;
        Reihe2[Anzahl] = 0
        }
    for (Feld1 = 1; Feld1<Anzahl; Feld1++)
      for (var Feld2 = Feld1; Feld2>=1; Feld2--) {
        Reihe2[Feld2] = Reihe1[Feld2];
        Reihe1[Feld2] = (Reihe1[Feld2]^Reihe1[Feld2+1])-1^Reihe2[Feld2+1]
        }
    return Reihe1[1]==0
  } }
function WBewertung2() { // Testbewertung für Variante==0
  var Anzahl = 1;
  var Ende = WEnde;
  var Summe = 0;
  for (var Beginn = WEnde; Beginn>=WBeginn; Beginn--)
    if (Beginn==0 || WBesetzt[Beginn-1]) {
      if (++Anzahl%2==0) Summe = Summe^(Ende-Beginn);
      Ende = Beginn
      }
  return Summe==0
  }
function WFinde() {
  var Gut = WBewertung() || Math.random()*3>Staerke+1;
  var Versuch = 0;
  while (Versuch++==0 || !Gut) {
    var Ziel = WEnde;
    while (WBesetzt[Ziel]) Ziel = Math.floor(Math.random()*(WEnde-WBeginn)+WBeginn);
    var Start = Ziel;
    while (!WBesetzt[Start]) Start = (WVariante==0?Start+1:Math.floor(Math.random()*(WEnde-Ziel)+Ziel+1));
    WBesetzt[Ziel] = true;
    WBesetzt[Start] = false;
    Gut = Gut || WBewertung();
    WBesetzt[Ziel] = false;
    WBesetzt[Start] = true
    }
  WZiehe(Ziel,Start)
  }
function WWaehle(Feld) {
  if (WSpieler>0 && !WZuende() && Feld>=WBeginn && Feld<=WEnde)
    if (WVariante==0) {
      var Start = Feld;
      while (!WBesetzt[Start]) Start++;
      WZiehe(Feld,Start)
      }
    else {
      if (WKandidat<0) {
        WKandidat = Feld;
        WZeige(Feld,true)
        }
      else {
        WZiehe((WBesetzt[Feld]?WKandidat:Feld),(WBesetzt[Feld]?Feld:WKandidat));
        WZeige(WKandidat,false);
        WKandidat = -1
     }  }
  if (WSpieler==0 && !WZuende()) WFinde();
  if (WZuende())
    alert((WSpieler==0?'Der Computer hat':(Reihenfolge==0?'Spieler '+WSpieler+' hat':'Sie haben'))+' diese Partie gewonnen.')
  }
function WBegrenze() {
  while (WBesetzt[WBeginn]) WBeginn++;
  while (!WBesetzt[WEnde]) WEnde--
  }
function WZuende() {
  return WBeginn>WEnde
  }

// Tic-Tac-Toe
var TSeite = 3;
var TFelder = TSeite*TSeite;
var TSymbole = new Array(TFelder);
var TZug = 0;
function TZeichne() {
  document.write('<table align="center" border="5" cellpadding="0" cellspacing="0">');
  for (var Feld = 0; Feld<TFelder; Feld++) {
    document.write((Feld%TSeite==0?'<tr>':'')+
      '<td><input type="button" name="Feld'+Feld+'" value="___" onclick="TSetze('+Feld+')" style="width:16px;" /></td>'+((Feld+1)%TSeite==0?'</tr>':''));
    TZeige(Feld,' ')
    }
  document.write('</table>')
  }
function TStarte() {
  for (Feld = 0; Feld<TFelder; Feld++) TZeige(Feld,' ');
  TZug = 0;
  if (document.Computer.RAuswahl[1].checked && !TZug++) TZeige(4,'O')
  }
function TZeige(Feld,Symbol) {
  TSymbole[Feld] = Symbol;
  document.TBrett['Feld'+Feld].value = Symbol
  }
function TSetze(Feld) {
  if (TZug<0) alert('Eine Partie muss gestartet werden.')
  else if (TSymbole[Feld]!=' ') alert('Dieser Zug ist nicht erlaubt.')
  else {
    TZeige(Feld,'X');
    if (TZuende(TSymbole)) TBeende('Sie haben gewonnen.')
    else {
      Feld = TBestzug(TSymbole);
      if (Feld<0) TBeende('Es gibt keinen Gewinner.')
      else {
        TZeige(Feld,'O');
        if (TZuende(TSymbole)) TBeende('Sie haben verloren.')
        else document.TBrett.Meldung.value = 'Ich habe auf '+Feld+' gesetzt.';
  } } } }
function TBeende(Text) {
  document.TBrett.Meldung.value = Text;
  TZug = -1
  }
function TBestzug(Testsymbole) {
  var Feld;
  var Wert;
  var Bestwert = -2;
  Bestzug = -1;
  if (TZug++==0)
    if (Testsymbole[4]==' ') return 4;
    else if (Testsymbole[0]==' ') return 0;
  for (var Feld = 0; Feld<TFelder; Feld++) {
    if (Testsymbole[Feld]!=' ') continue;
    Testsymbole[Feld] = 'O';
    Wert = TBestgegenzug(Testsymbole,'X',0);
    if (Wert>Bestwert) {
      Bestzug = Feld;
      Bestwert = Wert
      }
    Testsymbole[Feld] = ' ';
    if (Wert==1 && Bestwert==1) break
    }
  return Bestzug
  }
function TBestgegenzug(Testsymbole,Spieler,Tiefe) {
  var Feld;
  var Wert;
  var Bestwert = -2;
  if (Tiefe==Staerke+1) return 0;
  if (TZuende(Testsymbole)) return 1;
  for (var Feld = 0; Feld<TFelder; Feld++) {
    if (Testsymbole[Feld]!=' ') continue;
    Testsymbole[Feld] = Spieler;
    Wert = TBestgegenzug(Testsymbole,(Spieler=='X'?'0':'X'),Tiefe+1);
    if (Wert>Bestwert) Bestwert = Wert;
    Testsymbole[Feld] = ' ';
    if (Wert==1 && Bestwert==1) break
    }
  if (Bestwert==-2) Bestwert = 0;
  return -Bestwert
  }
function TZuende(Symbole) {
//var OZahl = (Symbole[8]=='O'?256:0)+(Symbole[7]=='O'?128:0)+(Symbole[6]=='O'?64:0)+(Symbole[5]=='O'?32:0)+(Symbole[4]=='O'?16:0)+(Symbole[3]=='O'?8:0)+(Symbole[2]=='O'?4:0)+(Symbole[1]=='O'?2:0)+(Symbole[0]=='O'?1:0);
//return OZahl|7==OZahl || OZahl|56==OZahl || OZahl|448==OZahl || OZahl|73==OZahl || OZahl|146==OZahl || OZahl|292==OZahl || OZahl|273==OZahl || OZahl|84==OZahl
  return false ||
    Symbole[0]!=' ' && Symbole[0]==Symbole[1] && Symbole[0]==Symbole[2] ||
    Symbole[3]!=' ' && Symbole[3]==Symbole[4] && Symbole[3]==Symbole[5] ||
    Symbole[6]!=' ' && Symbole[6]==Symbole[7] && Symbole[6]==Symbole[8] ||
    Symbole[0]!=' ' && Symbole[0]==Symbole[3] && Symbole[0]==Symbole[6] ||
    Symbole[1]!=' ' && Symbole[1]==Symbole[4] && Symbole[1]==Symbole[7] ||
    Symbole[2]!=' ' && Symbole[2]==Symbole[5] && Symbole[2]==Symbole[8] ||
    Symbole[0]!=' ' && Symbole[0]==Symbole[4] && Symbole[0]==Symbole[8] ||
    Symbole[2]!=' ' && Symbole[2]==Symbole[4] && Symbole[2]==Symbole[6]
  }

// Memory
var MSeite = 6; // bei ausreichend vielen vorhandenen Bildern skalierbar
var MFelder = MSeite*MSeite;
var MKarten = new Array(MFelder);
var MAufgedeckt = new Array(2);
var MOffen = new Array(MFelder);
var MErinnerungen = new Array(MFelder);
var MSpieler;
var MPunkte = new Array(3);
var MVerdeckte;
var MZug;
function MZeichne() {
  document.write('<table align="center" border="5" cellpadding="5" cellspacing="0">');
  for (var Karte = 0; Karte<MFelder; Karte++)
    document.write((Karte%MSeite==0?'<tr bgcolor="#FFFFFF">':'')
      +'<td><a href="javascript:MWaehle('+Karte+')"><img src="spiele/m__.gif" name="m'+Karte+'" border="0" height="48" width="48" /></a></td>'+
      ((Karte+1)%MSeite==0?'</tr>':''));
  document.write('</table>');
  MStarte()
  }
function MZeige(Karte,Zeigen) {
  MOffen[Karte] = Zeigen;
  MVerdeckte += (Zeigen?-1:1);
  with (document) {
    images['m'+Karte].src = 'spiele/m'+
      (Zeigen?Array('du','do','ro','ma','st','nu','fr','wi','ko','sy','bw','bo','ha','dr','pr','ta','au','mu')[MKarten[Karte]]:'__')+'.gif';
    MBrett.Zuege.value = MZug;
    MBrett.Verdeckt.value = MVerdeckte;
    for (var Partei = 1; Partei<=2; Partei++) MBrett['Punkte'+Partei].value = MPunkte[Partei]
  } }
function MStarte() {
  for (var Partei = 1; Partei<=2; Partei++) MPunkte[Partei] = 0;
  MVerdeckte = 0;
  MZug = 0;
  for (var Karte = 0; Karte<MFelder; Karte++) MKarten[Karte] = Math.floor(Karte/2);
  for (var Karte = 0; Karte<MFelder; Karte++) {
    var Bild = MKarten[Karte];
    var Karte2 = Math.floor(Math.random()*(MFelder-Karte)+Karte);
    MKarten[Karte] = MKarten[Karte2];
    MKarten[Karte2] = Bild;
    MErinnerungen[Karte] = -1;
    MZeige(Karte,false)
    }
  for (var Karte = 1; Karte<=2; Karte++) MAufgedeckt[Karte] = -1;
  MSpieler = (Reihenfolge+1)%3;
  if (MSpieler==0) MWaehle(0)
  }
function MZiehe(Karte) {
  if (!MOffen[Karte]) {
    if (MAufgedeckt[2]>=0) {
      if (MKarten[MAufgedeckt[1]]!=MKarten[MAufgedeckt[2]])
        for (var Karte2 = 1; Karte2<=2; Karte2++) MZeige(MAufgedeckt[Karte2],false);
      for (var Karte2 = 1; Karte2<=2; Karte2++) MAufgedeckt[Karte2] = -1
      }
    MAufgedeckt[(MAufgedeckt[1]<0?1:2)] = Karte;
    if (MAufgedeckt[2]>=0 && Laufend=='')
      if (MKarten[MAufgedeckt[1]]==MKarten[MAufgedeckt[2]]) MPunkte[2-(MSpieler==2?Reihenfolge:MSpieler)] += 2
      else if (!MZuende()) MSpieler = 3-Reihenfolge-MSpieler;
    MErinnerungen[Karte] = MKarten[Karte];
    ++MZug;
    MZeige(Karte,true)
  } }
function MFinde() {
  var Karte = MFelder;
  if (MAufgedeckt[2]<0 || Math.random()*3<Staerke+1) {
    // Das folgende Verfahren zum Suchen von Bildpaaren ist relativ langsam.
    // (Die Rechenzeit wächst quadratisch mit der Anzahl von Bildern im Spiel.)
    // Bei einem größeren Spielfeld verhält sich eine sortierte Liste der gesehenen Bilder günstiger.
    for (var Karte1 = 0; Karte1<MFelder; Karte1++)
      if (!MOffen[Karte1] && MErinnerungen[Karte1]>=0)
        for (var Karte2 = 0; Karte2<MFelder; Karte2++)
          if (Karte2!=Karte1 && MErinnerungen[Karte2]==MErinnerungen[Karte1]) Karte = Karte1;
    if (Karte==MFelder) {
      var Karte1 = Math.floor(Math.random()*MFelder);
      for (Karte2 = 0; Karte2<MFelder; Karte2++) {
        if (MErinnerungen[Karte1]<0) Karte = Karte1;
        Karte1 = (Karte1+1)%MFelder
    } } }
  else Karte = MFelder;
  while (Karte==MFelder || MOffen[Karte]) Karte = Math.floor(Math.random()*MFelder);
  MZiehe(Karte)
  }
function MWaehle(Feld) {
  if (MSpieler>0 && !MZuende()) MZiehe(Feld);
  while (MSpieler==0 && !MZuende()) {
    Warte(1000);
    MFinde()
    }
  if (MZuende())
    alert((MPunkte[1]==MPunkte[2])?'Diese Partie ist unentschieden.':(MPunkte[1]>MPunkte[2]?(Reihenfolge==0?'Spieler 1 hat':'Sie haben'):
      (Reihenfolge==0?'Spieler 2 hat':'Der Computer hat'))+' diese Partie gewonnen.')
  }
function MLoese() {
  for (Karte = 0; Karte<MFelder; Karte++) if (!MOffen[Karte]) MZeige(Karte,true)
  }
function MZuende() {
  return MVerdeckte==0
  }
