return to first page linux journal archive
keywordscontents
// 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(); }

}


Back to article