Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 试图重写蛇-蛇吃自己_Java - Fatal编程技术网

Java 试图重写蛇-蛇吃自己

Java 试图重写蛇-蛇吃自己,java,Java,我(至少对我来说)遇到了一个非常奇怪的情况。 我正在尝试重写snake,移动进行得非常顺利,只有蛇在吃自己,虽然我删除了1个片段,并添加了1(x+1-1=x?),但蛇消失了,而Arraylist保持了相同的大小(打印它) 计算蛇的位置的函数(我认为是它引起的): private void move(){ System.out.println(position.size()); 指向toAdd=position.get(position.size()-1); 位置。移除(0); if(dir==1

我(至少对我来说)遇到了一个非常奇怪的情况。
我正在尝试重写snake,移动进行得非常顺利,只有蛇在吃自己,虽然我删除了1个片段,并添加了1(x+1-1=x?),但蛇消失了,而Arraylist保持了相同的大小(打印它)

计算蛇的位置的函数(我认为是它引起的):

private void move(){
System.out.println(position.size());
指向toAdd=position.get(position.size()-1);
位置。移除(0);
if(dir==1)
toAdd.y-=5;
else if(dir==2)
toAdd.x-=5;
else if(dir==3)
toAdd.x+=5;
else if(dir==4)
toAdd.y+=5;
如果(toAdd.x<0)toAdd.x=150;
否则,如果(toAdd.x>150)toAdd.x=0;
如果(toAdd.y<0)toAdd.y=150;
否则,如果(toAdd.y>150)toAdd.y=0;
位置。添加(toAdd);
}
但是,要让它成为一个简短、独立、正确的例子:

import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.*;
import java.util.ArrayList;

class Snake extends JPanel implements Runnable {
    int x,y;
    boolean horizontal;
    ArrayList<Point> position = new ArrayList<Point>();
    byte dir = 3;

    public Snake(JFrame parent) {
        for(int i = 0; i < 5; i++)
            position.add(new Point(i*5 + 10, 10));

        parent.addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent e) {
                byte change = dir;
                switch (e.getKeyCode()) {
                    case KeyEvent.VK_DOWN:
                        change = 4;
                        break;
                    case KeyEvent.VK_UP:
                        change = 1;
                        break;
                    case KeyEvent.VK_LEFT:
                        change = 2;
                        break;
                    case KeyEvent.VK_RIGHT:
                        change = 3;
                        break;
                }

                changeDirection(change);
            }
        });
        System.out.println("starting thread");
        new Thread(this).start();
    }

    private void changeDirection(byte change) {
        if(change != dir && (change - 2 != dir || change + 2 != dir)) {
            dir = change;
        }
    }

    public void run() {
        for(int i = 0; i != -1; i++){
            try {
                move();
                this.repaint();
                Thread.sleep(1000);
            }
            catch (InterruptedException e) {
                System.out.println("INTERRUPTED");
            }
        }
    }

    private void move() {
        System.out.println(position.size());
        Point toAdd = position.get(position.size() - 1);
        position.remove(0);
        if(dir == 1)
            toAdd.y -= 5;
        else if(dir == 2) 
            toAdd.x -= 5;
        else if(dir == 3)
            toAdd.x += 5;
        else if(dir == 4)
            toAdd.y += 5;

        if(toAdd.x < 0) toAdd.x = 150;
        else if(toAdd.x > 150) toAdd.x = 0;

        if(toAdd.y < 0) toAdd.y = 150;
        else if(toAdd.y > 150) toAdd.y = 0;
        position.add(toAdd);
    }

    public void paintComponent(Graphics g) {
        g.clearRect(0,0,150,150);
        for(Point p : position)
            g.drawRect(p.x, p.y, 5, 5);
    }

    public static void main(String[] args) {
        Snake snake;
        JFrame f = new JFrame("Snake");
        f.setSize(150, 150);
        f.add((snake = new Snake(f)));
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setResizable(false);
        f.setVisible(true);
    }
}
import javax.swing.JFrame;
导入javax.swing.JPanel;
导入java.awt.Graphics;
导入java.awt.Point;
导入java.awt.event.*;
导入java.util.ArrayList;
类Snake扩展了JPanel实现Runnable{
int x,y;
布尔水平;
ArrayList位置=新的ArrayList();
字节dir=3;
公共蛇(JFrame父对象){
对于(int i=0;i<5;i++)
位置。添加(新点(i*5+10,10));
addKeyListener(新的KeyAdapter(){
按下公共无效键(按键事件e){
字节变化=dir;
开关(如getKeyCode()){
case KeyEvent.VK_向下:
变化=4;
打破
case KeyEvent.VK_UP:
变化=1;
打破
case KeyEvent.VK_左:
变化=2;
打破
case KeyEvent.VK_RIGHT:
变化=3;
打破
}
改变方向(改变);
}
});
System.out.println(“起始线程”);
新线程(this.start();
}
私有void changeDirection(字节更改){
if(change!=dir&(change-2!=dir | | change+2!=dir)){
dir=变化;
}
}
公开募捐{
对于(int i=0;i!=-1;i++){
试一试{
move();
这个。重新绘制();
睡眠(1000);
}
捕捉(中断异常e){
系统输出打印项次(“中断”);
}
}
}
私人空位移动(){
System.out.println(position.size());
指向toAdd=position.get(position.size()-1);
位置。移除(0);
if(dir==1)
toAdd.y-=5;
else if(dir==2)
toAdd.x-=5;
else if(dir==3)
toAdd.x+=5;
else if(dir==4)
toAdd.y+=5;
如果(toAdd.x<0)toAdd.x=150;
否则,如果(toAdd.x>150)toAdd.x=0;
如果(toAdd.y<0)toAdd.y=150;
否则,如果(toAdd.y>150)toAdd.y=0;
位置。添加(toAdd);
}
公共组件(图形g){
g、 clearRect(0,0150150);
用于(点p:位置)
g、 drawRect(p.x,p.y,5,5);
}
公共静态void main(字符串[]args){
蛇;
JFrame f=新的JFrame(“蛇”);
f、 设置大小(150150);
f、 添加((snake=新snake(f));
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 可设置大小(假);
f、 setVisible(真);
}
}
运动是我试图实现的第一件事,我还没有谈到碰撞检测/食物,这不是这里的问题

我的问题是:

为什么蛇在缩小,而arraylist没有缩小,我如何修复它,即阻止蛇消失,除了前面的部分?好的。这很简单

您正在更改列表中已存在的点
位置
,并在末尾将相同的点添加到此列表中。最终会有越来越多的相同(通过引用)元素位于相同的位置

您应该创建
点的新实例
,并将其添加到列表中

Point lastPoint = position.get(position.size() - 1);
    Point toAdd = new Point(lastPoint.x, lastPoint.y);

@请解释一下,有人能解释一下为什么这不是一个真正的问题吗?最后一段是一个非常明确的问题,我认为,不难找到它,它不太宽泛,它可能只是“太本地化”,但它将是这里众多问题中的一个,有一些问题更本地化。我不会称之为修辞,也不是不完整的——我甚至提供了一个SSCCE——它肯定可以以它当前的形式得到合理的回答,由愿意查看我的代码并看到无疑愚蠢错误的人来回答。
Point lastPoint = position.get(position.size() - 1);
    Point toAdd = new Point(lastPoint.x, lastPoint.y);