import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class billiards extends Applet implements Runnable{
Thread th = null;
Image os;
Graphics og;
int bd[][][] = {{{11,12,13,14,15},{7,8,9,10,-1},{4,5,6,-1,-1},{2,3,-1,-1,-1},{1,-1,-1,-1,-1}},
{{0,0,0,0,0},{0,0,0,0,-1},{0,0,0,-1,-1},{0,0,-1,-1,-1},{0,-1,-1,-1,-1}}};
int td[][][] = new int[2][5][5];
double r3 = 1.7321;
int bn = 2,hn,pf,tf,af,sp;
int px,py,mx,my;
public void init(){
os = createImage(690,320);
og = os.getGraphics();
d_set();
addMouseListener(
new MouseAdapter(){
public void mousePressed(MouseEvent e){
if(e.getX() < 330){
tf = 0;
}else if(e.getX() > 360){
tf = 1;
}
if(tf == 0){
py = (e.getY()-30) / (int)(30*r3);
px = (e.getX()-30*py-30) / 60;
}else{
py = (e.getY()-30) / (int)(30*r3);
px = (e.getX()-30*py-360) / 60;
}
if((px >= 0)&&(px < 5)&&(py >= 0)&&(py < 5)){
if(pf == 0){
if((td[tf][py][px] != -1)&&(td[tf][py][px] != 0)){
hn = td[tf][py][px];
td[tf][py][px] = 0;
pf = 1;
}
}else{
if(td[tf][py][px] == 0){
td[tf][py][px] = hn;
pf = 0;
}else if(td[tf][py][px] != -1){
sp = td[tf][py][px];
td[tf][py][px] = hn;
hn = sp;
}
}
}
if((pf == 0)&&(Math.abs(e.getX()-345) < 15)&&(Math.abs(e.getY()-200) < 150)){
bn ++;
if(bn > 5)bn = 2;
d_set();
}
repaint();
}
}
);
addMouseMotionListener(
new MouseMotionAdapter(){
public void mouseMoved(MouseEvent e){
mx = e.getX()-30;
my = e.getY()-30;
repaint();
}
}
);
}
public void paint(Graphics g){
og.setColor(Color.white);
og.fillRect(0,0,690,320);
og.setColor(Color.gray);
for(int dx = 0;dx < 5;dx ++){
for(int dy = 5-bn;dy < 5;dy ++){
if(td[0][dy][dx] != -1){
og.drawOval(60*dx+30*dy+31,(int)(30*r3*dy)+30,58,58);
}
if(td[1][dy][dx] != -1){
og.drawOval(60*dx+30*dy+361,(int)(30*r3*dy)+30,58,58);
}
}
}
for(int dx = 0;dx < 5;dx ++){
for(int dy = 5-bn;dy < 5;dy ++){
if(td[0][dy][dx] != -1){
if(td[0][dy][dx] != 0)ball(td[0][dy][dx],60*dx+30*dy+30,(int)(30*r3*dy)+30);
}
if(td[1][dy][dx] != -1){
if(td[1][dy][dx] != 0)ball(td[1][dy][dx],60*dx+30*dy+360,(int)(30*r3*dy)+30);
}
}
}
og.setColor(Color.blue);
for(int dl = 0;dl < bn;dl ++)og.fill3DRect(330,220-25*dl,30,20,true);
og.setColor(Color.black);
og.setFont(new Font("",Font.BOLD,14));
og.drawString("retray",321,262);
og.drawString("or",335,275);
og.drawString("level change",300,288);
af = 1;
for(int dx = 0;dx < 5;dx ++){
for(int dy = 5-bn;dy < 5;dy ++){
og.setColor(Color.red);
if(dy == 5-bn){
if(td[1][dy][dx] == 0)af = 0;
}else{
if((td[1][dy][dx] != 0)&&(td[1][dy][dx] != -1)){
if(td[1][dy][dx] != Math.abs(td[1][dy-1][dx]-td[1][dy-1][dx+1])){
og.fill3DRect(60*dx+30*dy+380,(int)(30*r3*dy)+57,20,5,true);
af = 0;
}
}
if(td[1][dy][dx] == 0)af = 0;
}
}
}
og.setFont(new Font("",Font.BOLD,36));
if(af == 1)og.drawString("clear!!",285,210);
if(pf == 1)ball(hn,mx,my);
g.drawImage(os,0,0,this);
}
public void d_set(){
for(int dx = 0;dx < 5;dx ++){
for(int dy = 0;dy < 5;dy ++){
for(int dz = 0;dz < 2;dz ++){
if(dy > 4-bn){
td[dz][dy][dx] = bd[dz][dy][dx];
}else{
td[dz][dy][dx] = -1;
}
}
}
}
}
public void ball(int in,int bx,int by){
switch (in){
case 1 : og.setColor(new Color(255,255,0)) ; break ;
case 2 : og.setColor(new Color(0,0,255)) ; break ;
case 3 : og.setColor(new Color(255,0,0)) ; break ;
case 4 : og.setColor(new Color(0,0,128)) ; break ;
case 5 : og.setColor(new Color(255,69,0)) ; break ;
case 6 : og.setColor(new Color(0,128,0)) ; break ;
case 7 : og.setColor(new Color(176,0,0)) ; break ;
case 8 : og.setColor(new Color(0,0,0)) ; break ;
case 9 : og.setColor(new Color(255,255,0)) ; break ;
case 10 : og.setColor(new Color(0,0,255)) ; break ;
case 11 : og.setColor(new Color(255,0,0)) ; break ;
case 12 : og.setColor(new Color(0,0,128)) ; break ;
case 13 : og.setColor(new Color(255,69,0)) ; break ;
case 14 : og.setColor(new Color(0,128,0)) ; break ;
case 15 : og.setColor(new Color(176,0,0)) ; break ;
}
og.fillOval(bx,by,60,60);
if(in > 8){
og.setColor(Color.white);
og.fillOval(bx+5,by,50,45);
}
og.setFont(new Font("",Font.BOLD,18));
og.setColor(Color.white) ;
og.fillOval(bx+15,by+5,30,30);
og.setColor(Color.black) ;
og.drawOval(bx+15,by+5,30,30);
og.drawString(""+in,bx+24-in/10*6,by+26);
}
public void start(){
if(th == null){
th = new Thread(this);
th.start();
}
}
public void stop(){
th = null;
}
public void run(){
while(th != null){
try{
Thread.sleep(100);
}
catch (InterruptedException e){
}
}
}
public void update( Graphics g ){
paint( g ) ;
}
}
