/*COMPUTER SCIENCE PROGRAM ASSIGNMENTS

COL Warr
        	   :
*/
import java.io.*;
import java.awt.*;
import java.util.*;
import static java.lang.System.*;
import static java.lang.Math.*;
import java.awt.event.*;								
public class Slam 
{
public static void main(String args[]) 
	{
	    new Slammer(); //invokes class Slammer
	}
}
class Slammer extends Frame implements KeyListener
{
	int ballX = 40,ballY=12,
	    score1 = 0, score2 =0,
	    speedX = 1, speedY = 2,
	    paddle1Y = 10, paddle2Y = 10,
	    paddle1X = 3,paddle2X = 78;
	boolean gameNotOver = true;    
    String spaces = "                                                                              ";
	public Slammer()
	   {	    	
	    addKeyListener(this); 
	    setVisible(true);     
	    speedX = (int)(Math.random() * 7 - 3);
	    speedY = 0;//(int)(Math.random() * 3 - 1);
		while (gameNotOver == true)
		    {
        	    if (speedX ==0)
            	    speedX = (int)(Math.random() * 3 - 1);
                upDate();
		    	drawScreen(ballX,ballY,paddle1Y,paddle2Y);
 		        pause(100);
		    }    	
    }
public void drawScreen(int bx, int by, int p1, int p2)
{
	  String spaces = "                                                                                       ";
      int drawn = 0;
	  for (int y = 0;y <24;y++)
	  {
	  	   drawn = 0;
	  	   if (y == p1-1 ||y == p1 ||y == p1+1)
	  	       {
	  	   	      out.print("  X");
	  	   	      drawn =1;
	  	   	   }  
           if (y == by)   	  	   	   
               {
	  	   	       if (drawn == 0)
	  	   	          {
	  	   	              out.print("\r" + spaces.substring(0,bx) + "*");
	  	   	              drawn =2;
	  	   	          }    
	  	   	       else    
	  	   	          {
	  	   	             out.print("\r  X" + spaces.substring(0,bx-3) + "*");
	  	   	             drawn = 3;
	  	   	          }   
	  	   	    }         
	  	   if (y == p2-1 ||y == p2 ||y == p2+1)
               { 
	  	   	       if (drawn == 0)
	  	   	          {
	  	                  out.print("\r                                                                             X");
	  	              }

	  	   	       if (drawn == 1)
	  	   	          {
	  	   	              out.print("\r  X" + spaces.substring(0,74)+"X");
	  	              }
                   if (drawn == 2)
	  	   	          {
	  	   	             out.print("\r" + spaces.substring(0,bx) + "*");
	  	   	             out.print( spaces.substring(0,76- bx)+"X");
                      }
                   if (drawn == 3)
	  	   	          {
	  	   	             out.print("\r  X" + spaces.substring(0,bx-3) + "*");
	  	   	             out.print( spaces.substring(0,76- bx)+"X");
                      }
	  	       }           
	  	   out.println();	   
	  } 
	  out.println("           " + score1 + "                                                     " + score2);
}
public void upDate()
{
		        ballX += speedX;
		        ballY += speedY;
		        if (ballX > 79)
		           {
		               score1 ++;
		               if (score1 >= 6)
		                   gameNotOver = false;
		               ballX = 40;
		               speedX = 1;
		               out.print((char)7);
		           }    
		        if ( ballX <1)
		           {
		               score2++;
		               if (score2 >= 6)
		                   gameNotOver = false;
		               ballX = 40;
		               speedX = -1;
		               out.print((char)7);
		           }    
		        if (ballX >74) 
		            {
			           if (ballY == paddle2Y)    
			            {
			                 speedX *= -1;
			                 speedX *= 2;
			            }     
			           if (ballY == paddle2Y-1)    
			            {
			                 speedX *= -1;
			                 speedY --;
			            }     
			           if (ballY == paddle2Y +1)    
			            {
			                 speedX *= -1;
			                 speedY ++;
			            }     
                     }		            
		        if (ballX <4) 
		            {
			           if (ballY == paddle1Y)    
			            {
			                 speedX *= -1;
			                 speedX *= 2;
			            }     
			           if (ballY == paddle1Y-1)    
			            {
			                 speedX *= -1;
			                 speedY --;
			            }     
			           if (ballY == paddle1Y +1)    
			            {
			                 speedX *= -1;
			                 speedY ++;
			            }     
                     }		            
		        if (ballY > 23 || ballY <1)
		            speedY *= -1;    
}	    
public void keyReleased(KeyEvent e)
{
}
public void keyTyped(KeyEvent e)
{
}
public void keyPressed(KeyEvent e)
{
    setTitle(""+ KeyEvent.getKeyText(e.getKeyCode()));  
    switch(e.getKeyCode())
       {
       	  case KeyEvent.VK_DOWN :paddle2Y += 1;
       	                        break; // control paddle
       	  case KeyEvent.VK_UP :paddle2Y -=1;
       	                        break; // control ball
       	  case KeyEvent.VK_S :paddle1Y -=1;
       	                        break; // control ball
       	  case KeyEvent.VK_X :paddle1Y += 1;
       	                        break; // control ball bug[0]
       	  case KeyEvent.VK_ESCAPE :gameNotOver = false;
       	                        break;
      	  
       }

}


//  Provided by Matt Nicki the Great
//  MILLISECONDS for all computers.
public static void pause (long r)
{
	Date d = new Date();
	long mil = d.getTime();
	long save = mil;
	while(mil < save + r)
		{
			d = new Date();
			mil = d.getTime();
		}
}
public static void clearScreen(int t)
{
    for (int x = 0; x< t;x++)
        System.out.println();	
	
}	
}