游戏中的九宫格算法

模仿 神仙道 九宫格模式写的 战斗算法,分为3个类,武将类代码如下:

package duizhan;

public class WuJiangBean {
	    private int gongji;//武将攻击力  
	    private int fangyu;//武将防御力  
	    private int hp;//武将HP
	    private String name;//武将名称  
	    private boolean isHandelNow=true;//true 攻击方,false 被打方
	    private boolean isDead=false;//true 为死亡,false 未死亡
	    
	    //武将属性设置 (A队)  
	    public WuJiangBean A_WuJiang(String name,int fangyu,int gongji,int hp){  
	         //设置武将选中位置的属性值  
             WuJiangBean WuJiangBean=new WuJiangBean(); 
             WuJiangBean.setFangyu(fangyu);  
             WuJiangBean.setGongji(gongji);  
             WuJiangBean.setHp(hp);  
             WuJiangBean.setName("A队的: "+name);  
	         return WuJiangBean;  
	    }  
	    //BOSS属性设置 (B队) 
	    public WuJiangBean B_WuJiang(String name,int fangyu,int gongji,int hp){  
	        //设置武将选中位置的属性值  
             WuJiangBean WuJiangBean=new WuJiangBean();  
             WuJiangBean.setFangyu(fangyu);  
             WuJiangBean.setGongji(gongji);  
             WuJiangBean.setHp(hp);  
             WuJiangBean.setName("B队的: "+name);  
	         return WuJiangBean;   
	    } 
	    
	    
		public int getGongji() {
			return gongji;
		}
		public void setGongji(int gongji) {
			this.gongji = gongji;
		}
		public int getFangyu() {
			return fangyu;
		}
		public void setFangyu(int fangyu) {
			this.fangyu = fangyu;
		}
		public int getHp() {
			return hp;
		}
		public void setHp(int hp) {
			this.hp = hp;
		}
		public String getName() {
			return name;
		}
		public void setName(String name) {
			this.name = name;
		}
		
		public boolean isHandelNow() {
			return isHandelNow;
		}
		public void setHandelNow(boolean isHandelNow) {
			this.isHandelNow = isHandelNow;
		}
		public boolean isDead() {
			return isDead;
		}
		public void setDead(boolean isDead) {
			this.isDead = isDead;
		} 
		
	

}

 下一个类战斗具体算法类,代码如下:

package duizhan;

import java.util.Random;

