import java.awt.Graphics;
import java.awt.Color;
import java.awt.Font;
import java.awt.Event;
import java.applet.AudioClip;

public class StenSaxPase extends java.applet.Applet
{
 AudioClip resetLjud;
 Font      defFont  = new Font("Sans-Serif", Font.PLAIN,     11);
 Font      boldFont = new Font("Sans-Serif", Font.BOLD,      11);
 Font      bigFont  = new Font("Sans-Serif", Font.BOLD,      18);
 String[]  SSP      = {"Sten", "Sax", "Påse", ""};
 String[]  vinnare  = {"Lika", "Datorn", "Du"};
 String    Namn     = "Du";
 boolean   ljudPa       = true;
 boolean   validNy      = true;
 byte[]    dinaForr     = {3, 3, 3, 3, 3, 3};
 byte[]    datornsForr  = {3, 3, 3, 3, 3, 3};
 byte      DinaPoang    = 0;
 byte      DatornsPoang = 0;
 byte      dennaVinnare = 0;
 byte      dittVal      = 3;
 byte      datornsVal   = 3;
 int       vinstNummer  = 10;
 int       vinstBalans  = 0;


 public void init()
 {
  String sResetLjud;
  String sVinstNummer;
  showStatus("Appleten initieras...");
  Namn = getParameter("Namn");
  if(Namn != null)
  {
   vinnare[2] = Namn;
   Namn      += "s";
  }
  else
  {Namn = "Dina";}

  sVinstNummer = getParameter("Vinst");
  if(sVinstNummer != null)
  {vinstNummer = Integer.parseInt(sVinstNummer);}

  sResetLjud = getParameter("Ljud");
  if(sResetLjud == null)
  {ljudPa = false;}
  else
  {resetLjud  = getAudioClip(getDocumentBase(), sResetLjud);}
 }

//--------------------------------------------- mouseUp() ----------//

 public boolean mouseUp(Event evt, int x, int y)
 {
  if((DatornsPoang != 0 || DinaPoang != 0)&& ljudPa)
  {
   resetLjud.play();
   dinaForr[0]    = 3;
   datornsForr[0] = 3;
  }
  DatornsPoang = 0;
  DinaPoang    = 0;
  datornsVal   = 3;
  dittVal      = 3;
  dennaVinnare = 0;
  repaint();
  return true;
 }

//----------------------------------------------- ny() ----------//

 public void ny(double dDittVal)
 {
  validNy = true;
  byte tidigareIRad = 0;
  showStatus("Vänta...");
  datornsVal = (byte)(Math.random() * 3);

 // Detta här under är hur datorn räknar fram sitt val

  for(byte i = 0; i < 3; i++)
  {
   for(byte j = 0; j < dinaForr.length - 1; j++)
   {
    if((dinaForr[j] == dinaForr[j + 1])&&(dinaForr[j] == i))
    {tidigareIRad += 1;}
   }
   if(tidigareIRad > 1)
   {
    if(Math.random() < tidigareIRad / dinaForr.length - 3)
    {
     if(i == 0)
     {datornsVal = 2;}
     else
     {datornsVal = (byte)(i - 1);}
    }
    break;
   }
  }  // Dessa kollade om användaren valt samma flera gånger i rad

  if(dennaVinnare == 0 && datornsForr[0] == datornsVal
     && Math.random() < 0.75)
  {
   datornsVal = (byte)(Math.random() * 3);
  } // Om lika förra gången

  if((dinaForr[2] == 0 && dinaForr[1] == 1 && dinaForr[0] == 2)
   ||(dinaForr[2] == 1 && dinaForr[1] == 2 && dinaForr[0] == 0)
   ||(dinaForr[2] == 2 && dinaForr[1] == 0 && dinaForr[0] == 1)
   && Math.random() < 0.5)
  {
   datornsVal = dinaForr[0];
     //
  } // Om användaren trycker knapparna i ordningen uppifrån nedåt

  if((dinaForr[2] == 2 && dinaForr[1] == 1 && dinaForr[0] == 0)
   ||(dinaForr[2] == 0 && dinaForr[1] == 2 && dinaForr[0] == 1)
   ||(dinaForr[2] == 1 && dinaForr[1] == 0 && dinaForr[0] == 2)
   && Math.random() < 0.5)
  {
   if(dinaForr[0] == 2)
   {datornsVal = 1;}
   else
   {datornsVal = (byte)(dinaForr[0] + 2);}
     //
  } // Om användaren trycker knapparna i ordningen nedifrån uppåt

 // Dessa var hur datorn väljer

  if(datornsVal >= 3)
  {datornsVal = 0;}
  if(datornsVal < 0)
  {datornsVal = 2;}

  if((dDittVal % 1 == 0)&&(dDittVal >= 0)&&(dDittVal <= 2))
  {dittVal = (byte)dDittVal;}
  else
  {validNy = false;}

  if(validNy)
  {
   dennaVinnare = vemVann(dittVal, datornsVal);

   if(dennaVinnare == 1)
   {DatornsPoang += 1;}
   if(dennaVinnare == 2)
   {DinaPoang    += 1;}

   for(byte k = 0; k < dinaForr.length - 1; k++)
   {
    dinaForr[k + 1]    = dinaForr[k];
    datornsForr[k + 1] = datornsForr[k];
   }
   dinaForr[0] = dittVal;

   repaint();
  }
  else
  {
   showStatus("Ogiltigt argument för Ny()");
  }
 }


