⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serpent.java

📁 Position.java :辅助类 SerpentGameCanvas.java :游戏主控类 Maze.java :迷宫 SerpentGame.java :应用主控类 Serpent.java
💻 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 + -