Creando Snake usando Java

Decidí volver a crear Snake usando Java, pero estoy un poco atascado. En este momento, tengo un cuadrado que el usuario puede mover por la pantalla con las teclas de flecha. Cuando presiona IZQUIERDA una vez, el cuadrado comienza a moverse hacia la izquierda usando un temporizador. No es necesario mantener presionada la tecla o seguir presionándola; cambia de dirección cuando presiona cualquiera de las otras teclas que están configuradas (derecha, arriba, abajo). Mi objetivo es usar un ArrayList para mantener los cuadrados que forman la serpiente. En este momento, he creado una ArrayList con solo un objeto Snake dentro, si agrego un segundo objeto Snake a la lista y lo agrego al marco (con el primero), solo un objeto Snake es visible y las teclas para mover no funciona Estoy buscando algunas ideas sobre cómo puedo progresar con este proyecto; por favor, no me dé la respuesta completa, porque me gustaría resolver la mayoría por mi cuenta; Sólo necesito una dirección. Gracias de antemano - el código está abajo.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Snake extends JPanel implements KeyListener, ActionListener
{
int x = 0, y = 0, velx = 0, vely = 0;
Timer t = new Timer(250, this);


public Snake(int num1, int num2)
{
    t.start();
    addKeyListener(this);
    setFocusable(true);
    setFocusTraversalKeysEnabled(true);
    x = num1;
    y = num2;
}
public void paintComponent(Graphics g)
{   
    super.paintComponent(g);

    g.setColor(Color.blue);
    g.fillRect(x, y, 20, 20);
}
public void actionPerformed(ActionEvent e)
{
    repaint();
    x += velx;
    y += vely;
}
public void up()
{
    vely = -20;
    velx = 0;
}
public void down()
{
    vely = 20;
    velx = 0;
}
public void left()
{
    vely = 0;
    velx = -20;
}
public void right()
{
    vely = 0;
    velx = 20;
}
public void keyPressed(KeyEvent e)
{
    int code = e.getKeyCode();

    if(code == KeyEvent.VK_UP)
        up();
    else if(code == KeyEvent.VK_DOWN)
        down();
    else if(code == KeyEvent.VK_RIGHT)
        right();
    else if(code == KeyEvent.VK_LEFT)
        left();

}
public void keyReleased(KeyEvent e)
{

}
public void keyTyped(KeyEvent e)
{

}
}
//Driver Class
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.util.*;

public class UserClass
{
private static JFrame frame = new JFrame("Snake");
private static ArrayList<Snake> mySnake = new ArrayList<Snake>();

public static void main(String[] args)
{
    frame.setSize(500,500);
    frame.setBackground(Color.black);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    mySnake.add(new Snake(20,20));
    frame.add(mySnake.get(0));
}
}

P.S Cuando coloco este mismo código exacto en Eclipse en mi Mac, el fondo de mi marco es negro, pero en Windows es gris claro ... ¿Alguien sabe por qué? Gracias.

Respuestas a la pregunta(3)

Su respuesta a la pregunta