在学校里有一个新的任务来从零开始编写Snake游戏,当Snakehead吃掉食物时需要使用一个阵列来添加一个新的Snake bodypart,并且在开始时Snake需要有1个头部和2个bodyparts。我不知道该如何做到这一点。那里有人帮助我正确的方向......如何开始?到目前为止,这是我的代码:
世界:
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));
}
}
班级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;
}
}
}
答案 0 :(得分:1)
我感觉你的问题比简单的数组处理更普遍。
看起来你正试图在你的蛇类中加入很多精灵交互逻辑。
可能更好的想法是将用户输入移动到其他地方并让游戏板将状态变化传达给各种精灵(蛇,食物,墙壁等),包括碰撞检测。如果游戏板检测到蛇和食物之间的碰撞,它会将食物精灵移动到下一个位置并在游戏中的蛇形物体上调用Eat()。如果它检测到蛇与自身之间发生碰撞,游戏就会结束。
让蛇在棋盘上画画*或者至少存储它的显示信息以供棋盘处理是不合理的。蛇对象可以有一个数组(或者更好的是ArrayList),它存储构成蛇的块的坐标。当蛇移动时,您可以在阵列上增加并更改点以考虑移动方向和移动距离。如果我正在实施它,我将使用一系列枢轴点,告诉蛇如何在蛇穿过棋盘时转动蛇的碎片。当枢轴点不再有效时(蛇不再有任何穿过枢轴的部分)我将它从阵列中移除。
只是我的建议。我不以游戏为生,所以我相信还有更好的方法可以做到。
*如果您想进一步参考如何进行设置,可以在Gang of Four中找到一个在设计模式中使用InDesign的应用程序的示例。