// class JavaSlot, written by Paul Buchheit, ptb@po.cwru.edu
import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Event;
// This is a half baked implementation of a Java Slot machine,
// problems and prospective fixes are in the accompanying
// Linux Journal Article.
public class JavaSlot extends Applet implements Runnable
{
   Image strip, body;   // The slot machine wheel and body
   int wheelPosX = 22, wheelPosY = 22; // The positon of the wheel
   int wheelSize = 55;  // The size of the wheel
   int nstripItems = 5; // How many items are on the wheel
   int stripLen = nstripItems * wheelSize;
   int currentWheelPos; // speaks for itself
   // about how far (in items) should the wheel spin before stopping
   int itemsToSpin;
   int delay;     // The delay between wheel movements
   // max and min wheel movement during a single step of the wheel
   double maxSpeed = 20, minSpeed = 2;
   Thread spinning = null;
   public void init() {
      // Grabs the images from the server
      strip = getImage(getCodeBase(), "strip.gif");
      body = getImage(getCodeBase(), "tux-body.gif");
      // Reads values from the HTML file
      delay = readIntParam("delay", 10);
      itemsToSpin = readIntParam("itemsToSpin", 20);
      // sets the inital wheel position
      currentWheelPos = getNewItem() * wheelSize;
   }
   // Reads in the integer parameter "name" from the HTML, returns
   // defalutVal if a value is not specified
   int readIntParam(String name, int defaultVal) {
      String s = getParameter(name);
      if(s == null) {
         return(defaultVal);
      } else {
         return(Integer.valueOf(s).intValue());
      }
   }
   // Randomly chooses a new item on wheel
   int getNewItem() {
      return((int)(Math.random() * nstripItems) % nstripItems);
   }
   // Calculates the next wheel position based on the current
   // position and the desired final position.
   // Not magic, meant to make the wheel slow down as is reaches its
   // destination.
   int findNextPos(int currentP, int finalP) {
      double speed = Math.cos(Math.PI / 2 *
        (double)currentP / (double)finalP);
      speed *= maxSpeed - minSpeed;
      speed += minSpeed;
      currentP += Math.round(speed);
      return(Math.min(currentP, finalP)); // Makes sure we don't go over
   }
   // Gets called when the spinning thread is started, spins the wheel
   public void run() {
      int nextItem = getNewItem();  // gets something to spin to
      int pos = currentWheelPos;
      int finalPos = (itemsToSpin + nextItem) * wheelSize;
      while((spinning != null) && (pos != finalPos)) {
         pos = findNextPos(pos, finalPos);
         currentWheelPos = pos % stripLen;
         repaint();
         try {
            Thread.sleep(delay);
         } catch(InterruptedException e) { }
      }
      spinning = null;
   }
   // This gets called when the mouse button is clicked inside
   // the applet, if the wheel is already spinning it will
   // ignore the click, otherwise it will start up a thread
   // that spins the wheel
   public boolean mouseDown(Event e, int x, int y) {
      if(spinning == null) {
         spinning = new Thread(this);
         spinning.start();
      }
      return(true);
   }
   // Draws the wheel turned to position "pos" using a Graphics
   // clipped for the wheel
   void drawWheel(Graphics g, int pos) {
      g.drawImage(strip, 0, -pos, this);
      // loops back if we are running off the end of the strip.
      if(pos > stripLen - wheelSize)
         g.drawImage(strip, 0, stripLen - pos, this);
   }
   // creates a new Graphics for drawing the wheel
   Graphics createForWheel(Graphics bodyG) {
      return bodyG.create(wheelPosX, wheelPosY, wheelSize, wheelSize);
   }
   // Draws the whole slot machine
   public void paint(Graphics g) {
      g.drawImage(body, 0, 0, this);
      Graphics clipG = createForWheel(g);
      drawWheel(clipG, currentWheelPos);
      clipG.dispose();
   }
}
  
  
  
  
  
  
  
  
  
    Copyright © 1994 - 2018 Linux Journal.  All rights reserved.