Java змейка. Как ускорять змейку в зависимости от съеденного

Делаю свою первую игру, пока максимально простая, но всё же.

Пытаюсь привязать к счёту (кол-во съеденых домиков) и каждые 10 домиков чуть увеличивать скорость змейки, но либо скорость не меняется, либо змея за доли секунды улетает за поле. Мой код ниже, как можно увеличить скорость змейки в зависимости от кол-ва съеденного?

public class GameField extends JPanel implements ActionListener{
private final int SIZE = 496;
private final int DOT_SIZE = 16;
private final int ALL_DOTS = 961;

private Image body;
private Image home;
private Image headr;
private Image headl;
private Image headu;
private Image headd;

private int homeX;
private int homeY;
private int dots;

private final int[] x = new int[ALL_DOTS];
private final int[] y = new int[ALL_DOTS];

private Timer timer;


private boolean left = false;
private boolean right = true;
private boolean up = false;
private boolean down = false;
private boolean inGame = true;
private boolean esc = false;


private int score = 0;



public GameField() {
setBackground(Color.white);
loadImages();
initGame();
addKeyListener(new FieldKeyListener());
setFocusable(true);


}


public void initGame() {

dots = 3;
for (int i = 0; i < dots; i++) {
    x[i] = 48 - i * DOT_SIZE;
    y[i] = 48;
}
int delay = 250;
timer = new Timer(delay, this);
timer.start();
createHome();
}


private void createHome() {
homeX = new Random().nextInt(32)*DOT_SIZE;
homeY = new Random().nextInt(32)*DOT_SIZE;
}

public void loadImages() {
ImageIcon iia = new ImageIcon("C:\\Users\\Lebed\\Desktop\\Snake_V2.0\\images\\SnakeHome.jpg");
home = iia.getImage();

ImageIcon iid = new ImageIcon("C:\\Users\\Lebed\\Desktop\\Snake_V2.0\\images\\SnakeBody.jpg");
body = iid.getImage();

ImageIcon iihr = new ImageIcon("C:\\Users\\Lebed\\Desktop\\Snake_V2.0\\images\\GOLOVAR.png");
headr = iihr.getImage();

ImageIcon iihl = new ImageIcon("C:\\Users\\Lebed\\Desktop\\Snake_V2.0\\images\\GOLOVAL.png");
headl = iihl.getImage();

ImageIcon iihu = new ImageIcon("C:\\Users\\Lebed\\Desktop\\Snake_V2.0\\images\\GOLOVAU.png");
headu = iihu.getImage();

ImageIcon iihd = new ImageIcon("C:\\Users\\Lebed\\Desktop\\Snake_V2.0\\images\\GOLOVAD.png");
headd = iihd.getImage();
}

@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
doDrawing(g);
}
private void doDrawing(Graphics g) {
if(inGame) {
    g.fillRect(0, 0, 512, 512);
}

if (inGame) {
    String str = "Счёт: " + score;
    Font f = new Font("ITALIC", Font.BOLD, 15);
    g.setColor(Color.BLACK);
    g.setFont(f);
    g.drawString(str, 8, 528);

}

if(inGame) {

    g.drawImage(home,homeX,homeY,this);

    for (int i = 0; i < dots; i++) {
        if (x[i] == homeX && y[i] == homeY && i == 0) {
            score += 1; //считает скорость
        }
        if (i == 0 && right) {
            g.drawImage(headr, x[i], y[i], this);
        } else {
            if (i == 0 && left) {
                g.drawImage(headl, x[i], y[i], this);
            } else {
                if (i == 0 && up) {
                    g.drawImage(headu, x[i], y[i], this);
                } else {
                    if (i == 0 && down) {
                        g.drawImage(headd, x[i], y[i], this);
                    } else {
                        g.drawImage(body, x[i], y[i], this);

                    }
                }
            }
        }
    }
} else {
    g.fillRect(0, 0, 512, 512);
    
    String str = "Game over!!!"; //press F1 for new game
    Font f = new Font("ITALIC", Font.BOLD, 40);
    g.setColor(Color.WHITE);
    g.setFont(f);
    g.drawString(str, 120, SIZE/2);

    String str2 = "press F1 for new game";
    Font f2 = new Font("ITALIC", Font.BOLD, 20);
    g.setColor(Color.GREEN);
    g.setFont(f2);
    g.drawString(str2, 135, 300);
}
if(esc) {
    String str = "PAUSE";
    Font f = new Font("ITALIC", Font.BOLD, 40);
    g.setColor(Color.WHITE);
    g.setFont(f);
    g.drawString(str, 170, SIZE/2);
    timer.stop();
}
}

public void move() {
for (int i = dots; i > 0; i--) {
    x[i] = x[i-1];
    y[i] = y[i-1];
}
if(left) {
    x[0] -= DOT_SIZE;
}
if(right) {
    x[0] += DOT_SIZE;
} if(up) {
    y[0] -= DOT_SIZE;
} if(down) {
    y[0] += DOT_SIZE;
}
}

public void checkHome(){
if(x[0] == homeX && y[0] == homeY) {
    dots++;
    createHome();
}
}


public void checkCollisions(){
for (int i = dots; i > 0 ; i--) {
    if (i > 4 && x[0] == x[i] && y[0] == y[i]) {
        inGame = false;
        break;
    }
}

if(x[0] > SIZE) {
    inGame = false;
}
if(x[0] < 0) {
    inGame = false;
}
if(y[0] > SIZE) {
    inGame = false;
}
if(y[0] < 0) {
    inGame = false;
}
}

@Override
public void actionPerformed(ActionEvent e) {
if(inGame) {
    checkHome();
    checkCollisions();
    move();


}
repaint();
}
public void closeRunningWindow(KeyEvent e) {
JComponent comp = (JComponent) e.getSource();
Window win = SwingUtilities.getWindowAncestor(comp);
win.dispose();
}

public void startAgain() {
EventQueue.invokeLater(() -> {
    MainWindow mw = new MainWindow();
});
}
class FieldKeyListener extends KeyAdapter {
@Override
public void keyPressed( KeyEvent e ) {
    super.keyPressed(e);

    int key = e.getKeyCode();

    if (key == KeyEvent.VK_LEFT && ! right) {
        left = true;
        up = false;
        down = false;
    }
    if (key == KeyEvent.VK_RIGHT && ! left) {
        right = true;
        up = false;
        down = false;
    }
    if (key == KeyEvent.VK_UP && ! down) {
        up = true;
        right = false;
        left = false;
    }
    if (key == KeyEvent.VK_DOWN && ! up) {
        down = true;
        right = false;
        left = false;
    }
    if ((!esc) && (key == KeyEvent.VK_ESCAPE)) {
        esc = true;

    } else {
        if(esc && key == KeyEvent.VK_ESCAPE) {
            timer.restart();
            esc = false;
        }
    }
    if (key == KeyEvent.VK_F1) {
        closeRunningWindow(e);
        startAgain();
    }
}
}

Ответы (0 шт):