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

📄 battle.java

📁 < 仙剑奇侠传>>的J2ME手机游戏源代码
💻 JAVA
字号:
import java.util.Random;
import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;

/**
 * @游戏名称: 仙剑奇侠传
 * @作者:张卫国
 * @Email: weiguo2000@hotmail.com
 * @创建于:2006/7/18--2006/8/3  by Weiguo			
 */
//战斗类
public class Battle{	
	private int 		selecten,select,selectMagic;	
	private final int 	MAIN 	  = 0,
					  	ENEMYMENU = 1,
					  	MAGIC 	  = 2;
	private int 		onMenu    = 0;	
	private XianJianCanvas gameCanvas = null;
	private Character 	hero  = null;
	private Animal[]   	eny   = null;	
	
	private int 		x = 140,y = 120;	
	private int 		attackType;	
	private boolean 	bMagic;
	public boolean 		isEnd,fail;	
	public int 			endi,faili;	
	private boolean 	isDecrease;	
	private int 		upDecreaseHP;	
	private int 		jianDire;
	private Random 		rand = null;	
	
	public Battle(XianJianCanvas canvas,Character hero){
		this.gameCanvas = canvas;
		this.hero  = hero;
		
		//round.start();
	}
	
	public void init(){
		this.isEnd = false;
		
		this.fail  = false;		
		this.endi  = 1;
		this.faili = 1;
		this.bMagic = false;
		this.isDecrease   = false;
		this.attackType   = 0;		
		this.upDecreaseHP = 0;		
		this.jianDire 	  = 0;
		this.select   	  = 0;
		this.selecten 	  = 0;
		this.selectMagic  = 0;
		eny    = new Animal[3];
		eny[0] = new Animal(0);
		eny[0].setPosition(20,80);
		eny[1] = new Animal(0);
		eny[1].setPosition(50,60);
		eny[2] = new Animal(0);
		eny[2].setPosition(80,40);
		
		rand   = new Random();
	}
		
	public void select(){
		switch(onMenu){
				case MAIN:
					switch(select){
					case 0:
						onMenu=ENEMYMENU;	//进入选择敌人界面				
						break;
					case 1:
						onMenu=MAGIC;		//进入选择技能界面
						break;
					case 2:
						fail=true;			//逃跑
						gameCanvas.bAttle = false;
						break;
					}
					break;
				case ENEMYMENU:					
					attackType=1;
					break;
				case MAGIC:	
					if(hero.magicList!=null){
						switch(selectMagic){
						case 0:
							if(hero.MP>5){
								attackType=2;
								hero.MP -= 5;
							}
							break;
						case 1:
							if(hero.MP>3){
								attackType=3;
								hero.MP -= 3;
							}
							break;
						case 2:
							attackType=4;
							break;
						}					
						break;
					}
					break;
				}	
	}
	public void up(){
		switch(onMenu){
		case MAIN:
			select--;
			if(select<0){
				select=2;
			}
			break;
		case ENEMYMENU:
			selecten++;
			if(selecten>2){
				selecten=0;
			}
			while(eny[selecten]==null){
				selecten++;
				if(selecten>2){
					selecten=0;
				}
			}					
			break;
		case MAGIC:
			if(hero.magicList!=null){
				if(selectMagic<0){
					selectMagic=0;
				}
				selectMagic--;
				if(selectMagic>0){
					selectMagic=0;
				}
			}					
			break;
		}	
	}
	
	public void down(){
		switch(onMenu){
		case MAIN:
			select++;
			if(select>2){
				select=0;
			}
			break;
		case ENEMYMENU:
			selecten--;
			if(selecten<0){
				selecten=2;
			}
			while(eny[selecten]==null){
				selecten--;
				if(selecten<0){
					selecten=2;
				}
			}				
			break;
		case MAGIC:
			if(hero.magicList!=null){
				if(selectMagic>hero.magicList.length-1){
					selectMagic=hero.magicList.length-1;
				}
				selectMagic++;
				if(selectMagic>hero.magicList.length-1){
					selectMagic=hero.magicList.length-1;
				}
			}					
			break;
		}		
	}
	
	public void back(){
		switch(onMenu){
		case ENEMYMENU:
		case MAGIC:				
			onMenu=MAIN;
			break;
		}
	}

