Basically, I have been set an assignment but I am really out of my depth. Pretty much kind of struggling to learn all the languages I am learning atm (C, C++, java, javascript, css, html) and keep up with all of them. Java is my main downfall really, I have been going through tutorials and bits of pieces of the web but really struggling to get my head around it.

I am not expecting someone to use their time to write me a bunch of code, but need a real pointer in the right direction or some kind of decent tutorials that relate to the framework code I am supplied with.

The code is below compiles and shows a basic ball running across a screen (like it would in pong)

Code:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.awt.image.*;
import java.awt.Color;
/*
 * Note If you change S (Speed) collision detection will be
 *      more complex as the ball edge may be within the bat
 *      Ignores concurrency issues (x, y, x_inc, y_inc access)
 */

class Main
{
  public static void main( String args[] ) // 
  {                                        // 
    System.out.println("Application");
    Application app = new Application();
    app.setVisible(true);
    app.run();
  }                                        // 
}

class Application extends JFrame            // So graphical 
{
  private static final int H = 600;         // Height of window 
  private static final int W = 800;         // Width  of window 

  public Application()
  {
    setSize( W, H );                        // Size of application 
    addKeyListener( new Transaction() );    // Called when key press 
    setDefaultCloseOperation(EXIT_ON_CLOSE);
  }


  public void update( Graphics g )          // Called by repaint 
  {                                         // 
    drawPicture( (Graphics2D) g );          // Draw Picture 
  }

  public void paint( Graphics g )           // When 'Window' is first 
  {                                         //  shown or damaged 
    drawPicture( (Graphics2D) g );          // Draw Picture 
  }

  private Dimension     theAD;              // Alternate Dimension 
  private BufferedImage theAI;              // Alternate Image 
  private Graphics2D    theAG;              // Alternate Graphics 

  public void drawPicture( Graphics2D g )   // Double buffer 
  {                                         //  allow re-size 
    Dimension d    = getSize();             // Size of curr. image 

    if (  ( theAG == null )  ||
          ( d.width  != theAD.width ) ||
          ( d.height != theAD.height ) )
    {                                       // New size 
      theAD = d;
      theAI = (BufferedImage) createImage( d.width, d.height );
      theAG = theAI.createGraphics();
      AffineTransform at = new AffineTransform();
      at.setToIdentity();
      at.scale( ((double)d.width)/W, ((double)d.height)/H );
      theAG.transform(at);
    }

    drawActualPicture( theAG );             // Draw Actual Picture 
    g.drawImage( theAI, 0, 0, this );       //  Display on screen 
  }

  // The ball position and how to increment to next position 

  private int x = W/2, x_inc = 1;
  private int y = H/2, y_inc = 1;

  // Called on key press  

  class Transaction implements KeyListener  // When character typed 
  {
    public void keyPressed(KeyEvent e)      // Obey this method 
    {
     // Key typed includes specials 
     switch ( e.getKeyCode() )              // Character is 
     {
       case KeyEvent.VK_LEFT:               // Left Arrow 
         x_inc = -1;
         break;
       case KeyEvent.VK_RIGHT:              // Right arrow 
         x_inc = 1;
         break;
       case KeyEvent.VK_UP:                 // Up arrow 
         y_inc = -1;
         break;
       case KeyEvent.VK_DOWN:               // Down arrow 
         y_inc = 1;
         break;
      }
      // x,y could send to a server instead of calling  
      repaint();                            // Call update method 
    }

    public void keyReleased(KeyEvent e)
    {
      // Called on key release including specials 
    }

    public void keyTyped(KeyEvent e)
    {
      // Normal key typed 
      char c = e.getKeyChar();              // Typed 
      repaint();                            // Redraw screen 
    }
  }

  private static final int B = 6;           // Border offset 
  private static final int M = 26;          // Menu offset 
  private static final int BALL_SIZE = 10;  // Ball diameter 
  private static final int HALF_BALL_SIZE = BALL_SIZE/2;

  // Code called to draw the current state of the game 

  public void drawActualPicture( Graphics2D g )
  {
    // White background 

    g.setPaint( Color.white );
    g.fill( new Rectangle2D.Double( 0, 0, W, H ) );

    Font font = new Font("Calibri",Font.BOLD,24); 
    g.setFont( font ); 

    // Blue playing border 

    g.setPaint( Color.blue );              // Paint Colour 
    g.draw( new Rectangle2D.Double( B, M, W-B*2, H-M-B ) );

    // Display state of game 

    g.setPaint( Color.blue );
    FontMetrics fm = getFontMetrics( font );
    String fmt  = "Bouncing Ball x=%4d y = %4d";
    String text = String.format( fmt, x, y );
    g.drawString( text, W/2-fm.stringWidth(text)/2, M*2 );

    // The ball at the current x, y position (width, height) 

    g.setPaint( Color.red );
    g.fill( new Ellipse2D.Double( x-HALF_BALL_SIZE, y-HALF_BALL_SIZE, 
                                  BALL_SIZE,     BALL_SIZE ) );
  }
    

  // Main program loop 

  public void run()
  {
    final int S = 1;                    // Speed 1 - 5 
    try
    {
      while ( true )
      {
        if ( x >= W-B-HALF_BALL_SIZE ) x_inc = -1*S;
        if ( x <= 0+B+HALF_BALL_SIZE ) x_inc = 1*S;
        if ( y >= H-B-HALF_BALL_SIZE ) y_inc = -1*S;
        if ( y <= 0+M+HALF_BALL_SIZE ) y_inc = 1*S;
  
        x += x_inc;
        y += y_inc;
  
        repaint();                      // Now display 

        Thread.sleep( 10 );             // 100 Hz 
      }
    } catch ( Exception e ) {};
  }

}
The minimum objectives I would like to achieve are
- Insert 2 paddles that can be moved using W/S and UP/DOWN which the ball collides with
- Insert a score for both players at top of screen rather than current text
- Change the background image to something over than a basic colour.

Thankyou for any replies.


In the meantime I will work on my C program in arduino to take random numbers and display them in binary