📄 greedyserpent.java
字号:
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.util.*;
class GreedySerpent extends Serpent
{
// protected Random rand=new Random((new Date()).getTime());
GreedySerpent(SerpentGameCanvas canv, Maze m, Position initPos, int len) {
super(canv, m, initPos, len);
direction=MOVE_UP;
type=GREEDY;
}
public void run()
{
int track=0;
try {
track=-1;
// egg.start();
newEgg();
do {
track=0;
invalidAreas.removeAllElements();
invalidateSerpent(this);
if( moveAhead()) {
track=1;
invalidateSerpent(this);
detectFrog(); // invalidate when frog eaten
track=8;
detectEggP();
track=2;
detectPlayerSerpent();
track=3;
if( isGhost())
System.err.println("Ghost Serpent "+ this + " at " + head);
track=4;
Rect rt;
rt=null;
for( int i=0;i<invalidAreas.size();i++ ) {
Position pt=(Position)invalidAreas.elementAt(i);
if( i==0 ) rt=new Rect(pt, gameCanvas.CELL_WIDTH);
rt.merge( new Rect(pt, gameCanvas.CELL_WIDTH));
}
if( rt!=null ) gameCanvas.repaint(rt.left, rt.top, rt.width+1, rt.height+1);
track=5;
}
if( !bLive ) gameCanvas.checkNpcKilled();
track=6;
sleep(400);
} while(bLive);
}
catch(Exception ex)
{
System.err.println("Npc Serpent error!");
ex.printStackTrace();
System.err.println(track);
}
}
protected void setRandomDirection()
{
int randNumber=Math.abs( gameCanvas.rand.nextInt() % 4 );
switch( randNumber ) {
case 0:
direction=MOVE_UP;
break;
case 1:
direction=MOVE_DOWN;
break;
case 2:
direction=MOVE_LEFT;
break;
case 3:
direction=MOVE_RIGHT;
break;
default:
}
}
protected boolean moveAhead()
{
synchronized(gameCanvas.npc) {
if( !bLive ) return false;
Position posDiff=new Position();
switch(direction) {
case MOVE_UP:
posDiff.setValue(0,-1);
break;
case MOVE_DOWN:
posDiff.setValue(0,1);
break;
case MOVE_LEFT:
posDiff.setValue(-1,0);
break;
case MOVE_RIGHT:
posDiff.setValue(1,0);
break;
default:
}
if( conflictWithWall(posDiff)) {
setRandomDirection();
return false;
}
for( int i=body.size()-1;i>=1;i-- ) {
((Position)body.elementAt(i)).setValue( (Position)body.elementAt(i-1) );
}
((Position)body.elementAt(0)).setValue(head);
head.add(posDiff);
}
return true;
}
protected void detectPlayerSerpent()
{
Serpent player=gameCanvas.player;
synchronized(gameCanvas.npc) {
if( !bLive ) return;
if( !player.bLive ) return;
int result;
bDetecting=true;
result=( player.hitTest(head));
if( result==-2 ) {
bDetecting=false;
return;
}
if( result==-1 ) {
invalidateSerpent(player);
if( body.size()>=player.body.size()) {
player.getKilled();
award(KILL_SERPENT);
}
else {
getKilled();
player.award(KILL_SERPENT);
}
invalidateSerpent(player);
}
else {
invalidateSerpent(player);
player.hurtBody(result);
invalidateSerpent(player);
}
bDetecting=false;
}
}
protected void detectEggP()
{
if( gameCanvas.eggp==null ) return;
synchronized(gameCanvas) {
if( head.equals(gameCanvas.eggp.pos)) {
invalidAreas.addElement(gameCanvas.eggp.pos);
gameCanvas.eggp.getKilled();
gameCanvas.eggp=null;
award(EAT_EGG);
gameCanvas.player.newEgg();
}
}
}
protected boolean isGhost()
{
for( int i=0;i<gameCanvas.npc.size();i++ ) {
if( ((Serpent)gameCanvas.npc.elementAt(i))==this )
return false;
}
return true;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -