You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在其他对象的数组中添加/移除对象?生物繁殖功能实现求助

嘿,我来帮你搞定生物繁殖的问题!你遇到的核心点就是存储生物数组的对象外部访问+数组扩容+正确复制生物实例,下面给你一步步拆解解决方案:

实现生物繁殖的具体步骤

1. 先确保能访问到目标数组

首先你得拿到存储Creature[]的那个对象实例,并且要保证数组(或者对应的访问方法)是可访问的。比如假设存储数组的对象叫GameWorld,那你得先在代码里持有它的实例:

GameWorld myWorld; // 存储生物数组的对象实例

void setup() {
  size(1280,720,P2D);
  myWorld = new GameWorld();
  // 这里执行你的生物初始化代码,把20个生物加载到myWorld的数组里
}

2. 给Creature类写拷贝方法

要生成生物的副本,必须创建一个独立的新对象,而不是直接引用原生物(不然改副本等于改原生物)。你可以给Creature类加个拷贝构造方法或者copy()方法:

class Creature {
  int health;
  float x, y;
  // 其他属性...
  
  // 原构造方法
  Creature(int initHealth, float startX, float startY) {
    health = initHealth;
    x = startX;
    y = startY;
  }
  
  // 拷贝构造方法——直接用原生物实例创建新生物
  Creature(Creature originalCreature) {
    this.health = originalCreature.health;
    this.x = originalCreature.x;
    this.y = originalCreature.y;
    // 注意:如果有引用类型的属性(比如自定义的状态对象),要做深拷贝,不然还是共用同一个实例
  }
  
  // 或者写个更直观的copy方法
  Creature copy() {
    return new Creature(this.health, this.x, this.y);
  }
}

3. 处理数组的动态扩容(重点!)

你原来的数组是固定大小new Creature[20],满了之后直接加元素会报错。这里有两个方案:

方案A:改用ArrayList(推荐,更省心)

把原来的固定数组换成ArrayList<Creature>,它会自动处理扩容。在存储数组的对象里这样定义:

class GameWorld {
  ArrayList<Creature> creatures = new ArrayList<>();
  
  // 初始化生物的方法
  void initCreatures() {
    for(int i = 0; i < 20; i++) {
      // 这里替换成你的生物初始化逻辑
      creatures.add(new Creature(100, random(width), random(height)));
    }
  }
}

之后繁殖的时候,直接调用add()就能把副本加进去:

// 比如选第一个生物作为母体繁殖
Creature parent = myWorld.creatures.get(0);
Creature baby = new Creature(parent); // 用拷贝构造方法生成副本
myWorld.creatures.add(baby); // 直接添加到ArrayList里

方案B:继续用固定数组,手动实现扩容

如果你不想换ArrayList,就得自己写扩容逻辑,当数组满了的时候创建更大的新数组,把原数组的元素复制进去:

class GameWorld {
  Creature[] creatures = new Creature[20];
  int currentCreatureCount = 0; // 记录当前实际的生物数量
  
  void initCreatures() {
    for(int i = 0; i < 20; i++) {
      creatures[i] = new Creature(100, random(width), random(height));
      currentCreatureCount++;
    }
  }
  
  // 封装添加生物的方法,包含扩容逻辑
  void addNewCreature(Creature newCreature) {
    // 检查数组是否已满
    if(currentCreatureCount >= creatures.length) {
      // 扩容为原来的2倍,你也可以自定义大小
      Creature[] expandedArray = new Creature[creatures.length * 2];
      // 把原数组的元素复制到新数组
      System.arraycopy(creatures, 0, expandedArray, 0, creatures.length);
      // 替换原数组
      creatures = expandedArray;
    }
    // 添加新生物
    creatures[currentCreatureCount] = newCreature;
    currentCreatureCount++;
  }
}

繁殖的时候调用这个方法就行:

Creature parent = myWorld.creatures[0];
Creature baby = parent.copy();
myWorld.addNewCreature(baby);

4. 触发繁殖的时机

你可以在draw()方法里,给生物加个繁殖条件(比如生命值达标、存活时间够长),满足条件就触发繁殖:

void draw() {
  background(0);
  // 遍历所有生物,更新和绘制
  for(int i = 0; i < myWorld.currentCreatureCount; i++) {
    Creature c = myWorld.creatures[i];
    c.update(); // 你的生物更新逻辑
    c.draw();   // 你的生物绘制逻辑
    
    // 举个例子:当生命值大于150时繁殖,同时消耗母体50点生命值
    if(c.health > 150) {
      Creature baby = c.copy();
      myWorld.addNewCreature(baby);
      c.health -= 50;
    }
  }
}

内容的提问来源于stack exchange,提问作者A. Moulding

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:35:59