Need help to do a array to Snake game in Greenfoot

2k Views Asked by At

Got a new task in School to code the Snake Game from scratch and need to use a array to add a new Snake bodypart when the Snakehead eats food and at the beginning the Snake need to have 1 head and 2 bodyparts..and I have no idea how to do this..can someone out there help me on right direction..how to start? Here is my code so far:

The world:

public class WorldofSnake extends World
{

    /**
     * Constructor for objects of class WorldofSnake.
     * 
     */
    public WorldofSnake()
    {    

        super(600, 400, 1); 

        addObject ( new Snake(),70 , 50);
        addObject ( new Food(), Greenfoot.getRandomNumber(600), Greenfoot.getRandomNumber(400));
    }
}

The class Snake:

import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Write a description of class Snake here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class Snake extends Actor
{

private int foodEaten;



public Snake()
{
     foodEaten = 0;
}


public void act() 
{
       checkKeypress();
       lookForFood();
    }

    public void checkKeypress()
    { if(Greenfoot.isKeyDown("left")){
      setLocation(getX() - 2,(getY()));
    }
      if(Greenfoot.isKeyDown("right")){
      setLocation(getX() + 2,(getY()));
    }
      if(Greenfoot.isKeyDown("up")){
      setLocation(getX() ,(getY() - 2));  
    }
      if(Greenfoot.isKeyDown("down")){
      setLocation(getX() ,(getY() + 2));  
}

}
public void lookForFood()
{
  Actor a = getOneIntersectingObject(Food.class);
  if (a !=null)
{
  getWorld().removeObject(a);
  getWorld().addObject ( new Food(), Greenfoot.getRandomNumber(600), Greenfoot.getRandomNumber(400));
  foodEaten = foodEaten + 1;
}

}
}
1

There are 1 best solutions below

0
On

I'm getting the feeling your question is more general than simple array handling.

It looks like you're trying to put a lot of sprite interaction logic in your snake class.

Probably a better idea would be to move user input elsewhere and have the game board communicate state changes to the various sprites (snake, food, wall etc) including collision detection. If it the game board detects a collision between the snake and food, it would move the food sprite to the next position and invoke Eat() on the snake object in play. If it detects a collision on between the snake and itself, the game would end.

It wouldn't be unreasonable to let the snake draw itself on the board* or at least store it's display information for the board to handle. The snake object could have an array (or better yet an ArrayList) that stores the coordinates of the blocks that make up a snake. As the snake moves you can just increment over the array and change the points to take into account the direction of movement and how far to move. If I was implementing it I'd use an array of pivot points that would tell the snake how to turn pieces of the snake as it traverses the board. When the pivot point is no longer valid (the snake no longer has any parts that cross the pivot) I'd remove it from the array.

Just my suggestion. I don't make games for a living so I'm sure there are even better ways to do it.

*You can find an example of the former being used in an InDesign like app in Design Patterns by the Gang of Four if you want further reference on how to set that up.