Member 13994924 Ответов: 0

Помогите с ошибками выбора и ошибки, появляется сообщение об обработки


I’m using Processing 3 to code and I'm pretty new but know some basics, so I wanted to make the game Snake. I’ve been able to make the square move in a grid and eat food then spawn new food, but adding a new square is giving me trouble. In the Snake class and void update() I’m trying to create a vector for the new part of the snake by increasing total by 1 in boolean eat() then having inside the update an array that adds 1 to the length. Right now I have the total set as 0 so I get the ArrayIndex… error but if I change total to 1 to fix that I get NullPointerException when trying to draw the new rectangle in the void show() function.
PVector food;
float scl=20;
Snake s;

void setup()
{
  size(800,800);
  background(255);
  s= new Snake();
  frameRate(10);
  pickLocation();
}

void draw()
{
  background(200);
  s.update();
  s.show();
  if(s.eat(food))
  {
    pickLocation();
  }
  
  fill(255,0,0);
  rect(food.x,food.y,scl,scl);
}

void pickLocation()
{
  float cols=floor(width/scl);
  float rows=floor(height/scl);
  food= new PVector(floor(random(cols)),floor(random(rows)));
  food.mult(scl);
}

class Snake
{
  float x=0;
  float y=0;
  float xspeed=1;
  float yspeed=0;
  float total=1;
  PVector[] tail= new PVector[6400];
  
  void dir(float x, float y)
  {
    xspeed=x;
    yspeed=y;
  }
  
  boolean eat(PVector pos)
  {
    float d=dist(x,y,pos.x,pos.y);
    if(d<1)
    {
      total++;
      return true;
    }
    else return false;
  }
  
  void update()
  {
    if(total==tail.length)
    {
      for(int i=(int)total; i<tail.length-1; i++)
      {
        tail[i]=tail[i+1];
      }
    }
    tail[(int)total-1]= new PVector(x,y);
    
    x=x + xspeed*scl;
    y=y + yspeed*scl;
    x=constrain(x,0,width-scl);
    y=constrain(y,0,height-scl);
  }
  
  void show()
  {
    fill(0);
    for(int i=0; i<tail.length; i++)
      {
        rect(tail[i].x,tail[i].y,scl,scl);
      }
    
    stroke(255);
    fill(0);
    rect(x,y,20,20);
  }
}

void keyPressed()
{
  if(keyCode==UP)
  {
    s.dir(0,-1);
  }
  else if(keyCode==DOWN)
  {
    s.dir(0,1);
  }
  else if(keyCode==RIGHT)
  {
    s.dir(1,0);
  }
  else if(keyCode==LEFT)
  {
    s.dir(-1,0);
  }
}


Что я уже пробовал:

Я попробовал использовать 2 поплавка вместо Pvector и не получил никаких ошибок, но тогда новый хвостовой блок не остается связанным со змеей. Я знаю, что мой код, вероятно, грязный и плохой, но я пытался найти исправление, и я не могу, поэтому я надеюсь, что кто-то может помочь. Если вам нужно, чтобы я объяснил что-то еще в коде, что еще не было упомянуто, просто спросите. Я также попытался изменить < в цикле for В void show() на >, который избавляется от ошибок, но не добавляет новый блок змеиного хвоста на змею.

Richard MacCutchan

Первое, что вам нужно объяснить: какие именно ошибки вы видите, где они происходят и любая другая связанная с ними информация.

Member 13994924

Итак,первая ошибка была ArrayIndexOutOfBoundsException: -1 в этой строке: tail[(int)total-1]= new PVector(x, y); но я могу исправить эту ошибку, изменив total на 1, что я уже сделал в коде, который я вставил. Но делать, что приводит к другой ошибке назвал исключение NullPointerException на этой линии: прямоугольник(хвост[я].х,хвост[я].г,ОКС,ОКС);

Richard MacCutchan

Таким образом, одна из этих ссылок является нулевой. Используйте свой отладчик, чтобы выяснить, что это такое и почему. Не гадайте, а затем измените какое-то случайное значение, надеясь, что это исправит проблему.

0 Ответов