	public void paint(Graphics g) {			
		g.fillRect(0,0,180,196);
		int k1=0;
		  for(int j1 = -12; j1 < 200 + 24; j1 += 12)
	      {
	          for(int i1 = ((-k1 % 2) * 48) / 2; i1 < 176 + 48; i1 += 48)	              
	                  g.drawImage(XianJianImage.image[56], i1, j1, 0);
	          k1++;
	      }			
		g.drawImage(XianJianImage.imgPlayerl[0],x,y,Graphics.TOP|Graphics.LEFT);
		
		for(int i=0;i<eny.length;i++){
			if(eny[i]!=null){
				eny[i].draw(8,8,g);
			}
		}
		
		if(isDecrease)
		{
			g.setColor(0xff0000);
			g.setFont(Font.getFont(Font.FACE_SYSTEM,Font.STYLE_BOLD,Font.SIZE_LARGE));
			if(attackType==-1){
				if(hero.DecreaseHP>0){
					g.drawString(""+hero.DecreaseHP,140,115+upDecreaseHP-10,Graphics.HCENTER|Graphics.TOP);
				}
			}
			else{
				for(int i=0;i<3;i++){
					if(eny[i]!=null){
						if(eny[i].DecreaseHP>0){
							g.drawString(""+eny[i].DecreaseHP,eny[i].x,eny[i].y+upDecreaseHP-10,Graphics.HCENTER|Graphics.TOP);
						}
					}
				}	
			}			
		}
		if(onMenu==MAIN){
			g.setColor(0x2d2d40);
			g.fillRoundRect(10,150,40,44,5,5);
			g.fillRoundRect(52,150,116,44,5,5);
			
			g.setColor(0xffff00);
			g.drawRoundRect(10,150,40,44,5,5);
			g.drawRoundRect(52,150,116,44,5,5);
			
			g.drawString("攻击",20,150,0);
			g.drawString("法术",20,165,0);
			g.drawString("逃跑",20,180,0);			
			
			g.drawString("李逍遥",55,150,0);
			g.drawString("体力: "+hero.HP+"/"+hero.MaxHP,100,150,0);
			g.drawString("真气: "+hero.MP+"/"+hero.MaxMP,100,165,0);
			
			g.fillTriangle(12,150+select*15,12,165+select*15,20,158+select*15);
		}
		if(onMenu==ENEMYMENU&&attackType==0){
			g.setColor(0xff0000);
			g.drawRoundRect(eny[selecten].x-3,eny[selecten].y-3,35,35,5,5);
			g.setColor(0x000000);
			g.fillRect(0, 196-20, 180, 196);
			g.setColor(0xffffff);
			g.setFont(Font.getFont(Font.FACE_SYSTEM,Font.STYLE_PLAIN,Font.SIZE_LARGE));
			g.drawString("返回",180,196,Graphics.RIGHT|Graphics.BOTTOM);			
		}
		if(onMenu==MAGIC&&attackType==0){
			g.setColor(0x734708);
			g.fillRoundRect(60,70,60,90,8,8);			
			g.setColor(0xffff00);
			g.drawRoundRect(60,70,60,90,8,8);
			
			g.setFont(Font.getFont(Font.FACE_SYSTEM,Font.STYLE_PLAIN,Font.SIZE_LARGE));
			g.setColor(0xffffff);
			if(hero.magicList!=null){
				for(int i=0;i<hero.magicList.length;i++){
					g.drawString(hero.magicList[i],70,75+i*15,Graphics.LEFT|Graphics.TOP);
				}
				g.setColor(0xffff00);
				g.drawString(hero.magicList[selectMagic],70,75+selectMagic*15,Graphics.LEFT|Graphics.TOP);
			}
			else{
				g.drawString("无法术",70,75,Graphics.LEFT|Graphics.TOP);
			}
			g.setColor(0x000000);
			g.fillRect(0, 196-20, 180, 196);
			g.setColor(0xffffff);
			g.setFont(Font.getFont(Font.FACE_SYSTEM,Font.STYLE_PLAIN,Font.SIZE_LARGE));
			g.drawString("返回",180,196,Graphics.RIGHT|Graphics.BOTTOM);
			
		}
		if(bMagic){
			drawMagic(g);
		}		
		drawFail(g);
		//drawEnd(g);
	}
	
	public void movePlayer(){
		switch(selecten){
		case 0:
			x-=24;
			y-=8;
			break;
		case 1:
			x-=18;
			y-=12;
			break;
		case 2:
			x-=12;
			y-=16;
			break;
		}
		gameCanvas.repaint();
		gameCanvas.serviceRepaints();
		try {
			Thread.sleep(60);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}		
	}
	public void movebackPlayer(){
		switch(selecten){
		case 0:
			x+=24;
			y+=8;
			break;
		case 1:
			x+=18;
			y+=12;
			break;
		case 2:
			x+=12;
			y+=16;
			break;
		}
		gameCanvas.repaint();
		gameCanvas.serviceRepaints();
		try {
			Thread.sleep(60);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}	
	}
	
