Нужна помощь, чтобы сделать массив для игры Snake в Greenfoot - PullRequest
0 голосов
/ 20 октября 2011

В школе есть новое задание, чтобы закодировать игру «Змея» с нуля, и нужно использовать массив для добавления новой части тела Змеи, когда Змеиная голова ест еду, а в начале Змея должна иметь 1 голову и 2 части тела .. и Я понятия не имею, как это сделать .. кто-то может помочь мне в правильном направлении .. как начать? Вот мой код:

Мир:

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));
    }
}

Змея класса:

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 Ответ

1 голос
/ 21 октября 2011

У меня такое ощущение, что ваш вопрос является более общим, чем простая обработка массива.

Похоже, вы пытаетесь использовать много логики взаимодействия спрайтов в своем классе змей.

Вероятно, лучшей идеей было бы переместить ввод пользователя в другое место и заставить игровое поле сообщать об изменениях состояния различным спрайтам (змея, еда, стена и т. Д.), Включая обнаружение столкновений.Если игровое поле обнаружит столкновение между змеей и едой, оно переместит спрайт с едой на следующую позицию и вызовет Eat () на объекте змеи в игре.Если он обнаружит столкновение между змеей и самой собой, игра закончится.

Было бы неразумно позволить змее нарисовать себя на доске * или, по крайней мере, сохранить свою информацию для отображения на доске.справиться.Объект змеи может иметь массив (или, еще лучше, ArrayList), в котором хранятся координаты блоков, из которых состоит змея.Когда змея движется, вы можете просто увеличивать массив и изменять точки, чтобы учитывать направление движения и расстояние.Если бы я реализовывал это, я бы использовал массив точек поворота, которые бы указывали змее, как поворачивать кусочки змеи, когда она пересекает доску.Когда точка опоры больше не действительна (у змеи больше нет частей, которые пересекают опору), я удаляю ее из массива.

Просто мое предложение.Я не зарабатываю игры на жизнь, поэтому я уверен, что есть еще лучшие способы сделать это.

* Вы можете найти пример того, как первый из них используется в приложении, подобном InDesign, в Design Patterns отGang of Four, если вам нужна дополнительная информация о том, как это настроить.

...