topical media & game development

talk show tell print

game-javascript-casual-tictac-3D-game.htm / htm



  
  <!-- THREE STEPS TO INSTALL TICTAC 3D:
  
    1.  Copy the coding into the HEAD of your HTML document
    2.  Add the onLoad event handler into the BODY tag
    3.  Put the last coding into the BODY of your HTML document  -->
  
  <!-- STEP ONE: Paste this code into the HEAD of your HTML document  -->
  
  <HEAD>
  
  <SCRIPT LANGUAGE="JavaScript">
  <!-- Original:  Lutz Tautenhahn (lutz.tautenhahn@wirtschaft.tu-chemnitz.de) -->
  <!-- Web Site:  http://www.tu-chemnitz.de/~luta/stroke/online.html -->
  
  <!-- This script and many more are available free online at -->
  <!-- The JavaScript Source!! http://javascript.internet.com -->
  
  <!-- Begin
  var i, j, k, RotAng, XMouseOver, YMouseOver, LastEvent, IsOver=true, IsStart0;
  var Max, NDraw, Start, I_Sel, J_Sel, Start0;
  var NeedBallDown, MoveCount, MaxMoveCount;
  IsPlayer = new Array(2);
  Level = new Array(2);  
  Fld = new Array(4);
  for (i=0; i<4; i++)
    Fld[i] = new Array(4);
  for (i=0; i<4; i++)
  { for (j=0; j<4; j++)
      Fld[i][j] = new Array(4);  
  }
  ScreenFld = new Array(4);
  for (i=0; i<4; i++)
    ScreenFld[i] = new Array(4);
  for (i=0; i<4; i++)
  { for (j=0; j<4; j++)
      ScreenFld[i][j] = new Array(2);  
  }
  FldCount = new Array(4);
  for (i=0; i<4; i++)
    FldCount[i] = new Array(4);
  Value = new Array(4);
  for (i=0; i<4; i++)
    Value[i] = new Array(4);
  History = new Array(64);
  for (i=0; i<64; i++)
    History[i] = new Array(2);
  Pic= new Array(4);
  Pic[0] = new Image(); Pic[0].src = "game-javascript-casual-tictac-3D-tt3d_0.gif";
  Pic[1] = new Image(); Pic[1].src = "game-javascript-casual-tictac-3D-tt3dred.gif";
  Pic[2] = new Image(); Pic[2].src = "game-javascript-casual-tictac-3D-tt3d_1.gif";
  Pic[3] = new Image(); Pic[3].src = "game-javascript-casual-tictac-3D-tt3dblue.gif";
  
  IsStart0=true;
  IsPlayer[0]=true;
  IsPlayer[1]=false;
  Level[0]=2;
  Level[1]=3;
  
  function Init()
  { var ii, jj, kk;
    for (ii=0; ii<4; ii++)
    { for (jj=0; jj<4; jj++)
      { for (kk=0; kk<4; kk++)
          Fld[ii][jj][kk]=0;
        FldCount[ii][jj]=0;
      }
    }
    if (IsStart0) Start0=true;
    else Start0=false;
    LastEvent="";
    NeedBallDown=0;
    I_Sel=-1; J_Sel=-1;
    MoveCount=0;
    MaxMoveCount=0;
    RotAng=0;
    XMouseOver=-1;
    YMouseOver=-1;
    RefreshScreen();
    IsOver=false;
  }
  
  function SetOption(nn, mm)
  { if (nn<2) 
    { if (mm==0)
        IsPlayer[nn]=true;
      else
        IsPlayer[nn]=false;
    }
    else IsStart0=mm; 
  }
  
  function SetLevel(nn, mm)
  { Level[nn]=mm;
  }
  
  function Timer()
  { if (IsOver) return;
    if (NeedBallDown==0)
    { if ((((MoveCount+Start0)%2==1)&&(IsPlayer[0]))||
          (((MoveCount+Start0)%2==0)&&(IsPlayer[1])));
      else
      { if (LastEvent=="") GetBestMove(((MoveCount+1+Start0)%2)*2-1);
        if (LastEvent=="TurnLeft") { TurnLeft(); LastEvent=""; }
        if (LastEvent=="TurnRight") { TurnRight(); LastEvent=""; }
        if (LastEvent=="Back") { Back(); LastEvent=""; }
        if (LastEvent=="Replay") { Replay(); LastEvent=""; }        
      }
    }
    if (NeedBallDown>0)
    { if (Fld[I_Sel][J_Sel][NeedBallDown-1]==0)
      { if (NeedBallDown<4) 
          window.document.images[13*(YMouseOver+3-NeedBallDown)+XMouseOver].src = Pic[2].src;
        if ((MoveCount+Start0)%2==1)
          window.document.images[13*(YMouseOver+4-NeedBallDown)+XMouseOver].src = Pic[1].src;
        else
          window.document.images[13*(YMouseOver+4-NeedBallDown)+XMouseOver].src = Pic[3].src;
      }
      if (NeedBallDown>1)
      { if (Fld[I_Sel][J_Sel][NeedBallDown-2]!=0)
          NeedBallDown=1;
      }
      if (NeedBallDown==1)
      { window.document.OptionsForm.Moves.value=MoveCount+1; 
        MakeMove();
      }
      NeedBallDown--;
    }
  }
  
  function TurnLeft()
  { if (NeedBallDown>0) { LastEvent="TurnLeft"; return; }
    RotAng--;
    if (RotAng<0) RotAng=7;
    RefreshScreen();
  }
  
  function TurnRight()
  { if (NeedBallDown>0) { LastEvent="TurnRight"; return; }
    RotAng++;
    if (RotAng>7) RotAng=0;
    RefreshScreen();
  }
  
  function Back()
  { if (NeedBallDown>0) { LastEvent="Back"; return; }
    if (MoveCount>0)
    { IsOver=false;
      MoveCount--;
      var ii=History[MoveCount][0];
      var jj=History[MoveCount][1];
      var kk=--FldCount[ii][jj];
      Fld[ii][jj][kk]=0;
      window.document.OptionsForm.Moves.value=MoveCount;
      RefreshPic(ii, jj, kk);
    }
  }
  
  function Replay()
  { if (NeedBallDown>0) { LastEvent="Replay"; return; }
    if (MoveCount<MaxMoveCount)
    { I_Sel=History[MoveCount][0];
      J_Sel=History[MoveCount][1];
      window.document.OptionsForm.Moves.value=MoveCount+1;
      MakeMove();      
      RefreshPic(I_Sel, J_Sel, FldCount[I_Sel][J_Sel]-1);
    }
  }
  
  function MakeMove()
  { var ccol, kk;
    ccol=((MoveCount+1+Start0)%2)*2-1;
    kk=FldCount[I_Sel][J_Sel]++;
    Fld[I_Sel][J_Sel][kk]=ccol;
    if (History[MoveCount][0]!=I_Sel)
    { History[MoveCount][0]=I_Sel;
      MaxMoveCount=MoveCount+1;
    }
    if (History[MoveCount][1]!=J_Sel)
    { History[MoveCount][1]=J_Sel;
      MaxMoveCount=MoveCount+1;
    }
    MoveCount++;
    if (MaxMoveCount<MoveCount)
      MaxMoveCount=MoveCount;
    IsOver=IsWinning(I_Sel, J_Sel, kk, ccol);
    if (IsOver)
    { if (ccol<0) alert("Red has won !");
      else alert("Blue has won !");
    }
    else
    { if (MoveCount==64)
      { IsOver=true;
        alert("Draw !");
      }
    }
  }
  
  function GetBestMove(theCol)
  { var ii, jj, kk, zz, vv, vvbest, nn, cc=theCol;
    var iiw,jjw,kkw,wwcount;
    var LLevel=Level[(MoveCount+1+Start0)%2];
    I_Sel=-1; J_Sel=-1;
    for (ii=0; ii<4; ii++)
    { for (jj=0; jj<4; jj++)
      { if ((kk=FldCount[ii][jj])<4)
        { Fld[ii][jj][kk]=cc;
          if (IsWinning(ii, jj, kk, cc))
          { Fld[ii][jj][kk]=0;
            Select(ii, jj);
            return;
          }
          Fld[ii][jj][kk]=0;
        }
      }
    }
    nn=0;
    for (ii=0; ii<4; ii++)
    { for (jj=0; jj<4; jj++)
      { Value[ii][jj]=0;
        if ((kk=FldCount[ii][jj])<4)
        { nn++;
          Fld[ii][jj][kk]=-cc;
          if (IsWinning(ii, jj, kk, -cc))
          { Fld[ii][jj][kk]=0;
            Select(ii, jj);
            return;
          }
          Fld[ii][jj][kk]=0;
        }
      }
    }
    if (LLevel>2)
    { for (ii=0; ii<4; ii++)
      { for (jj=0; jj<4; jj++)
        { if ((kk=FldCount[ii][jj])<4)
          { wwcount=0;
            Fld[ii][jj][kk]=cc;
            if (kk<3)
            { if ((wwcount=CanWin(ii,jj,kk+1,cc))==2)
              { Fld[ii][jj][kk]=0;
                Select(ii, jj);
                return;
              }
            }
            if (wwcount>=0)
            { for (iiw=0; iiw<4; iiw++)     
              { for (jjw=0; jjw<4; jjw++)
                { if ((kkw=FldCount[iiw][jjw])<4)
                  { if (!((ii==iiw)&&(jj==jjw)))
                    { Fld[iiw][jjw][kkw]=cc;
                      if (IsWinning(iiw, jjw, kkw, cc))
                        wwcount++;
                      Fld[iiw][jjw][kkw]=0;
                      if (wwcount>1)
                      { Fld[ii][jj][kk]=0;
                        Select(ii, jj);
                        return;
                      }
                    }
                  }
                }
              }
            }
            Fld[ii][jj][kk]=0;
          }
        }
      }
    }
    if (LLevel>3)
    { for (ii=0; ii<4; ii++)
      { for (jj=0; jj<4; jj++)
        { if ((kk=FldCount[ii][jj])<4)
          { vv=0;
            Fld[ii][jj][kk]=cc;
            if (kk<3)
            { Fld[ii][jj][kk+1]=-cc;
              if (IsWinning(ii, jj, kk+1, -cc))
                vv=-1;
              Fld[ii][jj][kk+1]=0;
            }
            if (vv==0)
            { Fld[ii][jj][kk]=-cc;
              if(kk<3)
              { Fld[ii][jj][kk+1]=cc;
                if (IsWinning(ii, jj, kk+1, cc))
                  Value[ii][jj]=-200;
                Fld[ii][jj][kk+1]=0;
              }
              for (iiw=0; iiw<4; iiw++)     
              { for (jjw=0; jjw<4; jjw++)
                { if ((kkw=FldCount[iiw][jjw])<4)
                  { if (!((ii==iiw)&&(jj==jjw)))
                    { if ((vv=CanWin(iiw,jjw,kkw,-cc))==2)
                      { Fld[ii][jj][kk]=0;
                        Select(ii, jj);
                        return;
                      }
                      if (vv==-1)
                      Value[ii][jj]=-100;
                    }
                  }
                }
              }
              Fld[ii][jj][kk]=cc;
              if (kk<3)
              { Fld[ii][jj][kk+1]=-cc;
                for (iiw=0; iiw<4; iiw++)     
                { for (jjw=0; jjw<4; jjw++)
                  { if ((kkw=FldCount[iiw][jjw])<4)
                    { if (!((ii==iiw)&&(jj==jjw)))
                      { if (CanWin(iiw,jjw,kkw,-cc)==2)
                          Value[ii][jj]=-5000;
                      }
                    }
                  }
                }
                Fld[ii][jj][kk+1]=0;
              }
            }
            Fld[ii][jj][kk]=0;
          }
        }
      }
    }
    if (nn==0)
    { IsOver=true; return; }
    zz=0;  
    nn=0;
    for (ii=0; ii<4; ii++)
    { for (jj=0; jj<4; jj++)
      { if ((kk=FldCount[ii][jj])<4)
        { Fld[ii][jj][kk]=cc;
          if (kk<3)
          { Fld[ii][jj][kk+1]=-cc;
            if (IsWinning(ii, jj, kk+1, -cc))
            { vv=-8100; 
              Fld[ii][jj][kk+1]=0;
            }
            else
            { Fld[ii][jj][kk+1]=0;
              vv=GetValue(ii, jj, kk, cc);
            }
          } 
          else
            vv=GetValue(ii, jj, kk, cc);
          if (LLevel<2) vv%=200;
          if (LLevel<3) vv+=Math.floor(Math.random()*108);
          if (LLevel==3) vv+=Math.floor(Math.random()*27);
          Value[ii][jj]+=vv;
          if (zz==0) vvbest=Value[ii][jj];
          zz++;
          if (Value[ii][jj]==vvbest)
            nn++;
          if (Value[ii][jj]>vvbest)
          { nn=1;
            vvbest=Value[ii][jj];
          }
          Fld[ii][jj][kk]=0;
        }
      }
    }
    zz=Math.floor(Math.random()*nn);
    nn=-1;
    for (ii=0; ii<4; ii++)
    { for (jj=0; jj<4; jj++)
      { if ((kk=FldCount[ii][jj])<4)
        { if (vvbest==Value[ii][jj])
          { nn++;
            if (nn==zz)
            { Select(ii, jj);
              return;
            }
          }
        }
      }
    }
  }
  
  function CanWin(ii, jj, kk, cc)
  { var kkl, kkk=kk-1;
    var vv=0;
    do
    { kkk++;
      Fld[ii][jj][kkk]=-cc;
      if ((IsWinning(ii, jj, kkk, -cc)))
      { for (kkl=kk; kkl<=kkk; kkl++)
          Fld[ii][jj][kkl]=0;
        if (kkk==kk) return(-1);
        else return(vv);
      }
      Fld[ii][jj][kkk]=cc;
      if ((IsWinning(ii, jj, kkk, cc))&&(kkk<3))
      { if (kkk==kk) vv++;
        Fld[ii][jj][kkk]=-cc;
        Fld[ii][jj][kkk+1]=cc;
        if ((IsWinning(ii, jj, kkk+1, cc)))
        { for (kkl=kk; kkl<=kkk+1; kkl++)
            Fld[ii][jj][kkl]=0;
          return(2);
        }
        Fld[ii][jj][kkk+1]=0;
      }
      Fld[ii][jj][kkk]=-cc;
    }
    while (kkk<3);
    for (kkl=kk; kkl<=kkk; kkl++)
      Fld[ii][jj][kkl]=0;
    return(vv);
  }
  
  function GetValue(ii, jj, kk, ccol)
  { var ll, cc, ccount1, ccount2, vval=0;
    var dd1, dd2, ddv, ddd, ddr;
    if (MoveCount%2==0)
    { dd1=1;
      dd2=1;
      ddv=(3-kk)*2;
      ddd=4; ddr=4;
      if (kk==2)
      { ddd=8; ddr=8; }
    }
    else
    { dd1=1;
      dd2=1;
      ddv=(3-kk)*(3-kk)+1;
      ddd=4; ddr=4;
      if (kk==2)
      { ddd=8; ddr=8; }
    }
    var ss1=0;
    var ss2=0;
    var ww1count=3*dd1;
    var ww1=0;
    var ww2count=2*dd2;
    var ww2=0;
    ccount1=0;
    ccount2=0;
    for (ll=0; ll<4; ll++)
    { if ((cc=Fld[ll][jj][kk])==ccol) ccount1+=dd1;
      if (cc==-ccol) ccount2+=dd2;
    }
    if ((ccount1>dd1)&&(ccount2>0));
    else
    { vval+=(ccount1+1)*(ccount2+1)*ddv;
      ss1+=ccount1-dd1; ss2+=ccount2;
      if (ccount1>=ww1count) ww1++;
      if (ccount2>=ww2count) ww2++;
    }
    ccount1=0;
    ccount2=0;
    for (ll=0; ll<4; ll++)
    { if ((cc=Fld[ii][ll][kk])==ccol) ccount1+=dd1;
      if (cc==-ccol) ccount2+=dd2;
    }
    if ((ccount1>dd1)&&(ccount2>0));
    else
    { vval+=(ccount1+1)*(ccount2+1)*ddv;
      ss1+=ccount1-dd1; ss2+=ccount2;
      if (ccount1>=ww1count) ww1++;
      if (ccount2>=ww2count) ww2++;
    }
    ccount1=0;
    ccount2=0;
    for (ll=0; ll<=kk; ll++)
    { if ((cc=Fld[ii][jj][ll])==ccol) ccount1+=dd1;
      if (cc==-ccol) ccount2+=dd2;
    }
    if ((ccount1>dd1)&&(ccount2>0));
    else
    { vval+=(ccount1+1)*(ccount2+1)*ddv;
      ss1+=ccount1-dd1; ss2+=ccount2;
      if (ccount1>=ww1count) ww1++;
      if (ccount2>=ww2count) ww2++;
    }
    if (jj==kk)
    { ccount1=0;
      ccount2=0;
      for (ll=0; ll<4; ll++)
      { if ((cc=Fld[ii][ll][ll])==ccol) ccount1+=dd1;
        if (cc==-ccol) ccount2+=dd2;
      }
      if ((ccount1>dd1)&&(ccount2>0));
      else
      { vval+=(ccount1+1)*(ccount2+1)*ddd;
        ss1+=ccount1-dd1; ss2+=ccount2;
        if (ccount1>=ww1count) ww1++;
        if (ccount2>=ww2count) ww2++;
      }
    }
    if ((3-jj)==kk)
    { ccount1=0;
      ccount2=0;
      for (ll=0; ll<4; ll++)
      { if ((cc=Fld[ii][3-ll][ll])==ccol) ccount1+=dd1;
        if (cc==-ccol) ccount2+=dd2;
      }
      if ((ccount1>dd1)&&(ccount2>0));
      else
      { vval+=(ccount1+1)*(ccount2+1)*ddd;
        ss1+=ccount1-dd1; ss2+=ccount2;
        if (ccount1>=ww1count) ww1++;
        if (ccount2>=ww2count) ww2++;
      }
    }
    if (ii==kk)
    { ccount1=0;
      ccount2=0;
      for (ll=0; ll<4; ll++)
      { if ((cc=Fld[ll][jj][ll])==ccol) ccount1+=dd1;
        if (cc==-ccol) ccount2+=dd2;
      }
      if ((ccount1>dd1)&&(ccount2>0));
      else
      { vval+=(ccount1+1)*(ccount2+1)*ddd;
        ss1+=ccount1-dd1; ss2+=ccount2;
        if (ccount1>=ww1count) ww1++;
        if (ccount2>=ww2count) ww2++;
      }
    }
    if ((3-ii)==kk)
    { ccount1=0;
      ccount2=0;
      for (ll=0; ll<4; ll++)
      { if ((cc=Fld[3-ll][jj][ll])==ccol) ccount1+=dd1;
        if (cc==-ccol) ccount2+=dd2;
      }
      if ((ccount1>dd1)&&(ccount2>0));
      else
      { vval+=(ccount1+1)*(ccount2+1)*ddd;
        ss1+=ccount1-dd1; ss2+=ccount2;
        if (ccount1>=ww1count) ww1++;
        if (ccount2>=ww2count) ww2++;
      }
    }
    if (jj==ii)
    { ccount1=0;
      ccount2=0;
      for (ll=0; ll<4; ll++)
      { if ((cc=Fld[ll][ll][kk])==ccol) ccount1+=dd1;
        if (cc==-ccol) ccount2+=dd2;
      }
      if ((ccount1>dd1)&&(ccount2>0));
      else
      { vval+=(ccount1+1)*(ccount2+1)*ddd;
        ss1+=ccount1-dd1; ss2+=ccount2;
        if (ccount1>=ww1count) ww1++;
        if (ccount2>=ww2count) ww2++;
      }
    }                          
    if ((3-jj)==ii)
    { ccount1=0;
      ccount2=0;
      for (ll=0; ll<4; ll++)
      { if ((cc=Fld[ll][3-ll][kk])==ccol) ccount1+=dd1;
        if (cc==-ccol) ccount2+=dd2;
      }
      if ((ccount1>dd1)&&(ccount2>0));
      else
      { vval+=(ccount1+1)*(ccount2+1)*ddd;
        ss1+=ccount1-dd1; ss2+=ccount2;
        if (ccount1>=ww1count) ww1++;
        if (ccount2>=ww2count) ww2++;
      }
    }                        
    if ((ii==jj)&&(jj==kk))
    { ccount1=0;
      ccount2=0;
      for (ll=0; ll<4; ll++)
      { if ((cc=Fld[ll][ll][ll])==ccol) ccount1+=dd1;
        if (cc==-ccol) ccount2+=dd2;
      }
      if ((ccount1>dd1)&&(ccount2>0));
      else
      { vval+=(ccount1+1)*(ccount2+1)*ddr;
        ss1+=ccount1-dd1; ss2+=ccount2;
        if (ccount1>=ww1count) ww1++;
        if (ccount2>=ww2count) ww2++;
      }
    }
    if ((ii==kk)&&((3-jj)==kk))
    { ccount1=0;
      ccount2=0;
      for (ll=0; ll<4; ll++)
      { if ((cc=Fld[ll][3-ll][ll])==ccol) ccount1+=dd1;
        if (cc==-ccol) ccount2+=dd2;
      }
      if ((ccount1>dd1)&&(ccount2>0));
      else
      { vval+=(ccount1+1)*(ccount2+1)*ddr;
        ss1+=ccount1-dd1; ss2+=ccount2;
        if (ccount1>=ww1count) ww1++;
        if (ccount2>=ww2count) ww2++;
      } 
    }
    if ((ii==jj)&&(jj==(3-kk)))
    { ccount1=0;
      ccount2=0;
      for (ll=0; ll<4; ll++)
      { if ((cc=Fld[ll][ll][3-ll])==ccol) ccount1+=dd1;
        if (cc==-ccol) ccount2+=dd2;
      }
      if ((ccount1>dd1)&&(ccount2>0));
      else
      { vval+=(ccount1+1)*(ccount2+1)*ddr;
        ss1+=ccount1-dd1; ss2+=ccount2;
        if (ccount1>=ww1count) ww1++;
        if (ccount2>=ww2count) ww2++;
      }
    }
    if (((3-ii)==kk)&&(jj==kk))
    { ccount1=0;
      ccount2=0;
      for (ll=0; ll<4; ll++)
      { if ((cc=Fld[3-ll][ll][ll])==ccol) ccount1+=dd1;
        if (cc==-ccol) ccount2+=dd2;
      }
      if ((ccount1>dd1)&&(ccount2>0));
      else
      { vval+=(ccount1+1)*(ccount2+1)*ddr;
        ss1+=ccount1-dd1; ss2+=ccount2;
        if (ccount1>=ww1count) ww1++;
        if (ccount2>=ww2count) ww2++;
      }
    } 
    if (ww1>1) vval+=ww1*4000;
    if (ss1>3*dd1) vval+=(ss1-3*dd1)*20;
    if ((ww2>=1)&&(ss2>2*dd2)) vval+=(ss2-2*dd2)*(kk+1)*50;
    if (ww2>1) vval+=ww2*500;
    return(vval);
  }
  
  function IsWinning(ii, jj, kk, ccol)
  { var ll, ccount;
    ccount=0;
    for (ll=0; ll<4; ll++)
    { if (Fld[ll][jj][kk]==ccol) ccount++;
    }
    if (ccount==4) return(true);
    ccount=0;
    for (ll=0; ll<4; ll++)
    { if (Fld[ii][ll][kk]==ccol) ccount++;
    }
    if (ccount==4) return(true);
    ccount=0;
    for (ll=0; ll<=kk; ll++)
    { if (Fld[ii][jj][ll]==ccol) ccount++;
    }
    if (ccount==4) return(true);
    if (jj==kk)
    { ccount=0;
      for (ll=0; ll<4; ll++)
      { if (Fld[ii][ll][ll]==ccol) ccount++;
      }
      if (ccount==4) return(true);
    }
    if ((3-jj)==kk)
    { ccount=0;
      for (ll=0; ll<4; ll++)
      { if (Fld[ii][3-ll][ll]==ccol) ccount++;
      }
      if (ccount==4) return(true);
    }
    if (ii==kk)
    { ccount=0;
      for (ll=0; ll<4; ll++)
      { if (Fld[ll][jj][ll]==ccol) ccount++;
      }
      if (ccount==4) return(true);
    }
    if ((3-ii)==kk)
    { ccount=0;
      for (ll=0; ll<4; ll++)
      { if (Fld[3-ll][jj][ll]==ccol) ccount++;
      }
      if (ccount==4) return(true);
    }
    if (jj==ii)
    { ccount=0;
      for (ll=0; ll<4; ll++)
      { if (Fld[ll][ll][kk]==ccol) ccount++;
      }
      if (ccount==4) return(true);
    }
    if ((3-jj)==ii)
    { ccount=0;
      for (ll=0; ll<4; ll++)
      { if (Fld[ll][3-ll][kk]==ccol) ccount++;
      }
      if (ccount==4) return(true);
    }
    if ((ii==jj)&&(jj==kk))
    { ccount=0;
      for (ll=0; ll<4; ll++)
      { if (Fld[ll][ll][ll]==ccol) ccount++;
      }
      if (ccount==4) return(true);
    }
    if ((ii==kk)&&((3-jj)==kk))
    { ccount=0;
      for (ll=0; ll<4; ll++)
      { if (Fld[ll][3-ll][ll]==ccol) ccount++;
      }
      if (ccount==4) return(true);
    }
    if ((ii==jj)&&(jj==(3-kk)))
    { ccount=0;
      for (ll=0; ll<4; ll++)
      { if (Fld[ll][ll][3-ll]==ccol) ccount++;
      }
      if (ccount==4) return(true);
    }
    if (((3-ii)==kk)&&(jj==kk))
    { ccount=0;
      for (ll=0; ll<4; ll++)
      { if (Fld[3-ll][ll][ll]==ccol) ccount++;
      }
      if (ccount==4) return(true);
    }
    return(false);
  }
  
  function Select(ii, jj)
  { I_Sel=ii;
    J_Sel=jj;
    XMouseOver=ScreenFld[ii][jj][0];
    YMouseOver=ScreenFld[ii][jj][1];
    NeedBallDown=4;
  }
  
  function Clicked(xx, yy)
  { if (IsOver) return;
    if (NeedBallDown>0) return;
    MouseOut();
    MouseOver(xx, yy);
    if (XMouseOver>=0)
      NeedBallDown=4;
    window.document.OptionsForm.Moves.focus();
    window.document.OptionsForm.Moves.blur();
  }  
  
  function MouseOver(xx, yy)
  { if (IsOver) return;
    if (XMouseOver>=0) return;
    if ((((MoveCount+Start0)%2==1)&&(IsPlayer[0]))||
        (((MoveCount+Start0)%2==0)&&(IsPlayer[1])))
    { if (NeedBallDown==0)
      { for (ii=0; ii<4; ii++)
        { for (jj=0; jj<4; jj++)
          { if ((ScreenFld[ii][jj][0]==xx)&&(ScreenFld[ii][jj][1]==yy))
            { if (Fld[ii][jj][3]==0)
              { if ((MoveCount+Start0)%2==1)
                  window.document.images[13*yy+xx].src = Pic[1].src;
                else
                  window.document.images[13*yy+xx].src = Pic[3].src;
                XMouseOver=xx;
                YMouseOver=yy;
                I_Sel=ii;
                J_Sel=jj;
              }
            }
          }
        }
      }
    }
  }
  
  function MouseOut()
  { if (IsOver) return;
    if (XMouseOver>=0)
    { if (NeedBallDown==0)
      { for (ii=0; ii<4; ii++)
        { for (jj=0; jj<4; jj++)
          { if ((ScreenFld[ii][jj][0]==XMouseOver)&&(ScreenFld[ii][jj][1]==YMouseOver))
              window.document.images[13*YMouseOver+XMouseOver].src = Pic[2+Fld[ii][jj][3]].src;
          }
        }
        XMouseOver=-1;
      }
    }
  }  
  
  function RefreshPic(ii, jj, kk)
  { var xx=ScreenFld[ii][jj][0];
    var yy=ScreenFld[ii][jj][1];
    window.document.images[13*(yy+3-kk)+xx].src = Pic[2+Fld[ii][jj][kk]].src;
  }
  
  function RefreshScreen()
  { var ii, jj, kk, xx, yy;
    for (ii=0; ii<13; ii++)
    { for (jj=0; jj<13; jj++)
        window.document.images[13*ii+jj].src = Pic[0].src;
    }
    for (ii=0; ii<4; ii++)
    { for (jj=0; jj<4; jj++)
      { if (RotAng==0) { xx=3*ii+jj; yy=9-2*jj+ii; }
        if (RotAng==1) { xx=3*ii+3-jj; yy=9-2*jj+3-ii; }
        if (RotAng==2) { xx=3*(3-jj)+ii; yy=9-2*ii+(3-jj); }
        if (RotAng==3) { xx=3*(3-jj)+3-ii; yy=9-2*ii+3-(3-jj); }
        if (RotAng==4) { xx=3*(3-ii)+(3-jj); yy=9-2*(3-jj)+(3-ii); }
        if (RotAng==5) { xx=3*(3-ii)+3-(3-jj); yy=9-2*(3-jj)+3-(3-ii); }
        if (RotAng==6) { xx=3*jj+(3-ii); yy=9-2*(3-ii)+jj; }
        if (RotAng==7) { xx=3*jj+3-(3-ii); yy=9-2*(3-ii)+3-jj; }
        ScreenFld[ii][jj][0]=xx;
        ScreenFld[ii][jj][1]=yy-3;     
        for (kk=0; kk<4; kk++)
          window.document.images[13*(yy-kk)+xx].src = Pic[2+Fld[ii][jj][kk]].src;
      }
    }
    window.document.OptionsForm.Moves.value=MoveCount;
  }
  
  function Resize()
  { if(navigator.appName == "Netscape") history.go(0);
  }
  //  End -->
  </script>
  
  </HEAD>
  
  <!-- STEP TWO: Insert the onLoad event handler into your BODY tag  -->
  
  <BODY onResize="javascript:Resize()">
  
  <!-- STEP THREE: Copy this code into the BODY of your HTML document  -->
  
  <DIV ALIGN=center>
  <table noborder cellpadding=10 cellspacing=0 width=650 heigth=390>
  <tr height=100%>
    <td width=60%>
      <table border cellpadding=10 cellspacing=0 bgcolor=#FFFFCC width=100%><tr><td>
        <table noborder cellpadding=0 cellspacing=0><tr><td>
        <script language="JavaScript">
        document.open("text/plain");
        for (j=0; j < 13; j++)
        { for (i=0; i < 13; i++)
            document.write("<a href=\"javascript:Clicked("+i+","+j+")\" onMouseOver=\"MouseOver("+i+","+j+")\" onMouseOut=\"MouseOut()\"><IMG src=\"game-javascript-casual-tictac-3D-tt3d_0.gif\" border=0></a>");
          document.writeln("<BR>");
        }
        document.close();
        </script>
        </td></tr></table>
      </td></tr></table>
    </td>
    <td width=40%><form name="OptionsForm">
        <table noborder cellpadding=0 cellspacing=0 width=100%>
        <tr><td> </td></tr>
        <tr><td>
          <table border cellpadding=2 cellspacing=0 width=100%>
          <tr><td><input type=radio name="Red" checked value="Red: Player" onClick="javascript:SetOption(0,0)"> Red: Player</td></tr>
          <tr><td><input type=radio name="Red" value="Red: Computer" onClick="javascript:SetOption(0,1)"> Red: Computer</td></tr>
          <tr><td> Level: 
                  <input type=radio name="RedLevel" value="1" onClick="javascript:SetLevel(0,1)">1
                  <input type=radio name="RedLevel" checked value="2" onClick="javascript:SetLevel(0,2)">2
                  <input type=radio name="RedLevel" value="3" onClick="javascript:SetLevel(0,3)">3
                  <input type=radio name="RedLevel" value="4" onClick="javascript:SetLevel(0,4)">4
          </td></tr>
          </table>      
        </td></tr>
        <tr><td> </td></tr>
        <tr><td>
          <table border cellpadding=2 cellspacing=0 width=100%>
          <tr><td><input type=radio name="Blue" value="Blue: Player" onClick="javascript:SetOption(1,0)"> Blue: Player</td></tr>
          <tr><td><input type=radio name="Blue" checked value="Blue: Computer" onClick="javascript:SetOption(1,1)"> Blue: Computer</td></tr>
          <tr><td> Level: 
                  <input type=radio name="BlueLevel" value="1" onClick="javascript:SetLevel(1,1)">1
                  <input type=radio name="BlueLevel" value="2" onClick="javascript:SetLevel(1,2)">2
                  <input type=radio name="BlueLevel" checked value="3" onClick="javascript:SetLevel(1,3)">3
                  <input type=radio name="BlueLevel" value="4" onClick="javascript:SetLevel(1,4)">4
          </td></tr>
          </table>
        </td></tr>
        <tr><td> </td></tr>
        <tr><td>
          <table border cellpadding=2 cellspacing=0 width=100%>
          <tr><td width=50%><input type=radio name="Start" checked value="Red" onClick="javascript:SetOption(2,1)"> Red begins</td>
          <td><input type=radio name="Start" value="Blue" onClick="javascript:SetOption(2,0)"> Blue begins</td></tr>
          </table>
        </td></tr>
        <tr><td> </td></tr>
        <tr><td>
          <table border cellpadding=2 cellspacing=0 width=100%><tr>
          <td width=30% align=center><input type=button value="<-" width=60 style="width:60" onClick="javascript:TurnLeft()"></td>
          <td width=40% align=center><input type=button value="NEW" width=80 style="width:80" onClick="javascript:Init()"></td>
          <td width=30% align=center><input type=button value="->" width=60 style="width:60" onClick="javascript:TurnRight()"></td>
          </tr></table>
        </td></tr>
        <tr><td> </td></tr>
        <tr><td>
          <table border cellpadding=2 cellspacing=0 width=100%><tr>
          <td width=40% align=center><input type=button value="<<" width=80 style="width:80" onClick="javascript:Back()"></td>
          <td width=20% align=center><input size=3 name="Moves"></td>
          <td width=40% align=center><input type=button value=">>" width=80 style="width:80" onClick="javascript:Replay()"></td>
          </tr></table>
        </td></tr>
        </table>
    </form></td>
  </tr>
  </table>
  </DIV>
  <script language="JavaScript">
  Init();
  setInterval("Timer()",400);
  </script>
  
  <p><center>
  <font face="arial, helvetica" size"-2">Free JavaScripts provided<br>
  by <a href="http://javascriptsource.com">The JavaScript Source</a></font>
  </center><p>
  
  <!-- Script Size:  26.44 KB -->
  


(C) Æliens 20/2/2008

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.