如何在其他对象的数组中添加/移除对象?生物繁殖功能实现求助
嘿,我来帮你搞定生物繁殖的问题!你遇到的核心点就是存储生物数组的对象外部访问+数组扩容+正确复制生物实例,下面给你一步步拆解解决方案:
实现生物繁殖的具体步骤
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
相关产品推荐
相关产品推荐

