面向对象OOP
面向对象综合训练
1. 文字版格斗游戏
1.1 基础版
Role.java
package practice.daily.test6;import java.util.Random;public class Role {private String name;private int blood;public Role() {}public Role(String name, int blood) {this.name = name;this.blood = blood;}public void setName(String name) {this.name = name;}public String getName() {return name;}public void setBlood(int blood) {this.blood = blood;}public int getBlood() {return blood;}//定义一个方法用于攻击别人//在RoleTest中://Role r1 = new Role(姓名1,血量1);//Role r2 = new Role(姓名2,血量2);//r1.攻击(r2);//即方法的调用者去攻击参数public void attack(Role role) { //role属于引用数据类型,role用于接收被攻击的人:r1或r2//计算造成的伤害 1~20Random r = new Random();int hurt = r.nextInt(20) + 1;// 计算被攻击者(role)扣除伤害后的剩余血量int remainBlood = role.getBlood() - hurt;//验证剩余血量是否大于0remainBlood = remainBlood > 0 ? remainBlood : 0;//修改被攻击的人的血量role.setBlood(remainBlood);//this表示方法的调用者//role即为参数System.out.println(this.getName() + "举起拳头,打了" + role.getName() + "一下,造成了" +hurt + "点伤害," + role.getName() + "还剩" + remainBlood + "点血");}
}
GameTest.java
package practice.daily.test6;public class RoleTest {public static void main(String[] args) {//创建两个角色Role r1 = new Role("乔峰", 100);//r1为引用数据类型Role r2 = new Role("鸠摩智", 100);//r2为引用数据类型//开始格斗,回合制游戏while (true) {//r1攻击r2r1.attack(r2);//r1,r2均为Role类型//判断r2剩余血量if(r2.getBlood() == 0) {System.out.println(r1.getName() + "KO了" + r2.getName());break;}//r2攻击r1r2.attack(r1);//判断r1剩余血量if(r1.getBlood() == 0) {System.out.println(r2.getName() + "KO了" + r1.getName());break;}}}
}
1.2 优化版
添加多种修饰词,避免单调
添加了性别和长相,根据性别对长相随机赋值
Role.java
package practice.daily.test6;import java.util.Random;public class Role {private String name;private int blood;private String gender;private String face;//长相是随机的String[] boyface = {"风流俊雅", "英俊潇洒", "气宇轩昂", "相貌平平", "一塌糊涂"};String[] girlface = {"沉鱼落雁", "亭亭玉立", "美奂绝伦", "相貌平平", "惨不忍睹"};//attack攻击描述:String[] attack_desc = {"%s使出了一招【背心钉】,转到对方的身后,一掌向%s背心的灵台穴拍去。","%s使出了一招【游空探爪】,飞起身形自半空中变掌为抓锁向%s。","%s大喝一声,身形下伏,一招【劈雷坠地】,捶向%s双腿。","%s运气于掌,一瞬间掌心变得血红,一式【掌心雷】,推向%s。","%s阴手翻起阳手跟进,一招【没遮拦】,结结实实的捶向%s。","%s上步抢身,招中套招,一招【劈挂连环】,连环攻向%s。",};//injured受伤描述:String[] injured_desc = {"结果%s退了半步,毫发无损","结果给%s造成一处瘀伤","结果一击命中,%s痛得弯下腰","结果%s痛苦地闷哼了一声,显然受了点内伤","结果%s摇摇晃晃,一跤摔倒在地","结果%s脸色一下变得惨白,连退了好几步","结果『轰』的一声,%s口中鲜血狂喷而出","结果%s一声惨叫,像滩软泥般塌了下去"};public Role() {}public Role(String name, int blood, String gender) {this.name = name;this.blood = blood;this.gender = gender;//随机长相setFace(gender);}public void setName(String name) {this.name = name;}public String getName() {return name;}public void setBlood(int blood) {this.blood = blood;}public int getBlood() {return blood;}public void setGender(String gender) {this.gender = gender;}public String getGender() {return gender;}public void setFace(String gender) {Random r = new Random();//长相是随机的if (gender == "男") {//从boyface里随机int index = r.nextInt(boyface.length);this.face = boyface[index];} else if (gender == "女") {//从girlface里随机int index = r.nextInt(girlface.length);this.face = girlface[index];} else {this.face = "雌雄难辨";}}public String getFace() {return face;}//展示角色信息public void showRoleInfo() {System.out.println("姓名:" + getName());System.out.println("血量:" + getBlood());System.out.println("性别:" + getGender());System.out.println("长相:" + getFace());}//定义一个方法用于攻击别人//在RoleTest中://Role r1 = new Role(姓名1,血量1);//Role r2 = new Role(姓名2,血量2);//r1.攻击(r2);//即方法的调用者去攻击参数public void attack(Role role) { //role属于引用数据类型,role用于接收被攻击的人:r1或r2Random r = new Random();int index = r.nextInt(attack_desc.length);String KungFu = attack_desc[index];//输出一个攻击效果(this表示方法的调用者,role即为参数)System.out.printf(KungFu, this.getName(), role.getName());System.out.println();//计算造成的伤害 1~20int hurt = r.nextInt(20) + 1;// 计算被攻击者(role)扣除伤害后的剩余血量int remainBlood = role.getBlood() - hurt;//验证剩余血量是否大于0remainBlood = remainBlood > 0 ? remainBlood : 0;//修改被攻击的人的血量role.setBlood(remainBlood);//受伤的描述(this表示方法的调用者,role即为参数)//剩余血量>90 0索引的描述//80 ~ 90 1索引的描述//70 ~ 80 2索引的描述//60 ~ 70 3索引的描述//40 ~ 60 4索引的描述//20 ~ 40 5索引的描述//10 ~ 20 6索引的描述//小于10的 7索引的描述if (remainBlood > 90) {System.out.printf(injured_desc[0], role.getName());} else if (remainBlood > 80) {System.out.printf(injured_desc[1], role.getName());} else if (remainBlood > 70) {System.out.printf(injured_desc[2], role.getName());} else if (remainBlood > 60) {System.out.printf(injured_desc[3], role.getName());} else if (remainBlood > 40) {System.out.printf(injured_desc[4], role.getName());} else if (remainBlood > 20) {System.out.printf(injured_desc[5], role.getName());} else if (remainBlood > 10) {System.out.printf(injured_desc[6], role.getName());} else {System.out.printf(injured_desc[7], role.getName());}System.out.println();}
}
GameTest.java
package practice.daily.test6;public class RoleTest {public static void main(String[] args) {//创建两个角色Role r1 = new Role("乔峰", 100, "男");//r1为引用数据类型Role r2 = new Role("鸠摩智", 100, "男");//r2为引用数据类型//展示角色信息r1.showRoleInfo();r2.showRoleInfo();//开始格斗,回合制游戏while (true) {//r1攻击r2r1.attack(r2);//r1,r2均为Role类型//判断r2剩余血量if (r2.getBlood() == 0) {System.out.println(r1.getName() + "KO了" + r2.getName());break;}//r2攻击r1r2.attack(r1);//判断r1剩余血量if (r1.getBlood() == 0) {System.out.println(r2.getName() + "KO了" + r1.getName());break;}}}
}
运行结果:
D:\Development\SDKs\Java\jdk-21\bin\java.exe "-javaagent:D:\Development\IDEs\IntelliJ IDEA Community Edition 2025.2.3\lib\idea_rt.jar=60754" -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -classpath D:\2.Code\Java\java-practice\out\production\java-practice practice.daily.test6.RoleTest
姓名:乔峰
血量:100
性别:男
长相:一塌糊涂
姓名:鸠摩智
血量:100
性别:男
长相:气宇轩昂
乔峰使出了一招【游空探爪】,飞起身形自半空中变掌为抓锁向鸠摩智。
结果一击命中,鸠摩智痛得弯下腰
鸠摩智使出了一招【背心钉】,转到对方的身后,一掌向乔峰背心的灵台穴拍去。
结果给乔峰造成一处瘀伤
乔峰阴手翻起阳手跟进,一招【没遮拦】,结结实实的捶向鸠摩智。
结果一击命中,鸠摩智痛得弯下腰
鸠摩智阴手翻起阳手跟进,一招【没遮拦】,结结实实的捶向乔峰。
结果一击命中,乔峰痛得弯下腰
乔峰阴手翻起阳手跟进,一招【没遮拦】,结结实实的捶向鸠摩智。
结果鸠摩智痛苦地闷哼了一声,显然受了点内伤
鸠摩智上步抢身,招中套招,一招【劈挂连环】,连环攻向乔峰。
结果一击命中,乔峰痛得弯下腰
乔峰使出了一招【背心钉】,转到对方的身后,一掌向鸠摩智背心的灵台穴拍去。
结果鸠摩智摇摇晃晃,一跤摔倒在地
鸠摩智大喝一声,身形下伏,一招【劈雷坠地】,捶向乔峰双腿。
结果乔峰痛苦地闷哼了一声,显然受了点内伤
乔峰使出了一招【游空探爪】,飞起身形自半空中变掌为抓锁向鸠摩智。
结果鸠摩智摇摇晃晃,一跤摔倒在地
鸠摩智阴手翻起阳手跟进,一招【没遮拦】,结结实实的捶向乔峰。
结果乔峰摇摇晃晃,一跤摔倒在地
乔峰上步抢身,招中套招,一招【劈挂连环】,连环攻向鸠摩智。
结果鸠摩智脸色一下变得惨白,连退了好几步
鸠摩智运气于掌,一瞬间掌心变得血红,一式【掌心雷】,推向乔峰。
结果乔峰脸色一下变得惨白,连退了好几步
乔峰运气于掌,一瞬间掌心变得血红,一式【掌心雷】,推向鸠摩智。
结果鸠摩智脸色一下变得惨白,连退了好几步
鸠摩智大喝一声,身形下伏,一招【劈雷坠地】,捶向乔峰双腿。
结果『轰』的一声,乔峰口中鲜血狂喷而出
乔峰使出了一招【背心钉】,转到对方的身后,一掌向鸠摩智背心的灵台穴拍去。
结果『轰』的一声,鸠摩智口中鲜血狂喷而出
鸠摩智使出了一招【背心钉】,转到对方的身后,一掌向乔峰背心的灵台穴拍去。
结果乔峰一声惨叫,像滩软泥般塌了下去
乔峰使出了一招【背心钉】,转到对方的身后,一掌向鸠摩智背心的灵台穴拍去。
结果鸠摩智一声惨叫,像滩软泥般塌了下去
乔峰KO了鸠摩智进程已结束,退出代码为 0