 public byte vemVann(byte du, byte datorn)
 {
  byte returnByte = 0;
  if(du == datorn)
  {returnByte = 0;}
  if(du == 0 && datorn == 2)
  {returnByte = 1;}
  if(du == 1 && datorn == 0)
  {returnByte = 1;}
  if(du == 2 && datorn == 1)
  {returnByte = 1;}
  if(du == 2 && datorn == 0)
  {returnByte = 2;}
  if(du == 0 && datorn == 1)
  {returnByte = 2;}
  if(du == 1 && datorn == 2)
  {returnByte = 2;}
  return returnByte;
 }

//---------------------------------------------- paint() -----------//

 public void paint(Graphics g)
 {
  g.setFont(defFont);
  g.setColor(Color.lightGray);
  g.fillRect(0, 0, size().width, size().height);

  g.setColor(Color.black);
  g.drawString("Datorns poäng: "  + DatornsPoang,          3, 20);
  g.drawString(Namn + " poäng: "  + DinaPoang,             3, 40);
  g.drawString("Senaste vinnare: "+ vinnare[dennaVinnare], 3, 60);

  g.setColor(Color.white);
  g.fillRect( 3, 67, 50, 20);
  g.fillRect(58, 67, 50, 20);
  g.setColor(Color.black);
  g.drawRect( 3, 67, 50, 20);
  g.drawRect(58, 67, 50, 20);

  g.drawString(SSP[dittVal],     7, 82);
  g.drawString(SSP[datornsVal], 62, 82);

  if(DinaPoang >= vinstNummer)
  {
   DinaPoang    = 0;
   DatornsPoang = 0;
   g.setFont(bigFont);
   g.setColor(Color.blue);
   g.drawString(vinnare[2] + " vann!", 8, 33);
   vinstBalans += 1;
  }
  if(DatornsPoang >= vinstNummer)
  {
   DinaPoang    = 0;
   DatornsPoang = 0;
   g.setFont(bigFont);
   g.setColor(Color.darkGray);
   g.drawString("Datorn vann!", 8, 33);
   vinstBalans -= 1;
  }

  if(size().width < 125 || size().height < 90)
  {
   showStatus("Fönstret ska helst vara minst 125 x 90 px!");
   g.setColor(Color.red);
  }
  else
  {
   showStatus("Denna applet är skriven av Daniel Ramsköld.");
   g.setColor(Color.black);
  }
  g.drawRect(0, 0, size().width - 1, size().height - 1);
 }

 public double balans()
 {
  return (double)(vinstBalans);
 }

 public String getAppletInfo()
 {
  return "Titel: Sten Sax PÅse \nSkriven av: Daniel Ramsköld, 2000 \nKompilerad med JDK 1.1.8";
 }

 public String[][] getParameterInfo()
 {
  String[][] returnArray =
  {{"Namn",  "Namn", "Spelarens namn", "Du"},
   {"Vinst", "Nummer", "Poäng för vinst", "10"},
   {"Ljud",  "URL till .AU-fil", "Ljud som spelas vid omstart i pågående omgång", "Inget ljud"}};
  return returnArray;
 }

 public void stop()
 {
  if(ljudPa)
  {resetLjud.stop();}
 }

}