foxandrabbit
•实现这么一个生态模拟类小游戏
•游戏中角色有狐狸Fox,兔子Rabbit,生活在一片草原上
•Fox和Rabbit都有年龄Age,会随着游戏进行成长grow,年龄会增加;
•年龄达到生育阶段可以生育breed一个小Baby,达到上限Agelimit就死亡;
•游戏每一轮他们可以选择随机移动还是生育,狐狸还可以选择吃掉一只兔子,吃掉后生命延长; -
代码设计
Animal父类,包含动物出生,繁衍,捕食,移动,死亡等基本功能
从animal父类中继承的子类fox和rabbit,并各自拥有自己的特征
package animal;
import java.util.ArrayList;
import field.Location;
public abstract class Animal {
private int ageLimit; //定义年龄上限
private int breedableAge; //能够繁殖的年龄
private int age; //年龄
private boolean isAlive = true; //是否存活
//构造Animal并初始化ageLimit和breedableAge
public Animal(int ageLimit, int breedableAge) {
this.ageLimit = ageLimit;
this.breedableAge = breedableAge;
}
//获取年龄 protected含义:只有包内其它类、自己和子类可以访问
protected int getAge() {
return age;
}
//
protected double getAgePercent() {
return (double) age / ageLimit;
}
//定义抽象函数breed
public abstract Animal breed();
//成长,年龄增加判断是否达到年龄上限
public void grow() {
age++;
if (age >= ageLimit) {
die();
}
}
//死亡判定
public void die() {
isAlive = false;
}
//存活判定
public boolean isAlive() {
return isAlive;
}
//判定是否有繁殖能力
public boolean isBreedable() {
return age >= breedableAge;
}
//位置 移动
public Location move(Location[] freeAdj) {
Location ret = null;
if (freeAdj.length > 0 && Math.random() < 0.02) {
ret = freeAdj[(int) (Math.random() * freeAdj.length)];
}
return ret;
}
@Override
public String toString() {
return "" + age + ":" + (isAlive ? "live" : "dead");
}
//捕食属性
public Animal feed(ArrayList<Animal> neighbour) {
return null;
}
//捕食延长生命
protected void longerLife(int inc) {
ageLimit += inc;
}
}
子类Fox的代码设计
//implements实现接口cell
public class Fox extends Animal implements Cell {
//构造
public Fox() {
super(20, 4);
}
//类fox实现这个接口cell后,就要执行相应的动作draw,利用覆盖函数
@Override
public void draw(Graphics g, int x, int y, int size) {
int alpha = (int) ((1 - getAgePercent()) * 255);
g.setColor(new Color(0, 0, 0, alpha));//(int)((20-getAge())/20.0*255)));
g.fillRect(x, y, size, size);
}
//继承覆盖一些父类中的特性,繁殖
@Override
public Animal breed() {
Animal ret = null;
if (isBreedable() && Math.random() < 0.05) {
ret = new Fox();
}
return ret;
}
//继承
@Override
public String toString() {
return "Fox:" + super.toString();
}
//继承feed捕食成长
@Override
public Animal feed(ArrayList<Animal> neighbour) {
Animal ret = null;
if (Math.random() < 0.2) {
ret = neighbour.get((int) (Math.