游戏中的九宫格算法
模仿 神仙道 九宮格模式寫的 戰斗算法,分為3個類,武將類代碼如下:
package duizhan;public class WuJiangBean {private int gongji;//武將攻擊力 private int fangyu;//武將防御力 private int hp;//武將HPprivate 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);//戰斗方法 } }?代碼難免不足,只求分享!?
總結
- 上一篇: 【UE4笔记】蓝图联机游戏制作
- 下一篇: uniapp 自写模糊查询