	public void moveEnemy(int num){
		switch(num){
		case 0:
			eny[0].x+=24;
			eny[0].y+=8;
			break;
		case 1:
			eny[1].x+=18;
			eny[1].y+=12;
			break;
		case 2:
			eny[2].x+=12;
			eny[2].y+=16;
			break;
		}
		gameCanvas.repaint();
		gameCanvas.serviceRepaints();
		try {
			Thread.sleep(60);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}		
	}
	public void moveBackEnemy(int num){
		switch(num){
		case 0:
			eny[0].x-=24;
			eny[0].y-=8;
			break;
		case 1:
			eny[1].x-=18;
			eny[1].y-=12;
			break;
		case 2:
			eny[2].x-=12;
			eny[2].y-=16;
			break;
		}
		gameCanvas.repaint();
		gameCanvas.serviceRepaints();
		try {
			Thread.sleep(60);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}	
	}

	public boolean getFail(){
		return fail;
	}
	
	public void drawFail(Graphics g){
		if(fail){
			g.setColor(0x734708);
			g.fillRoundRect(10,70,150,50,5,5);			
			g.setColor(0xffff00);
			g.drawRoundRect(10,70,150,50,5,5);
			g.setColor(0xffffff);
			switch(faili)
	        {
	        case 0: 
	        default:
	            break;	
	        case 1: 
	        	g.setColor(0xff0000);
	        	g.setFont(Font.getFont(Font.FACE_SYSTEM,Font.STYLE_PLAIN,Font.SIZE_LARGE));
	        	g.drawString("战斗失败 重新开始游戏",90,80,Graphics.TOP|Graphics.HCENTER);	        
	            break;	
	        case 2: 	        	
	        	XianJianLet.dis.setCurrent(new MenuCanvas());
	        	break;
	        }
		}
	}

	public void isEnd(){
		int i=0;
		for(;i<3;i++){
			if(eny[i]!=null){
				break;
			}						
		}
		if(i==3){
			gameCanvas.bAttle = false;
			isEnd=true;	
			//gameCanvas.repaint();			
		}
	}
	
	public void drawEnd(Graphics g)
    {   
		if(isEnd){			
			g.setColor(0x2d2d40);
			g.fillRoundRect(0,70,179,50,8,8);			
			g.setColor(0x1e2d64);
			g.drawRoundRect(0,70,179,50,8,8);
			g.drawImage(XianJianImage.kuang,0,70,Graphics.LEFT|Graphics.TOP);
			g.setColor(0xffffff);
	        switch(endi)
	        {
	        case 0: 
	        default:
	            break;	
	        case 1: 	            
	            g.drawString("战斗胜利 每人获得5经验值",20,90,Graphics.TOP|Graphics.LEFT);
	            hero.Exp+=5;
	            if(hero.Exp>hero.MaxExp){
	            	hero.Exp=hero.Exp-hero.MaxExp;
	            	hero.levelUp();	            	
	            }
	            break;	
	        case 2: 	            
	        	g.drawString("获得金钱: 6",20,90,Graphics.TOP|Graphics.LEFT);
	        	hero.money+=6;
	            break;
	        case 3:	        	
	            String s1 = " 获得物品:";
	            int ran=new Random().nextInt(10);
	            if(ran>6){	            	
	            	Item goods=new Item(1001);
	            	s1 = s1 +goods.getName()+ "  ";
	            	hero.addGoods(goods);
	            	
	            }
	            else if(ran>3&&ran<=6){	            	
	            	Item goods=new Item(1002);
	            	s1 = s1 +goods.getName() + "  ";
	            	hero.addGoods(goods);
	            	
	            }	            	
	            else{
	                s1 = s1 + "无";
	            }
	            g.drawString(s1,20,90,Graphics.TOP|Graphics.LEFT);
	        	break;
	       case 4:	   
	    	    onMenu=MAIN;
	        	gameCanvas.bAttle = false;	        	
	        	gameCanvas.repaint();
	        	break;	
	        }
		}
    }
	
	public void drawMagic(Graphics g){
		if(attackType==2){
			g.drawImage(XianJianImage.jian,50-10*jianDire,10*jianDire,Graphics.HCENTER|Graphics.TOP);
			g.drawImage(XianJianImage.jian,100-10*jianDire,30+10*jianDire,Graphics.HCENTER|Graphics.TOP);
			g.drawImage(XianJianImage.jian,150-10*jianDire,10*jianDire,Graphics.HCENTER|Graphics.TOP);
		}
		if(attackType==3){
			g.drawImage(XianJianImage.jian,80-10*jianDire,40+10*jianDire,Graphics.HCENTER|Graphics.TOP);
		}
	}
	
