0

我正在制作一个虚拟宠物游戏,现在我正在尝试将饥饿包括在内,但是我不确定如何使吃功能起作用。我试图通过增加食物的营养价值来降低它。此值位于存储在 arraylist 中的对象中。

有没有办法参考

 int nutrition(int eaten) {
    nutrition = nutrition - eaten;
    return nutrition;

(吃掉的 int 稍后会传入)

里面

ArrayList items;

void setup() {
    items = new ArrayList();
}


void draw() {
    for (int i = items.size() - 1; i >=0; i --) {
      Food food = (Food) items.get(i);
      food.display();
      if (food.finished()) {
        items.remove(i);
      }
    }
  }

  void mouseClicked() {
    items.add(new Food(mouseX, mouseY, 1));
  }





((Food)items.get(i)).nutrition();

http://www.java-forums.org/new-java/2370-how-return-object-arraylist.html 我试过用这个,但处理无法找到我。我相信这是因为我在课堂上不存在,只存在于主草图中。如果是这样,我会找到一种方法将 i 放入方法中。也许使用返回。

如果有人知道更好的方法来做到这一点,我将不胜感激。

代码

Creature creature;
ArrayList items;
Hand hand;
String data[];
int gameInfo[];
int tempData[];
boolean haveFood;

void setup() {
  size(100, 100);
  smooth();
  noCursor();
  String data[] = loadStrings("save.txt");
  String[] tempData = split(data[0], ',');
  gameInfo = int(tempData);
  for (int i = 0; i < data.length; i++) { 
    creature = new Creature(gameInfo[0], gameInfo[1], gameInfo[2], gameInfo[3]);
    haveFood = false;
    hand = new Hand();
    items = new ArrayList();
  }
}

  void draw() {
    background(255);
    for (int i = items.size() - 1; i >=0; i --) {
      Food food = (Food) items.get(i);
      food.display();
      if (food.finished()) {
        items.remove(i);
      }
    }
    creature.whatWant();
    creature.whatDo(haveFood);
    hand.draw();
  }



  void mouseClicked() {
    items.add(new Food(mouseX, mouseY, 1));
    haveFood = true;
  }


class Creature {
  int hunger;
  int age;
  int gender;
  int asleep;
  boolean idle;
  char want;
  char request;



  Creature(int _gender, int _age, int _hunger, int _asleep) {
    gender = _gender;
    age = _age;
    hunger = _hunger;
    asleep = _asleep;
    idle = true;
  }  

  void whatWant() {
    if (hunger == 50) {
      want = 'H';
    }
  }

  void whatDo(boolean food) {
    if (idle == true) {
      switch(want) {
      case 'H':
        if (food == true) {
          creature.eat();
        }
        else 
          request = 'F';
        ask();
      }
    }
    else
    {
      println("IDLE");
    }
  }

  void ask() {
    if (request == 'F') {
      println("HUNGRY");
    }
  }
  void eat() {
    println("EAT");
((Food)items.get(i)).nutrition();
  }
}

class Food {
  float posX;
  float posY;
  int nutrition;


  Food(float _posX, float _posY, int rating) {
    posX = _posX;
    posY = _posY;
    nutrition = rating;
  }

  void display() {
    rect(posX, posY, 10, 10);
  }

  boolean finished() {
    if (nutrition < 0) {
      return true;
    }
    else {
      return false;
    }
  }

  int nutrition(int eaten) {
    nutrition = nutrition - eaten;
    return nutrition;
  }
}

class Hand {
  int posX;
  int posY;

  Hand() {
    posX = mouseX;
    posY = mouseY;
  }

  void draw() {
    rectMode(CENTER);
    point(mouseX, mouseY);
  }
}

其中 save.txt 是一个 txt 文件,包含 1,1,50,1,1。

4

1 回答 1

0

不幸的是,我无法提供一个很好的详细答案。您的项目结构及其代码有很多令人困惑的事情。

与此同时,你在 Creature 的eat()函数中遇到了语法错误。尝试这个:

  void eat() {
    println("EAT");
    //((Food)items.get(i)).nutrition();
    for(int i = 0 ; i < items.size(); i++){
      Food yummy = (Food)items.get(0);
      yummy.nutrition(hunger);
    }
  }

上述工作是因为项目在顶部声明,因此在整个草图的范围内可见(换句话说,全局)。我不确定这是否是故意的,或者您计划在生物和食物之间建立什么关系。

上面可以用更懒(但不太常见/明显)的方式编写,如下所示:

  void eat() {
    println("EAT");
    //((Food)items.get(i)).nutrition();
    for(Object yummy : items) ((Food)yummy).nutrition(hunger);
  }

我假设这个生物会根据它的饥饿程度来喂食。我想在某个时候这个生物应该是饱的,所以你也可以hungry根据它从食物等中获得的营养来更新它的属性。

另外,为了测试,我添加了非常有营养的食物:P

items.add(new Food(mouseX, mouseY, 10000));
于 2013-02-22T15:53:56.447 回答