public class ZhanDou {
	  int count=0; 
	    //打架过程代码  
	    public void zhandou(WuJiangBean a[][],WuJiangBean b[][]){  
	        boolean startFlag=true;//开始进入战斗模式  
	        boolean teamChangeFlag=true;//true为A出手,false为B出手  
	        
	        while(startFlag){//由于未知循环次数,while 循环直至 A或B队伍武将阵亡 
	         //全部出手过了,全部设置成未出手  
	         boolean ishandl=true; 
	         for (int i = 0; i < 3; i++) {  
	               for(int j = 0; j < 3; j++) {  
	                   if(a[i][j] != null && a[i][j].isHandelNow() != true){  
	                        ishandl=false;  
	                    }  
	                    if(b[i][j] != null && b[i][j].isHandelNow()!=true){  
	                        ishandl=false;  
	                    }  
	                }  
	         }
	        if(ishandl){//所有人初始化未出手                   
	                for(int i = 0; i < 3; i++){  
	                    for (int j = 0; j < 3; j++){  
	                        if(a[i][j]!=null){  
	                          a[i][j].setHandelNow(true);  
	                        }  
	                       if(b[i][j]!=null){  
	                          b[i][j].setHandelNow(true);  
	                      }     
	                   }  
	                }  
	        } 
	        int row=0;//行变量  
	        WuJiangBean beiDa=null;//被攻击  
	        WuJiangBean jinGong=null;//进攻者  
	        if(teamChangeFlag){//true为A攻击,false为B攻击
	        for (int i = 0; i <= 2; i++) {   
	               for (int j = 2; j >= 0; j--) {  
	                    if(a[j][i]!=null && a[j][i].isHandelNow() && a[j][i].getHp()>0){  
	                        jinGong=a[j][i];  
	                        row=j;//判断是第几行对战  
	                    }  
	                } 
	               
	         } 
	         boolean currentBoolean=false;
	         for (int i = row; i < 3 && i > -1;){   
	                    for (int j = 2; j < 3 && j > -1; j--) {  
	                        if(b[i][j] != null && b[i][j].getHp()>0){  
	                            beiDa=b[i][j]; 
	                            currentBoolean=true;
	                        }  
	                    }
	                    
	                    if(currentBoolean){//说明对应行存在武将 
	                    	break;  
	                    } 
	                    
	                    if(row!=0){  
	                        i--;  
	                    }else{  
	                        i++;  
	                    }     
	                    if(i==-1){  
	                        i=2;  
	                   }     
	         }  
	        }else{//b队转为进攻方 a队改为被打方 
	        	int rowB=0;
	        	 //boolean flag=false;
		            for (int i = 2; i >= 0; i--) {   
			               for (int j = 2; j >= 0; j--) {  
			                    if(b[j][i]!=null && b[j][i].isHandelNow() && b[j][i].getHp()>0){  
			                        jinGong=b[j][i];  
			                        rowB=j;//判断是第几行对战  
			                    }  
			                } 
			               
			         } 
		             boolean isCunZai=false;
		             for (int i = rowB; i < 3 && i > -1;){   
		                    for (int j = 0; j < 3 && j > -1; j++) {  
		                        if(a[i][j] != null && a[i][j].getHp()>0){  
		                            beiDa=a[i][j];
		                            isCunZai=true;
		                        }  
		                    }  
		                    if(isCunZai){  
		                        break;  
		                    }     
		                    if(rowB!=0){  
		                        i--;  
		                    }else{  
		                        i++;  
		                    }     
		                    if(i==-1){  
		                        i=2;  
		                    }     
		             }  
	         }  
	        this.shuChu(jinGong, beiDa);   
	        if(teamChangeFlag){//交换攻击对象  
	            teamChangeFlag=false;  
	        }else{  
	            teamChangeFlag=true;  
	            this.setInitValue(a,b);//判断是否进行一次对打结束
	        }
	        
	        boolean a_DeadFlag = this.isDeadNot(a);
	        if(a_DeadFlag){
	        	System.out.println("A队输");
	        	break;
	        }
	        boolean b_DeadFlag = this.isDeadNot(b);
	        if(b_DeadFlag){
	        	System.out.println("B队输");
	        	break;
	        }
	        
	        
	    }
	        
	 }
	//判断武将队伍是否全部死亡    
	public boolean isDeadNot(WuJiangBean dead[][]){
		 int noDeadCount=0;//武将活着的人数
		 boolean deadFlag=false;
		 
		 for (int i = 0; i < 3; i++){  
             for(int j = 0; j < 3; j++){  
           	   if(dead[i][j] != null ){
           		  if(dead[i][j].isDead() == false){//武将活着
           			   noDeadCount = noDeadCount+1;//统计活着的武将人数
           	      }
                }  
             }
	     } 
		 if(noDeadCount > 0){//部分武将还活着
			 deadFlag=false;//武将未死
		 }else{
			 deadFlag=true;//武将全部阵亡
			 
		 }
		 return deadFlag;
	}
	//初始对打标志    
	public  void setInitValue(WuJiangBean a[][],WuJiangBean b[][]){
		  
		  boolean a_Flag=false;
		  boolean b_Flag=false;
		  for (int i = 0; i < 3; i++) {  
              for(int j = 0; j < 3; j++){  
            	  if(a[i][j] != null ){//非空 未死亡的对象
            		  if(a[i][j].isDead() == false){//武将还活着的情况下
	            		  if(a[i][j].isHandelNow() == false){  
	            			  a_Flag=true;
	            		  }else{
	            			  a_Flag = false;
	            		  } 
            		  }
            	   }
            	  if(b[i][j] != null){
            		  if(b[i][j].isDead() == false){//武将还活着的情况下
            			  if( b[i][j].isHandelNow() == false ){  
            				  b_Flag=true;  
            			  }else{
            				  b_Flag = false;
            			  }    
            			  
            		  }
            	  }
               }  
          }
		  if(a_Flag ==true && b_Flag == true){// 所有对打进行一遍后,初始对打标志
			  count+=1;
			  System.out.println("已经打完了 "+count+ "回合");
			  
			  for(int i = 0; i < 3; i++){  
                  for (int j = 0; j < 3; j++){  
                      if(a[i][j]!=null && a[i][j].isHandelNow() == false){  
                        a[i][j].setHandelNow(true);  
                      }  
                      if(b[i][j]!=null && b[i][j].isHandelNow() == false){  
                    	  b[i][j].setHandelNow(true);  
                      }     
                 }  
              }  
		  }
	}    
    public void shuChu(WuJiangBean jinGong,WuJiangBean beiDa){  
         int hp=0;//掉血数  
         int leftHp=0;//剩余Hp数  
         Random r=new Random();  
         if(jinGong != null && beiDa != null && jinGong.getGongji()-beiDa.getFangyu()>0){  
                hp=jinGong.getGongji()-beiDa.getFangyu()+r.nextInt(20)+1;//掉血数 
                leftHp=beiDa.getHp()-hp;//当前剩余血数 
                System.out.println(jinGong.getName()+" 攻击 "+beiDa.getName()+" "+beiDa.getName()+" 损失"+hp+"点体力");  
                //jinGong.setIshander(false);
         }else{//(如果攻击力-防御力为负值时公式变为:0+(1到20)).  
                hp=r.nextInt(20)+1;  
                if(beiDa != null && jinGong != null){  
                leftHp=beiDa.getHp()-hp;//当前剩余血数 
                System.out.println(jinGong.getName()+" 攻击 "+beiDa.getName()+" "+beiDa.getName()+" 损失"+hp+"点体力");  
            }  
                       
         }
         if(beiDa != null && jinGong != null){  
	         if(leftHp<=0){
	        	 System.out.println(beiDa.getName()+" 死亡");
	        	 beiDa.setHp(0);
	        	 beiDa.setDead(true);//死亡
	         }else{
	        	 beiDa.setHp(leftHp);
	        	 beiDa.setDead(false);//未死亡
	        	 
	         }
	         jinGong.setHandelNow(false);  
         }     
    }  

}