	public void playerAttack(int aType){
		switch(aType){
		case 0:
			break;
		case 1:
			for(int i=0;i<4;i++){
				movePlayer();
			}
			if(!hero.bDead){
				hero.DecreaseHP = 0;
			}
			for(int i=0;i<3;i++){
				if(eny[i]!=null){
					eny[i].DecreaseHP = 0;
				}
			}	
			eny[selecten].DecreaseHP=(hero.wu-eny[selecten].defend)+(rand.nextInt(6));
			isDecrease=true;						
			upDecreaseHP = 0;					
			for(int i=0;i<4;i++){						
				movebackPlayer();
				upDecreaseHP-=3;
			}						
			isDecrease=false;						
			eny[selecten].ehp-=eny[selecten].DecreaseHP;
			eny[selecten].DecreaseHP=0;
			if(eny[selecten].ehp<0){
				eny[selecten].bDead=true;
				eny[selecten]=null;
			}
			break;
		case 2:
			if(!hero.bDead){
				hero.DecreaseHP = 0;
			}
			
			for(int i=0;i<3;i++){
				if(eny[i]!=null){								
					eny[i].DecreaseHP = (hero.ling-eny[i].magicDefend)+(rand.nextInt(6));
				}
			}
			
			bMagic=true;
			for(int i=0;i<4;i++){
				jianDire++;
				gameCanvas.repaint();
				gameCanvas.serviceRepaints();
				try {
					Thread.sleep(60);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			bMagic=false;
			jianDire=0;
			isDecrease=true;
			upDecreaseHP = 0;	
			for(int i=0;i<4;i++){
				upDecreaseHP-=3;
				gameCanvas.repaint();
				gameCanvas.serviceRepaints();
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}						
			isDecrease=false;
			for(int i=0;i<3;i++){
				if(eny[i]!=null){
					eny[i].ehp-=eny[i].DecreaseHP;
					eny[i].DecreaseHP=0;
					if(eny[i].ehp<0){
						eny[i].bDead=true;
						eny[i]=null;
					}	
				}
			}
			break;
		case 3:
			if(!hero.bDead){
				hero.DecreaseHP = 0;
			}						
			for(int i=0;i<3;i++){
				if(eny[i]!=null){								
					eny[i].DecreaseHP = (hero.ling-eny[i].magicDefend)/2+(rand.nextInt(6));
				}
			}
			bMagic=true;
			for(int i=0;i<4;i++){
				jianDire++;
				gameCanvas.repaint();
				gameCanvas.serviceRepaints();
				try {
					Thread.sleep(60);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			bMagic=false;
			jianDire=0;
			isDecrease=true;
			upDecreaseHP = 0;	
			for(int i=0;i<4;i++){
				upDecreaseHP-=3;
				gameCanvas.repaint();
				gameCanvas.serviceRepaints();
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			
			isDecrease=false;
			for(int i=0;i<3;i++){
				if(eny[i]!=null){
					eny[i].ehp-=eny[i].DecreaseHP;
					if(eny[i].ehp<0){
						eny[i].bDead=true;
						eny[i]=null;
					}	
				}
			}
			break;
		default:
			break;
		}
	}
	
	public void enemyAttack(){
		for(int j=0;j<3;j++){
			if(eny[j]!=null){
				for(int i=0;i<4;i++){
					moveEnemy(j);
				}						
				hero.DecreaseHP=(eny[j].eattack-hero.ti)+rand.nextInt(3);
				if(hero.DecreaseHP<=0){
					hero.DecreaseHP=1;
				}
				isDecrease=true;
				upDecreaseHP = 0;	
				for(int i=0;i<4;i++){
					moveBackEnemy(j);
					upDecreaseHP-=3;
				}
				isDecrease=false;
				hero.HP-=hero.DecreaseHP;
				hero.DecreaseHP=0;
				if(hero.HP<0){
					fail=true;
					break;
				}					
			}
		}			
	}
	
	public void start(){
		if(attackType!=0&&!isEnd){
			playerAttack(attackType);					
			
			attackType=-1;
			
			enemyAttack();
					
			isEnd();
			
			attackType=0;					
			onMenu=MAIN;
			while(eny[selecten]==null){
				selecten++;
				if(selecten>2){
					selecten=0;
				}
			}
			
				
			gameCanvas.repaint();
			gameCanvas.serviceRepaints();
			try {
				Thread.sleep(80);
			} catch (InterruptedException e) {					
				e.printStackTrace();
			}
		}		
	}
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -