java - 为什么执行这段代码时蛇没有出现?

标签 java swing arraylist graphics indexoutofboundsexception

在我将 Rectangle2D 对象放入 ArrayList 之前,程序运行良好,只是每当我改变方向时,蛇只会旋转而不是弯曲。现在蛇甚至没有出现,我的控制台给了我错误,由 Mad Programmer 提供:

Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException:
Index: 0, Size: 0
    at java.util.ArrayList.rangeCheck(ArrayList.java:638)
    at java.util.ArrayList.get(ArrayList.java:414)
    at javaapplication968.JavaApplication968$Display.actionPerformed(JavaApplication968.java:110) 

我知道该问题与 ArrayLists 有关,但如何修复它?

这是我的类(class):

public class Display extends JPanel implements ActionListener, KeyListener {
Timer t = new Timer(1, this);
double xCoord = 50;
double yCoord = 50;
double xvel = 0;
double yvel = .01;
double ranx, xtemp;
double rany, ytemp;
int eaten = 0;
ArrayList<Rectangle2D> rects = new ArrayList<Rectangle2D>();
ArrayList<Double> xloc = new ArrayList<Double>();
ArrayList<Double> yloc = new ArrayList<Double>();

public Display(int xsize, int ysize) {
    t.start();
    addKeyListener(this);
    setFocusable(true);
    setFocusTraversalKeysEnabled(false);
    xtemp = xsize;
    ranx = (xtemp - 15) * Math.random();
    ytemp = ysize;
    rany = (ytemp - 15) * Math.random();
    formSnake();

}

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;
    // Adds snake
    g2.setColor(Color.YELLOW);
    for (int i = 0; i < rects.size(); i++) {
        g2.fill(rects.get(i));
    }
    // Adds fruit at random location
    g2.setColor(Color.BLUE);
    g2.fill(new Ellipse2D.Double(ranx, rany, 15, 15));
    setBackground(Color.BLACK);
}

@Override
public void actionPerformed(ActionEvent e) {
    repaint();
    // Replaces each rectangle location with one before it
    for (int i = rects.size() - 1; i > 0; i--) {
        xloc.set(i, xloc.get(i - 1));
        yloc.set(i, yloc.get(i - 1));
    }
    // Sets new head location
    xloc.set(0, xloc.get(0) + xvel);
    yloc.set(0, yloc.get(0) + yvel);
    getEaten();
}

// Adds initial 3 2DRectangles to snake at start of game
public void formSnake() {
    for (int i = 0; i < rects.size(); i++) {
        xloc.add(xCoord);
        yloc.add(yCoord - 16 * i);
        rects.add(rects.size(),
                new Rectangle2D.Double(xloc.get(i), yloc.get(i), 15, 15));
    }
}

// Adds 1 2DRectangle to the front of the snake every time it eats
public void extend() {
    // Vertical
    if (xvel == 0) {

        if (yvel <= 0) { // Up
            xloc.add(xloc.get(xloc.size() - 1));
            yloc.add(yloc.get(yloc.size() - 1) - 16);
            rects.add(new Rectangle2D.Double(xloc.get(xloc.size() - 1),
                    yloc.get(yloc.size() - 1), 15, 15));

        } else
            // Down
            xloc.add(xloc.get(xloc.size() - 1));
        yloc.add(yloc.get(yloc.size() - 1) + 16);
        rects.add(new Rectangle2D.Double(xloc.get(xloc.size() - 1), yloc
                .get(yloc.size() - 1), 15, 15));
    }
    // Horizontal
    else if (yvel == 0) {
        if (xvel <= 0) { // Left
            xloc.add(xloc.get(xloc.size() - 1) - 16);
            yloc.add(yloc.get(yloc.size() - 1));
            rects.add(new Rectangle2D.Double(xloc.get(xloc.size() - 1),
                    yloc.get(yloc.size() - 1), 15, 15));
        } else
            // Right
            xloc.add(xloc.get(xloc.size() - 1) + 16);
        yloc.add(yloc.get(yloc.size() - 1));
        rects.add(new Rectangle2D.Double(xloc.get(xloc.size() - 1), yloc
                .get(yloc.size() - 1), 15, 15));
    }
}

public void getEaten() {
    if (Math.abs(xCoord - ranx) < 15 && Math.abs(yCoord - rany) < 15) {
        rany = ytemp * Math.random();
        ranx = xtemp * Math.random();
        eaten++;
        extend();
    }
}

//Directions
public void up() {
    yvel = -0.5;
    xvel = 0;
}

public void down() {
    yvel = 0.5;
    xvel = 0;
}

public void left() {
    xvel = -0.5;
    yvel = 0;
}

public void right() {
    xvel = 0.5;
    yvel = 0;
}

//Just for testing purposes
public void stop() {
    xvel = 0;
    yvel = 0;
}

//Direction implementation
@Override
public void keyPressed(KeyEvent e) {
    int code = e.getKeyCode();
    if (code == KeyEvent.VK_UP || code == KeyEvent.VK_NUMPAD8) {
        up();
    }
    if (code == KeyEvent.VK_DOWN || code == KeyEvent.VK_NUMPAD2) {
        down();
    }
    if (code == KeyEvent.VK_RIGHT || code == KeyEvent.VK_NUMPAD6) {
        right();
    }
    if (code == KeyEvent.VK_LEFT || code == KeyEvent.VK_NUMPAD4) {
        left();
    }

}

@Override
public void keyTyped(KeyEvent e) {
}

@Override
public void keyReleased(KeyEvent e) {
    }
}

最佳答案

你似乎得到了

Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
    at java.util.ArrayList.rangeCheck(ArrayList.java:638)
    at java.util.ArrayList.get(ArrayList.java:414)
    at javaapplication968.JavaApplication968$Display.actionPerformed(JavaApplication968.java:110)

xloc.set(0, xloc.get(0) + xvel); 处,因为 xloc List 中没有元素

更改您的 formSnake 方法,使其完全按照其说明执行...//在游戏开始时将初始 3 个 2D矩形添加到蛇中,而不是使用 矩形。 size(),调用时将为0...

    // Adds initial 3 2DRectangles to snake at start of game
    public void formSnake() {
        for (int i = 0; i < 3; i++) {
            xloc.add(xCoord);
            yloc.add(yCoord - 16 * i);
            rects.add(rects.size(),
                            new Rectangle2D.Double(xloc.get(i), yloc.get(i), 15, 15));
        }
    }

关于java - 为什么执行这段代码时蛇没有出现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29204360/

相关文章:

Java 方法调用解析器?

java - 包含 webview 的警报对话框内的进度条

Java 俄罗斯方 block - 为每一 block 设置新颜色

java - 在 Java 中使用 do-while 循环进行异常处理

java - 如何在回收站 View android中选择多个项目?

java - 在 Java 中将 double 转换为 String,反之亦然,而不会失去准确性

java - JPanel 上的 drawImage() 或在 GridLayout 顶部添加图像

java - 重写 AbstractButton.getIcon 的问题

java - 我可以改变我的字符串吗?

java - 我正在尝试创建一种方法,将车辆的 arrayList 转换为数组并返回该数组