下一个为将武将存放在二维数组中,这样就可以随意摆放武将的位置,代码如下:
package duizhan;


public class MainZhandou {
	public static void main(String[] args) {
		 //A队B队初始化 定义二维数组
          WuJiangBean[][] a = new WuJiangBean[3][3];//A 队武将  
          WuJiangBean[][] b = new WuJiangBean[3][3];// B 队武将  
          WuJiangBean WuJiangBean=new WuJiangBean();  
         
          //设置武将在布阵中的位置及属性 A队  
          a[0][2]=WuJiangBean.A_WuJiang("上官文静",280,380,300);//设置武将属性 (名字,防御,攻击,hp) 
          a[1][0]=WuJiangBean.A_WuJiang("李四",200,60,320);  
          a[2][2]=WuJiangBean.A_WuJiang("张麻子",200,70,320);  
          //a[1][0]=WuJiangBean.A_WuJiang("李四",200,50,350);  
          //a[2][1]=WuJiangBean.A_WuJiang("王五",200,65,380);  
         
          //设置BOSS位置及属性 B 队
          b[0][1]=WuJiangBean.B_WuJiang("闭月",300,180,400);  
         // b[0][2]=WuJiangBean.B_WuJiang("羞花",460,105,500);  
          b[1][1]=WuJiangBean.B_WuJiang("冷月",420,262,300);  
          b[1][2]=WuJiangBean.B_WuJiang("蛇仙",430,100,300);  
         // b[2][2]=WuJiangBean.B_WuJiang("小灵",520,380,300);
          
          new ZhanDou().zhandou(a, b);//战斗方法  
          

	}
}

 代码难免不足,只求分享! 

猜你喜欢

转载自taoge-tony.iteye.com/blog/1874730