// 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();
}
}