Add File
This commit is contained in:
@@ -0,0 +1,151 @@
|
||||
/*
|
||||
* Copyright 2018 the original author or authors.
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
||||
* use this file except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by
|
||||
* applicable law or agreed to in writing, software distributed under the
|
||||
* License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
|
||||
* OF ANY KIND, either express or implied. See the License for the specific
|
||||
* language governing permissions and limitations under the License.
|
||||
*/
|
||||
package com.github.drinkjava2.frog.brain;
|
||||
|
||||
import com.github.drinkjava2.frog.Frog;
|
||||
import com.github.drinkjava2.frog.brain.organ.Eye;
|
||||
import com.github.drinkjava2.frog.egg.OrganDesc;
|
||||
import com.github.drinkjava2.frog.egg.Zone;
|
||||
import com.github.drinkjava2.frog.env.Env;
|
||||
|
||||
/**
|
||||
* Organ is a sensor or execute part connected to frog's brain cell, like:
|
||||
* 器官,分为输入器官和输出器官两大类,它们在蛋里定义,数量、位置、大小可以随机变异进化,但目前在蛋里用硬编码写死,不允许器官进化,一个眼睛都没搞定,要进化出10个眼睛来会吓死人
|
||||
*
|
||||
* <pre/>
|
||||
*
|
||||
* Sensors:
|
||||
* hungry sensor, eye, ear, smell, happy sensor
|
||||
*
|
||||
* Executor:
|
||||
* moves (up/down/left/right), eat ...
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
* @author Yong Zhu
|
||||
* @since 1.0
|
||||
*/
|
||||
public class Organ extends Zone {
|
||||
private static final long serialVersionUID = 1L;
|
||||
public static final int HUNGRY = 0;
|
||||
public static final int UP = 1;
|
||||
public static final int DOWN = 2;
|
||||
public static final int LEFT = 3;
|
||||
public static final int RIGHT = 4;
|
||||
public static final int EAT = 5;
|
||||
public static final int EYE = 6;
|
||||
|
||||
public int type;
|
||||
|
||||
public Organ(OrganDesc od) {
|
||||
super(od.x, od.y, od.radius);
|
||||
type = od.type;
|
||||
}
|
||||
|
||||
public Organ(int type, float x, float y, float radius) {
|
||||
super(x, y, radius);
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
public void active(Frog f) {
|
||||
switch (type) {
|
||||
case HUNGRY:
|
||||
hungry(f);
|
||||
break;
|
||||
case UP:
|
||||
up(f);
|
||||
break;
|
||||
case DOWN:
|
||||
down(f);
|
||||
break;
|
||||
case LEFT:
|
||||
left(f);
|
||||
break;
|
||||
case RIGHT:
|
||||
right(f);
|
||||
break;
|
||||
case EAT:
|
||||
eat(f);
|
||||
break;
|
||||
case EYE:
|
||||
eye(f);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public void hungry(Frog f) {
|
||||
for (Cell cell : f.cells) {
|
||||
if (cell.energy > 0)
|
||||
cell.energy--;
|
||||
|
||||
if (f.energy < 10000 && cell.energy < 100)
|
||||
for (Input input : cell.inputs)
|
||||
if (input.nearby(this)) // input zone near by hungry zone
|
||||
cell.energy += 2;
|
||||
}
|
||||
}
|
||||
|
||||
public void up(Frog f) {
|
||||
if (outputActive(f))
|
||||
f.y++;
|
||||
}
|
||||
|
||||
public void down(Frog f) {
|
||||
if (outputActive(f))
|
||||
f.y--;
|
||||
}
|
||||
|
||||
public void left(Frog f) {
|
||||
if (outputActive(f))
|
||||
f.x--;
|
||||
}
|
||||
|
||||
public void right(Frog f) {
|
||||
if (outputActive(f))
|
||||
f.x++;
|
||||
}
|
||||
|
||||
public void eat(Frog f) {
|
||||
int x = f.x;
|
||||
int y = f.y;
|
||||
if (x < 0 || x >= Env.ENV_WIDTH || y < 0 || y >= Env.ENV_HEIGHT) {// 越界者死!
|
||||
f.alive = false;
|
||||
return;
|
||||
}
|
||||
|
||||
if (Env.foods[x][y]) {
|
||||
Env.foods[x][y] = false;
|
||||
f.energy = f.energy + 1000;// 吃掉food,能量境加
|
||||
}
|
||||
}
|
||||
|
||||
public void eye(Frog f) {
|
||||
Eye.act(f, this);
|
||||
}
|
||||
|
||||
// ======public methods========
|
||||
|
||||
public boolean outputActive(Frog f) {
|
||||
for (Cell cell : f.cells) {
|
||||
for (Output output : cell.outputs) { //
|
||||
if (cell.energy > 10 && this.nearby(output)) {
|
||||
f.cellGroups[cell.group].fat++;
|
||||
cell.energy -= 30;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user