📄 serpent.java
字号:
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.util.*;
class Serpent extends Thread
{
final static int MOVE_UP=2;
final static int MOVE_DOWN=8;
final static int MOVE_LEFT=4;
final static int MOVE_RIGHT=6;
final protected SerpentGameCanvas gameCanvas;
protected Maze maze;
protected int direction;
protected Position head;
protected Vector body;
public boolean bLive;
protected boolean bPause;
protected int type;
final static int PLAYER=0;
final static int GREEDY=1;
final static int BLIND=2;
final static int RUNNER=3;
protected Vector invalidAreas;
final static int EAT_FROG=0;
final static int EAT_EGG=1;
final static int HURT_SERPENT=2;
final static int KILL_SERPENT=3;
final static int NEW_LIFE=4;
final static int NEXT_STAGE=5;
boolean bDetecting=false;
public Egg egg=null;
Serpent(SerpentGameCanvas canv, Maze m, Position initPos, int len) {
gameCanvas=canv;
maze=m;
direction=MOVE_LEFT;
body=new Vector();
for( int i=0;i<len;i++ )
body.addElement( new Position());
head=new Position(initPos);
((Position)body.elementAt(0)).setValue(initPos, 0, 1);
for( int i=1;i<body.size();i++ )
((Position)body.elementAt(i)).setValue(initPos, 0, 2);
// egg=new Egg(canv, this);
bLive=true;
bPause=false;
type=PLAYER;
invalidAreas=new Vector();
}
public void newEgg() {
egg=new Egg(gameCanvas, this);
egg.start();
}
public void killImmatureEgg() {
if( egg==null || !egg.bLive ) return;
if( egg.stage==Egg.PRE_BORN ) {
egg.getKilled();
newEgg();
}
}
public void changeMap(Maze m, Position initPos) {
maze=m;
if( !bLive ) return;
bPause=true;
direction=MOVE_LEFT;
head.setValue(initPos);
((Position)body.elementAt(0)).setValue(initPos, 0, 1);
for( int i=1;i<body.size();i++ )
((Position)body.elementAt(i)).setValue(initPos, 0, 2);
bPause=false;
}
public void setDirection(int d)
{
direction=d;
}
public String getDirection()
{
switch(direction) {
case MOVE_UP: return "UP";
case MOVE_DOWN: return "DOWN";
case MOVE_LEFT: return "LEFT";
case MOVE_RIGHT: return "RIGHT";
default: return "???";
}
}
public int hitTest(Position pos)
{
// -1: head, -2: no-hit, 0-4: body
if( pos.equals(head))
return -1;
for( int i=0;i<body.size();i++ ) {
if( pos.equals((Position)body.elementAt(i)))
return i;
}
return -2;
}
public void hurtBody(int hurtSegment)
{
int len=body.size();
for( int i=hurtSegment;i<len;i++ ) {
body.removeElementAt(hurtSegment);
}
if(body.size()==0) getKilled();
killImmatureEgg();
}
public void getKilled()
{
bLive=false;
// System.err.println("serpent dies");
}
public String toString()
{
String s=new String();
s=head + "-";
for( int i=0;i<body.size();i++ ) {
s+=body.elementAt(i)+" ";
}
return s;
}
public void run()
{
// will not be used by subclass: GreedySerpent
int track=0;
try {
track=-1;
// egg.start();
if( gameCanvas.eggp == null )
newEgg();
do {
track=0;
invalidAreas.removeAllElements();
invalidateSerpent(this);
if( moveAhead()) {
track=1;
invalidateSerpent(this);
detectFrog(); // invalidate when frog eaten
track=8;
detectEgg();
track=2;
detectNpcSerpent(); // invalidate when npc killed or hurt
track=3;
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=4;
}
gameCanvas.repaint(5, 0, 100, 20);
gameCanvas.checkNpcKilled();
track=5;
sleep(300);
while( bPause ) sleep(200);
} while(bLive);
track=6;
gameCanvas.notifyPlayerKilled();
track=7;
}
catch(Exception ex)
{
System.err.println("Serpent error!");
ex.printStackTrace();
System.err.println(track);
System.err.println(gameCanvas.track);
if( this!=gameCanvas.player )
System.err.println("i am not the player!!");
}
}
public void invalidateSerpent(Serpent actor)
{
int i;
invalidAreas.addElement( new Position(head) );
for( i=0;i<actor.body.size();i++ ) {
invalidAreas.addElement( new Position((Position)actor.body.elementAt(i)) );
}
}
protected boolean moveAhead()
{
// will not be used by subclass: GreedySerpent
synchronized(gameCanvas.npc) {
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)) 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);
// System.err.print("head move from ");
// System.err.print(head);
head.add(posDiff);
// System.err.print(" to ");
// System.err.println(head);
}
return true;
}
protected boolean conflictWithWall(Position posDiff)
{
Position nextPos=new Position(head);
nextPos.add(posDiff);
if( nextPos.outOfRange(0,0, Maze.WIDTH-1, Maze.HEIGHT-1 )) return true;
switch(direction) {
case MOVE_UP:
return ( maze.horizontalWalls[head.y-1][head.x]!=0 );
case MOVE_DOWN:
return ( maze.horizontalWalls[head.y][head.x]!=0 );
case MOVE_LEFT:
return ( maze.verticalWalls[head.y][head.x-1]!=0 );
case MOVE_RIGHT:
return ( maze.verticalWalls[head.y][head.x]!=0 );
default:
return true;
}
}
protected void award(int scene)
{
switch(scene) {
case EAT_FROG:
if(body.size()<6) incBodyLength();
break;
case KILL_SERPENT:
if(body.size()<6) incBodyLength();
break;
case EAT_EGG:
if(body.size()<6) incBodyLength();
break;
default:
}
if( type!=PLAYER ) return;
switch(scene) {
case EAT_FROG:
gameCanvas.score+=50;
break;
case KILL_SERPENT:
gameCanvas.score+=100;
break;
case EAT_EGG:
gameCanvas.score+=50;
break;
case HURT_SERPENT:
gameCanvas.score+=10;
break;
case NEW_LIFE:
gameCanvas.score+=200;
break;
case NEXT_STAGE:
gameCanvas.score+=200;
break;
default:
}
}
protected void incBodyLength()
{
body.addElement(new Position((Position)body.elementAt(body.size()-1)));
}
protected void detectFrog()
{
if( head.equals(gameCanvas.frog.pos)) {
invalidAreas.addElement(gameCanvas.frog.pos);
gameCanvas.frog.getKilled();
award(EAT_FROG);
gameCanvas.notifyFrogEaten();
}
}
protected void detectEgg()
{
synchronized(gameCanvas.eggList) {
for( int i=0;i<gameCanvas.eggList.size();i++ ) {
Egg egg=(Egg)gameCanvas.eggList.elementAt(i);
if( head.equals(egg.pos)) {
invalidAreas.addElement(egg.pos);
egg.getKilled();
award(EAT_EGG);
}
}
// a little confusing
for( int i=0;i<gameCanvas.eggList.size();i++ ) {
Egg egg=(Egg)gameCanvas.eggList.elementAt(i);
if( !egg.bLive ) {
// System.err.println("remove egg by player "+egg.pos);
gameCanvas.eggList.removeElementAt(i);
i--;
// System.err.print("remain eggs ");
// for( int j=0;j<gameCanvas.eggList.size();j++ )
// System.err.print(((Egg)gameCanvas.eggList.elementAt(j)).pos);
// System.err.println();
}
}
}
}
protected void detectNpcSerpent()
{
synchronized(gameCanvas.npc) {
if( !bLive ) return;
bDetecting=true;
Vector enemy=gameCanvas.npc;
int result;
for( int i=0;i<enemy.size();i++ ) {
if( !((Serpent)enemy.elementAt(i)).bLive ) continue;
result=( ((Serpent)enemy.elementAt(i)).hitTest(head));
if( result==-2 ) continue;
if( result==-1 ) {
invalidateSerpent(((Serpent)enemy.elementAt(i)));
if( body.size()>((Serpent)enemy.elementAt(i)).body.size()) {
((Serpent)enemy.elementAt(i)).getKilled();
award(KILL_SERPENT);
}
else {
getKilled();
((Serpent)enemy.elementAt(i)).award(KILL_SERPENT);
}
invalidateSerpent(((Serpent)enemy.elementAt(i)));
}
else {
invalidateSerpent(((Serpent)enemy.elementAt(i)));
award(HURT_SERPENT);
((Serpent)enemy.elementAt(i)).hurtBody(result);
invalidateSerpent(((Serpent)enemy.elementAt(i)));
}
}
bDetecting=false;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -