Plinko

(:nl:)<< Compare People | OtherProjectsTrailIndex | Ant Hill >>

If you are not familiar with the game, here is a link to the game show (Skip to minute 4:00 if you're in a hurry)

Disk.java

import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;
import java.awt.Color;
public class Disk
{
     private int size;
     private int vSize;
     private int diam;
     private int numCol;
     private int numRow;
     private int col;
     private int row;
<:vspace>
    /**
     * Constructor for objects of class Disk
     */
<:vspace>
    public Disk(int aNumCol, int aNumRow, int s, int c)
    {
        this(aNumCol, aNumRow, s);
        col=c;
    }
    public Disk(int aNumCol, int aNumRow, int s)
    {
      numCol = aNumCol;
      numRow = aNumRow;
      diam=(int)(.5*s);
      size=s;
      vSize=(int)(s*Math.sin(Math.PI/3.0));
      col=(int)(Math.random()*numCol);
      row=0;
    }
<:vspace>
    public void draw(Graphics2D g2)
   {
     g2.setColor(Color.BLUE );
     int hOffset=size/4;
     if (row%2==1) hOffset*=3;
     int vOffset=vSize/6;
     Ellipse2D.Double o=new Ellipse2D.Double(hOffset+col*size ,vOffset+row*vSize,diam,diam);
     g2.fill(o);
    }
   public void fall()
   {
       if (row<numRow-1) {
           row++;
           if (Math.random()>.5)
           {
              //move right
<:vspace>
               int max=numCol-1;
               if (row%2==1){
                 if(col>=max)
                  col--;
                } else{
                  col++;
                  if (col>=max)
                  col=max;
                }
           } else{
               //move left
               col--;
               if (row%2==0)
                  col++;
               if (col<0)
                col=0;
           }
        }
    }
    public int getRow(){return row;}
    public int getCol(){return col;}
}
<:vspace>

Board.java

import java.awt.Graphics2D;
import java.awt.Polygon;
<:vspace>
import java.awt.Color;
/**
   This class displays a checkerboard with squares,
   alternating between white and black.
*/
public class Board
{
<:vspace>
   private int numCol;
   private int numRow;
   private int size;   
/**
      Creates a Plinko Board object with a given number of rows and columns.
      @param aNumSquares the number of squares in each row
      @param aSize the size of each square
   */
   public Board(int aNumCol, int aNumRow, int aSize)
   {
      numCol = aNumCol;
      numRow = aNumRow;
      size = aSize;
   }
<:vspace>
   /**
      Method used to draw the Plinko board.
      @param g2 the graphics content
   */
   public void draw(Graphics2D g2)
   {
<:vspace>
       g2.setColor(new Color( 220,220,220 ) );
     int offset=0;
     for (int i = 0; i < numCol; i++)
      {
         int j=0;
<:vspace>
         while (j<numRow)
         {
            if (j % 2 == 0){ 
               offset=0;
            } else {
               offset=size/2;
            }
            if ( i<numCol-1 || j%2==0){  //triange pointing down 
               Polygon t = new Polygon();
               int y=(int)(j*size*Math.sin(Math.PI/3.0));
               t.addPoint(offset+i * size, y);
               t.addPoint(offset+(i+1)*size,y);
               t.addPoint(offset+i*size+size/2, y+(int)(size*Math.sin(Math.PI/3.0)) ); 
               g2.fill(t);
            }
            j++;
         }
      }
      //Draw sides
      g2.setColor(Color.ORANGE);
      for (int j=0; j < numRow/2; j++){
          Polygon t=new Polygon();
          int vSize=(int)(2*size*Math.sin(Math.PI/3.0));
          t.addPoint(0,j*vSize);
          t.addPoint(size/2,vSize/2+j*vSize );
          t.addPoint(0,vSize+j*vSize);
          Polygon t2=new Polygon();
          t2.addPoint(size*numCol,j*vSize);
          t2.addPoint(size*numCol-size/2,vSize/2+j*vSize );
          t2.addPoint(size*numCol,vSize+j*vSize);
          g2.fill(t);
          g2.fill(t2);
        }
   }
<:vspace>
}

PlinkClick.java

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.Rectangle;
public class PlinkClick extends JApplet implements MouseListener
{
   int c=5;
   final int NCOLS = 9;
   final int NROWS = 13;
   final String[] prize ={"$100","$500","$1,000","0","$10,000","0","$1,000","$500","$100"};
   public void init()
   {
       addMouseListener(this);
    }
    /**
     * Paint method for applet.
     * 
     * @param  g   the Graphics object for this applet
     */
    public void paint(Graphics g)
    {
      Graphics2D g2 = (Graphics2D) g;
       g2.setColor(Color.WHITE);
       Rectangle bg=new Rectangle(0,0,getWidth(),getHeight());
       g2.fill(bg);
<:vspace>
      int size = Math.min(getWidth(), getHeight()) / NCOLS;
      Board pb = new Board(NCOLS,NROWS, size);
      Disk d = new Disk(NCOLS, NROWS, size, c);
<:vspace>
      pb.draw(g2);
      d.draw(g2);
      for (int i=0;i<13;i++){
          d.fall();
          d.draw(g2);
        }
      g2.drawString( prize[ d.getCol() ], d.getCol()*size, getHeight()-15 );
    }
   /**
    * Implementation of the MouseListener
    */
   public void   mouseClicked(MouseEvent e) {}
   public void   mouseEntered(MouseEvent e) {}
   public void   mouseExited(MouseEvent e) {}
   public void   mousePressed(MouseEvent e) {}
   public void   mouseReleased(MouseEvent e) {
       int x=e.getX();
       c=(int)(x/(getWidth()/NCOLS));
       repaint();
    }
}
<:vspace>

BoardComponent.java

import javax.swing.JComponent;
import java.awt.Graphics;
import java.awt.Graphics2D;
<:vspace>
public class BoardComponent extends JComponent
{
   public void paintComponent(Graphics g)
   {
      Graphics2D g2 = (Graphics2D) g;
<:vspace>
      final int NCOLS = 9;
      final int NROWS = 13;
      final String[] prize ={"$100","$500","$1,000","0","$10,000","0","$1,000","$500","$100"};
      int size = Math.min(getWidth(), getHeight()) / NCOLS;
      Board pb = new Board(NCOLS,NROWS, size);
      Disk d = new Disk(NCOLS, NROWS, size);
<:vspace>
      pb.draw(g2);
      d.draw(g2);
      for (int i=0;i<13;i++){
          d.fall();
          d.draw(g2);
        }
      g2.drawString( prize[ d.getCol() ], d.getCol()*size, getHeight()-15 );
   }
}

BoardViewer.java

import javax.swing.JFrame;
<:vspace>
/**
   This program displays a checkerboard.
*/
public class BoardViewer
{
   public static void main(String[] args)
   {
      JFrame frame = new JFrame();
<:vspace>
      final int FRAME_WIDTH = 360;
      final int FRAME_HEIGHT = 500;
<:vspace>
      frame.setSize(FRAME_WIDTH, FRAME_HEIGHT);
      frame.setTitle("Plinko Board Viewer");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
<:vspace>
      BoardComponent component = new BoardComponent();
      frame.add(component);
<:vspace>
      frame.setVisible(true);
   }
}
(:nl:)