使用Java中面向对象的思想来实现两个人的一场战斗
題目介紹:英雄的屬性有:姓名,攻擊力,血量,暴擊率(暴擊2倍傷害)。?具體實(shí)現(xiàn)時屬性的數(shù)值自定義。
要求:輸出整個戰(zhàn)斗過程信息并且輸出最終的戰(zhàn)斗結(jié)果。
1、難點(diǎn):要使用面向?qū)ο蟮乃枷肴?shí)現(xiàn)即要去定義類?那么需要定義幾個類?類中需要有哪些要用到的方法?這些方法又如何實(shí)現(xiàn)?
解決:分析問題。
????????實(shí)現(xiàn)兩個人的戰(zhàn)斗,而這兩個人都有著一樣的屬性,這就代表著只需要定義一個類player,然后創(chuàng)建兩個不同的對象(p1和p2),然后【通過對象調(diào)用其他的屬性和方法實(shí)現(xiàn)戰(zhàn)斗】。確定需要一個類后,類中要有屬性和方法。屬性自然就是題中要求的哪些屬性了:姓名name 、攻擊力(考慮到攻擊力可以是一個范圍,所以本文采用了 最小攻擊力min_aggr和最大攻擊力max_aggr)、血量bv、暴擊率crit。接著考慮需要哪些方法:1、類中為了方便賦值,需要寫構(gòu)造方法public player(){/**/},這里就不做多的描述。2、戰(zhàn)斗肯定有誰攻擊誰,因此需要攻擊的方法,又因?yàn)槟撤桨l(fā)起攻擊,勢必會對另一方的血量造成傷害,因此就需要在此方法的形參列表中加入?,即攻擊方法aggr_first(player p){}? 3、還有其他的一些方法:隨機(jī)返回攻擊值aggr(){}、打印對象中的屬性的值show(){}、以及返回是否產(chǎn)生暴擊isCriHit(){}等較為簡單,就不過多描述。
PS:對Math.random()方法不了解的可以看看這個,有簡單的介紹(或者可以上網(wǎng)搜,方法蠻簡單的):
https://blog.csdn.net/yyn09465/article/details/125954097?spm=1001.2014.3001.5501
2、難點(diǎn):攻擊方法aggr_first()具體怎么實(shí)現(xiàn)?
解決:代碼中有詳細(xì)解釋,請下滑參考代碼實(shí)現(xiàn)。(不懂可以在評論區(qū)留下疑問喲~)
全部代碼是在eclipse上用Java實(shí)現(xiàn)的,如下:
package yn; //包名,自己定義//使用面向?qū)ο蟮乃枷雽?shí)現(xiàn)兩個人的一場戰(zhàn)斗。 public class Fight {public static void main(String[] args) {player p1 = new player("【玩家1】",20,40,150,0.7); //創(chuàng)建對象player p2 = new player("【玩家2】",30,60,150,0.3); //創(chuàng)建對象 System.out.println("戰(zhàn)斗雙方基本情況:");p1.show(); //通過show()來展示雙方的屬性p2.show();// --分隔每次戰(zhàn)斗過程System.out.println("---------------------------------------------------------------------------");//戰(zhàn)斗過程//雙方戰(zhàn)斗直到某一方的血量小于0時,跳出循環(huán)while(p1.bv>0 && p2.bv>0){String name = WhoAggr(p1.name,p2.name);if(name.equals(p1.name)){ //玩家1發(fā)起進(jìn)攻p1.aggr_first(p2);}else{ //玩家2發(fā)起進(jìn)攻p2.aggr_first(p1); }}//判斷誰贏誰輸if(p1.bv>0) System.out.println("恭喜"+ p1.name + "獲勝!");elseSystem.out.println("恭喜" + p2.name + "獲勝!");} //誰攻擊 Math.random()返回0-1的值,為了確保雙方攻擊的概率是相等的,所以應(yīng)使得Math.random()<0.5即可public static String WhoAggr(String name,String name1){return Math.random()<0.5? name:name1;} }//定義類 class player{String name; //玩家姓名int min_aggr; //最小攻擊值int max_aggr; //最大攻擊值int bv; //血量double crit; //暴擊率//帶參構(gòu)造方法public player(String name0,int min_aggr0,int max_aggr0,int bv0,double crit0){name = name0;min_aggr = min_aggr0;max_aggr = max_aggr0;bv = bv0;crit = crit0;}//無參構(gòu)造方法public player(){}/*具體實(shí)現(xiàn):只考慮單次攻擊。注意不能改變基礎(chǔ)攻擊值先判斷是否產(chǎn)生暴擊,然后計算被攻擊方的剩余血量*///A攻擊B void aggr_first(player p){ //形參里引入了被攻擊方對象pSystem.out.println("本輪"+name+"率先發(fā)起進(jìn)攻!");int aggr0 = aggr(); //調(diào)用aggr()方法返回范圍內(nèi)的攻擊值if(isCriHit()){ //產(chǎn)生暴擊System.out.println( "本輪產(chǎn)生暴擊!"+name+"攻擊值為:"+ aggr0*2 );p.bv = p.bv - aggr0*2; //求被攻擊方的剩余血量}else{ //未產(chǎn)生暴擊System.out.println( "本輪未產(chǎn)生暴擊。"+name+"攻擊值為:"+ aggr0 );p.bv = p.bv - aggr0; //求被攻擊方的剩余血量}if(p.bv <0) //如果某方的血量小于0,就讓他等于0。確保剩余血量>=0p.bv=0;show_bv(); //顯示攻擊方剩余血量p.show_bv(); //顯示被攻擊方剩余血量System.out.println("---------------------------------------------------------------------------");}//返回攻擊值int aggr(){return (int)(Math.random()*(max_aggr-min_aggr)+min_aggr);}//返回是否暴擊 boolean isCriHit(){return Math.random()<crit? true:false; //返回TRUE產(chǎn)生暴擊 返回FALSE未產(chǎn)生暴擊}//打印對象中屬性的值void show(){System.out.println(name + ":\t\t攻擊力范圍:"+min_aggr + "-" + max_aggr +"\t\t初始血量:"+bv+"\t\t暴擊率:"+crit);}//打印剩余血量void show_bv(){System.out.println(name + "\t\t剩余血量:" + bv);} }?代碼運(yùn)行結(jié)果:
有問題歡迎在討論區(qū)一起討論呀~?
總結(jié)
以上是生活随笔為你收集整理的使用Java中面向对象的思想来实现两个人的一场战斗的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 四线电阻屏
- 下一篇: 迭代器 java_面试必备(含答案):3