Java—简单的控制台版对打游戏(内附完整代码)

本文主要介绍用Java实现简易对打游戏的代码。运用if - else嵌套、while循环等语句,定义新的Fighter类,包含成员变量并使用封装知识。构造无参和有参构造器,定义攻击方法。通过测试类实现对打逻辑,能加深对封装、构造器等知识的认识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个游戏是我课后的一个作业。

1.代码内容

  1. 运用多个if-else嵌套while循环swit-case语句
  2. 定义boolean类型来进行判断。
  3. 运用了封装的知识点,以及构造方法调用方法
  4. 运用了Random方法
  5. 运用了this关键字,settergetter方法

2.定义新的类

        这里我们首先要自己先定义一个新的Fighter类,里面包含后面要创立的对象成员变量(属性)姓名HPMP。因为我们用的是private(私有化)修饰符,所以我们要用setter方法来为对应的私有属性进行设置值和getter方法来获取对应属性的值。

例如:

step1:使用private关键字,修饰成员变量(属性)。
step2:提供setter 方法,用于对属性进行赋值。
  public void set属性名(参数){
    this.属性名 = 参数;
  }
step3:提供getter 方法,用于获取属性值。
  public 属性值类型 get属性名(){
    return this.属性名;
  }

public class Fighter {
    private String name;  // 用private修饰符修饰成员变量
    private int HP;  // 用private修饰符修饰成员变量
    private int MP;  // 用private修饰符修饰成员变量

    public void setName(String name) {  // setter方法
        this.name = name;
    }

    public String getName() {  // getter方法
        return name;
    }

    public void setHP(int HP) {  // setter方法
        this.HP = HP;
    }

    public int getHP() {  // getter方法
        return HP;
    }

    public void setMP(int MP) {  // setter方法
        this.MP = MP;
    }

    public int getMP() {  // getter方法
        return MP;
    }

    public Fighter() {  // 无(空)参构造器,因为在测试类里面不会用到无(空)参构造器,所以不在无(空)参构造器里面放语句

    }

    public Fighter(String name, int HP, int MP) {  // 有参构造器,便于在测试类中定义对象的时候直接赋值
        this.name = name;
        this.HP = HP;
        this.MP = MP;
    }

最后我们要构造无参有参构造器。例如:

public Fighter() {

}

public Fighter(String name, int HP, int MP) {
    this.name = name;
    this.HP = HP;
    this.MP = MP;
}

 3.构造方法

        在这里我构造了一个名字叫做fight方法,显而易见就是攻击的方法。其中运用了判断结构循环结构分支结构等等。

        在定义random对象的时候将随机生成的数的范围+1是因为Random的随机数范围包左不包右,也就是左闭右开的区间。看用户需求,这里+1将范围改为1~21左闭右开。因为考虑到攻击对方时不应该出现对方不扣血,或自己蓝条不增加的特殊情况。

    public void fight(Fighter fighter) {
        Random random = new Random();
        int damage = random.nextInt(20) + 1;   // 运用Random来随机生成一个数-> 伤害值
        int magic = random.nextInt(20) + 1;   // 运用Random来随机生成一个数-> 魔法值


        if (this.MP >= 100) this.MP = 100;    //  判断如果英雄蓝条大于100了,就变成100。设置蓝条最大值为100
        Scanner input = new Scanner(System.in);
        boolean flag = true;    //  定义布尔类型

        if (this.MP >= 10) {    // 判断如果蓝条大于10了,那么就提示玩家可以释放普通技能了
            if (this.name == "小肖") {
                System.out.println(this.name + "可以选择释放技能");
                System.out.println("1.嘴炮攻击");
                System.out.println("2.身高压制");
                System.out.println("3.不释放技能");
                int x = input.nextInt();
                while (x != 1 && x != 2 && x != 3) {   // 如果用户输入的数字不是1,2,3。那么提示用户重新输入
                    System.out.println("您输入的数字不对,请重新输入:");
                    System.out.println("1.嘴炮攻击");
                    System.out.println("2.身高压制");
                    System.out.println("3.不释放技能");
                    x = input.nextInt();
                }
                switch (x) {
                    case 1:
                        fighter.HP -= 5;
                        if (fighter.HP > 0) {    // 如果对方英雄受到伤害后,生命值低于0,那么就让HP=0。没有低于0就不变
                            fighter.HP = fighter.HP;
                        } else {
                            fighter.HP = 0;
                        }
                        System.out.println(this.name + "发动了1技能嘴炮攻击,对" + fighter.name + "造成了5点伤害,"
                                + fighter.name + "还剩下" + fighter.HP + "血量");
                        this.MP -= 10;  // 己方英雄释放技能后蓝条-10 
                        flag = false;  // 释放了技能之后就让flag = false,防止后面if语句判断多A一次
                        break;
                    case 2:
                        fighter.HP -= 10;
                        if (fighter.HP > 0) {  // 如果对方英雄受到伤害后,生命值低于0,那么就让HP=0。没有低于0就不变
                            fighter.HP = fighter.HP;
                        } else {
                            fighter.HP = 0;
                        }
                        System.out.println(this.name + "发动了2技能身高压制,对" + fighter.name + "造成了10点伤害,"
                                + fighter.name + "还剩下" + fighter.HP + "血量");
                        this.MP -= 20;  // 己方英雄释放技能后蓝条-20
                        flag = false;  // 释放了技能之后就让flag = false,防止后面if语句判断多A一次
                        break;
                    case 3:
                        System.out.println(this.name + "选择不释放技能");  // 因为用户选择不释放技能那么,英雄就进行平A
                        fighter.HP -= damage;
                        if (fighter.HP > 0) {  // 如果对方英雄受到伤害后,生命值低于0,那么就让HP=0。没有低于0就不变
                            fighter.HP = fighter.HP;
                        } else {
                            fighter.HP = 0;
                        }
                        System.out.println("所以" + this.name + "A了" + fighter.name + "一下,对" + fighter.name + "造成了"
                                + damage + "点伤害," + fighter.name + "还剩下" + fighter.HP + "血量");
                        this.MP += magic;  //  因为未使用蓝条且平A,所以蓝条值增加
                        System.out.println(this.name + "的能量增加了" + magic + "点");
                        flag = false;  // 平A了之后就让flag = false,防止后面if语句判断多A一次
                        break;
                }
            }
            if (this.name == "小童") {
                System.out.println(this.name + "可以选择释放技能");
                System.out.println("1.彝语袭击");
                System.out.println("2.体能压制");
                System.out.println("3.不释放技能");
                int t = input.nextInt();
                while (t != 1 && t != 2 && t != 3) {  // 如果用户输入的数字不是1,2,3。那么提示用户重新输入
                    System.out.println("您输入的数字不对,请重新输入:");
                    System.out.println("1.彝语袭击");
                    System.out.println("2.体能压制");
                    System.out.println("3.不释放技能");
                    t = input.nextInt();
                }
                switch (t) {
                    case 1:
                        fighter.HP -= 5;
                        if (fighter.HP > 0) {  // 如果对方英雄受到伤害后,生命值低于0,那么就让HP=0。没有低于0就不变
                            fighter.HP = fighter.HP;
                        } else {
                            fighter.HP = 0;
                        }
                        System.out.println(this.name + "发动了1技能彝语袭击,对" + fighter.name + "造成了5点伤害,"
                                + fighter.name + "还剩下" + fighter.HP + "血量");
                        this.MP -= 10;  // 己方英雄释放技能后蓝条-10
                        flag = false;  // 释放了技能之后就让flag = false,防止后面if语句判断多A一次
                        break;
                    case 2:
                        fighter.HP -= 10;
                        if (fighter.HP > 0) {  // 如果对方英雄受到伤害后,生命值低于0,那么就让HP=0。没有低于0就不变
                            fighter.HP = fighter.HP;
                        } else {
                            fighter.HP = 0;
                        }
                        System.out.println(this.name + "发动了2技能体能压制,对" + fighter.name + "造成了10点伤害,"
                                + fighter.name + "还剩下" + fighter.HP + "血量");
                        this.MP -= 20;  // 己方英雄释放技能后蓝条-20
                        flag = false;  // 释放了技能之后就让flag = false,防止后面if语句判断多A一次
                        break;
                    case 3:
                        System.out.println(this.name + "选择不释放技能");  // 因为用户选择不释放技能那么,英雄就进行平A
                        fighter.HP -= damage;
                        if (fighter.HP > 0) {  // 如果对方英雄受到伤害后,生命值低于0,那么就让HP=0。没有低于0就不变
                            fighter.HP = fighter.HP;
                        } else {
                            fighter.HP = 0;
                        }
                        System.out.println("所以" + this.name + "A了" + fighter.name + "一下,对" + fighter.name + "造成了"
                                + damage + "点伤害," + fighter.name + "还剩下" + fighter.HP + "血量");
                        this.MP += magic;  //  因为未使用蓝条且平A,所以蓝条值增加
                        System.out.println(this.name + "的能量增加了" + magic + "点");
                        flag = false;  // 平A了之后就让flag = false,防止后面if语句判断多A一次
                        break;
                }
            }
            if (this.name == "小罗") {
                System.out.println(this.name + "可以选择释放技能");
                System.out.println("1.狗粮袭击");
                System.out.println("2.故事合集");
                System.out.println("3.不释放技能");
                int l = input.nextInt();
                while (l != 1 && l != 2 && l != 3) {  // 如果用户输入的数字不是1,2,3。那么提示用户重新输入
                    System.out.println("您输入的数字不对,请重新输入:");
                    System.out.println("1.狗粮袭击");
                    System.out.println("2.故事合集");
                    System.out.println("3.不释放技能");
                    l = input.nextInt();
                }
                switch (l) {
                    case 1:
                        fighter.HP -= 5;
                        if (fighter.HP > 0) {  // 如果对方英雄受到伤害后,生命值低于0,那么就让HP=0。没有低于0就不变
                            fighter.HP = fighter.HP;
                        } else {
                            fighter.HP = 0;
                        }
                        System.out.println(this.name + "发动了1技能狗粮袭击,对" + fighter.name + "造成了5点伤害,"
                                + fighter.name + "还剩下" + fighter.HP + "血量");
                        this.MP -= 10;  // 己方英雄释放技能后蓝条-10
                        flag = false;  // 释放了技能之后就让flag = false,防止后面if语句判断多A一次
                        break;
                    case 2:
                        fighter.HP -= 10;
                        if (fighter.HP > 0) {  // 如果对方英雄受到伤害后,生命值低于0,那么就让HP=0。没有低于0就不变
                            fighter.HP = fighter.HP;
                        } else {
                            fighter.HP = 0;
                        }
                        System.out.println(this.name + "发动了2技能故事合集,对" + fighter.name + "造成了10点伤害,"
                                + fighter.name + "还剩下" + fighter.HP + "血量");
                        this.MP -= 20;  // 己方英雄释放技能后蓝条-20
                        flag = false;  // 释放了技能之后就让flag = false,防止后面if语句判断多A一次
                        break;
                    case 3:
                        System.out.println(this.name + "选择不释放技能");  // 因为用户选择不释放技能那么,英雄就进行平A
                        fighter.HP -= damage;
                        if (fighter.HP > 0) {  // 如果对方英雄受到伤害后,生命值低于0,那么就让HP=0。没有低于0就不变
                            fighter.HP = fighter.HP;
                        } else {
                            fighter.HP = 0;
                        }
                        System.out.println("所以" + this.name + "A了" + fighter.name + "一下,对" + fighter.name + "造成了"
                                + damage + "点伤害," + fighter.name + "还剩下" + fighter.HP + "血量");
                        this.MP += magic;  //  因为未使用蓝条且平A,所以蓝条值增加
                        System.out.println(this.name + "的能量增加了" + magic + "点");
                        flag = false;  // 平A了之后就让flag = false,防止后面if语句判断多A一次
                        break;
                }
            }
        }
        if (this.MP >= 50) {  // 判断如果蓝条大于50了,那么就提示玩家可以释放大招了
            if (this.name == "小肖") {
                System.out.println(this.name + "可以释放大招了");
                System.out.println("4.学委威慑");
                System.out.println("5.不释放大招");
                int X = input.nextInt();
                while (X != 4 && X != 5) {  // 如果用户输入的数字不是4,5。那么提示用户重新输入
                    System.out.println("您输入的数字不对,请重新输入:");
                    System.out.println("4.学委威慑");
                    System.out.println("5.不释放大招");
                    X = input.nextInt();
                }
                switch (X) {
                    case 4:
                        fighter.HP -= 20;
                        if (fighter.HP > 0) {  // 如果对方英雄受到伤害后,生命值低于0,那么就让HP=0。没有低于0就不变
                            fighter.HP = fighter.HP;
                        } else {
                            fighter.HP = 0;
                        }
                        System.out.println(this.name + "释放了大招学委威慑,对" + fighter.name + "造成了20点伤害,"
                                + fighter.name + "还剩下" + fighter.HP + "血量");
                        this.MP -= 50;
                        flag = false;  // 释放了技能之后就让flag = false,防止后面if语句判断多A一次
                        break;
                    case 5:
                        System.out.println(this.name + "选择不释放大招");
                        fighter.HP -= damage;
                        if (fighter.HP > 0) {  // 如果对方英雄受到伤害后,生命值低于0,那么就让HP=0。没有低于0就不变
                            fighter.HP = fighter.HP;
                        } else {
                            fighter.HP = 0;
                        }
                        System.out.println("所以" + this.name + "A了" + fighter.name + "一下,对" + fighter.name + "造成了"
                                + damage + "点伤害," + fighter.name + "还剩下" + fighter.HP + "血量");
                        this.MP += magic;  //  因为未使用蓝条且平A,所以蓝条值增加
                        System.out.println(this.name + "的能量增加了" + magic + "点");
                        flag = false;  // 平A了之后就让flag = false,防止后面if语句判断多A一次
                        break;
                }
            }
            if (this.name == "小童") {
                System.out.println(this.name + "可以释放大招了");
                System.out.println("4.极致内卷");
                System.out.println("5.不释放大招");
                int T = input.nextInt();
                while (T != 4 && T != 5) {  // 如果用户输入的数字不是4,5。那么提示用户重新输入
                    System.out.println("您输入的数字不对,请重新输入:");
                    System.out.println("4.极致内卷");
                    System.out.println("5.不释放大招");
                    T = input.nextInt();
                }
                switch (T) {
                    case 4:
                        fighter.HP -= 20;
                        if (fighter.HP > 0) {  // 如果对方英雄受到伤害后,生命值低于0,那么就让HP=0。没有低于0就不变
                            fighter.HP = fighter.HP;
                        } else {
                            fighter.HP = 0;
                        }
                        System.out.println(this.name + "释放了大招极致内卷,对" + fighter.name + "造成了20点伤害,"
                                + fighter.name + "还剩下" + fighter.HP + "血量");
                        this.MP -= 50;
                        flag = false;  // 释放了技能之后就让flag = false,防止后面if语句判断多A一次
                        break;
                    case 5:
                        System.out.println(this.name + "选择不释放大招");
                        fighter.HP -= damage;
                        if (fighter.HP > 0) {  // 如果对方英雄受到伤害后,生命值低于0,那么就让HP=0。没有低于0就不变
                            fighter.HP = fighter.HP;
                        } else {
                            fighter.HP = 0;
                        }
                        System.out.println("所以" + this.name + "A了" + fighter.name + "一下,对" + fighter.name + "造成了"
                                + damage + "点伤害," + fighter.name + "还剩下" + fighter.HP + "血量");
                        this.MP += magic;  //  因为未使用蓝条且平A,所以蓝条值增加
                        System.out.println(this.name + "的能量增加了" + magic + "点");
                        flag = false;  // 平A了之后就让flag = false,防止后面if语句判断多A一次
                        break;
                }
            }
            if (this.name == "小罗") {
                System.out.println(this.name + "可以释放大招了");
                System.out.println("4.夜不归宿");
                System.out.println("5.不释放大招");
                int L = input.nextInt();
                while (L != 4 && L != 5) {  // 如果用户输入的数字不是4,5。那么提示用户重新输入
                    System.out.println("您输入的数字不对,请重新输入:");
                    System.out.println("4.夜不归宿");
                    System.out.println("5.不释放大招");
                    L = input.nextInt();
                }
                switch (L) {
                    case 4:
                        fighter.HP -= 20;
                        if (fighter.HP > 0) {  // 如果对方英雄受到伤害后,生命值低于0,那么就让HP=0。没有低于0就不变
                            fighter.HP = fighter.HP;
                        } else {
                            fighter.HP = 0;
                        }
                        System.out.println(this.name + "释放了大招夜不归宿,对" + fighter.name + "造成了20点伤害,"
                                + fighter.name + "还剩下" + fighter.HP + "血量");
                        this.MP -= 50;
                        flag = false;  // 释放了技能之后就让flag = false,防止后面if语句判断多A一次
                        break;
                    case 5:
                        System.out.println(this.name + "选择不释放大招");
                        fighter.HP -= damage;
                        if (fighter.HP > 0) {  // 如果对方英雄受到伤害后,生命值低于0,那么就让HP=0。没有低于0就不变
                            fighter.HP = fighter.HP;
                        } else {
                            fighter.HP = 0;
                        }
                        System.out.println("所以" + this.name + "A了" + fighter.name + "一下,对" + fighter.name + "造成了"
                                + damage + "点伤害," + fighter.name + "还剩下" + fighter.HP + "血量");
                        this.MP += magic;  //  因为未使用蓝条且平A,所以蓝条值增加
                        System.out.println(this.name + "的能量增加了" + magic + "点");
                        flag = false;  // 平A了之后就让flag = false,防止后面if语句判断多A一次
                        break;
                }
            }
        }
        if (this.MP < 10 && flag) {  //  如果英雄蓝条小于10,并且没有释放过技能再平A
            fighter.HP -= damage;
            if (fighter.HP > 0) {  // 如果对方英雄受到伤害后,生命值低于0,那么就让HP=0。没有低于0就不变
                fighter.HP = fighter.HP;
            } else {
                fighter.HP = 0;
            }
            System.out.println(this.name + "A了" + fighter.name + "一下,对" + fighter.name + "造成了"
                    + damage + "点伤害," + fighter.name + "还剩下" + fighter.HP + "血量");
            this.MP += magic;  //  因为未使用蓝条且平A,所以蓝条值增加
            System.out.println(this.name + "的能量增加了" + magic + "点");
        }
    }
}

4.自己定义的类的完整代码

import java.util.*;
public class Fighter {
    private String name;  // 用private修饰符修饰成员变量
    private int HP;  // 用private修饰符修饰成员变量
    private int MP;  // 用private修饰符修饰成员变量

    public void setName(String name) {  // setter方法
        this.name = name;
    }

    public String getName() {  // getter方法
        return name;
    }

    public void setHP(int HP) {  // setter方法
        this.HP = HP;
    }

    public int getHP() {  // getter方法
        return HP;
    }

    public void setMP(int MP) {  // setter方法
        this.MP = MP;
    }

    public int getMP() {  // getter方法
        return MP;
    }

    public Fighter() {  // 无(空)参构造器,因为在测试类里面不会用到无(空)参构造器,所以不在无(空)参构造器里面放语句

    }

    public Fighter(String name, int HP, int MP) {  // 有参构造器,便于在测试类中定义对象的时候直接赋值
        this.name = name;
        this.HP = HP;
        this.MP = MP;
    }

    public void fight(Fighter fighter) {
        Random random = new Random();
        int damage = random.nextInt(20) + 1;   // 运用Random来随机生成一个数-> 伤害值
        int magic = random.nextInt(20) + 1;   // 运用Random来随机生成一个数-> 魔法值


        if (this.MP >= 100) this.MP = 100;    //  判断如果英雄蓝条大于100了,就变成100。设置蓝条最大值为100
        Scanner input = new Scanner(System.in);
        boolean flag = true;    //  定义布尔类型

        if (this.MP >= 10) {    // 判断如果蓝条大于10了,那么就提示玩家可以释放普通技能了
            if (this.name == "小肖") {
                System.out.println(this.name + "可以选择释放技能");
                System.out.println("1.嘴炮攻击");
                System.out.println("2.身高压制");
                System.out.println("3.不释放技能");
                int x = input.nextInt();
                while (x != 1 && x != 2 && x != 3) {   // 如果用户输入的数字不是1,2,3。那么提示用户重新输入
                    System.out.println("您输入的数字不对,请重新输入:");
                    System.out.println("1.嘴炮攻击");
                    System.out.println("2.身高压制");
                    System.out.println("3.不释放技能");
                    x = input.nextInt();
                }
                switch (x) {
                    case 1:
                        fighter.HP -= 5;
                        if (fighter.HP > 0) {    // 如果对方英雄受到伤害后,生命值低于0,那么就让HP=0。没有低于0就不变
                            fighter.HP = fighter.HP;
                        } else {
                            fighter.HP = 0;
                        }
                        System.out.println(this.name + "发动了1技能嘴炮攻击,对" + fighter.name + "造成了5点伤害,"
                                + fighter.name + "还剩下" + fighter.HP + "血量");
                        this.MP -= 10;  // 己方英雄释放技能后蓝条-10 
                        flag = false;  // 释放了技能之后就让flag = false,防止后面if语句判断多A一次
                        break;
                    case 2:
                        fighter.HP -= 10;
                        if (fighter.HP > 0) {  // 如果对方英雄受到伤害后,生命值低于0,那么就让HP=0。没有低于0就不变
                            fighter.HP = fighter.HP;
                        } else {
                            fighter.HP = 0;
                        }
                        System.out.println(this.name + "发动了2技能身高压制,对" + fighter.name + "造成了10点伤害,"
                                + fighter.name + "还剩下" + fighter.HP + "血量");
                        this.MP -= 20;  // 己方英雄释放技能后蓝条-20
                        flag = false;  // 释放了技能之后就让flag = false,防止后面if语句判断多A一次
                        break;
                    case 3:
                        System.out.println(this.name + "选择不释放技能");  // 因为用户选择不释放技能那么,英雄就进行平A
                        fighter.HP -= damage;
                        if (fighter.HP > 0) {  // 如果对方英雄受到伤害后,生命值低于0,那么就让HP=0。没有低于0就不变
                            fighter.HP = fighter.HP;
                        } else {
                            fighter.HP = 0;
                        }
                        System.out.println("所以" + this.name + "A了" + fighter.name + "一下,对" + fighter.name + "造成了"
                                + damage + "点伤害," + fighter.name + "还剩下" + fighter.HP + "血量");
                        this.MP += magic;  //  因为未使用蓝条且平A,所以蓝条值增加
                        System.out.println(this.name + "的能量增加了" + magic + "点");
                        flag = false;  // 平A了之后就让flag = false,防止后面if语句判断多A一次
                        break;
                }
            }
            if (this.name == "小童") {
                System.out.println(this.name + "可以选择释放技能");
                System.out.println("1.彝语袭击");
                System.out.println("2.体能压制");
                System.out.println("3.不释放技能");
                int t = input.nextInt();
                while (t != 1 && t != 2 && t != 3) {  // 如果用户输入的数字不是1,2,3。那么提示用户重新输入
                    System.out.println("您输入的数字不对,请重新输入:");
                    System.out.println("1.彝语袭击");
                    System.out.println("2.体能压制");
                    System.out.println("3.不释放技能");
                    t = input.nextInt();
                }
                switch (t) {
                    case 1:
                        fighter.HP -= 5;
                        if (fighter.HP > 0) {  // 如果对方英雄受到伤害后,生命值低于0,那么就让HP=0。没有低于0就不变
                            fighter.HP = fighter.HP;
                        } else {
                            fighter.HP = 0;
                        }
                        System.out.println(this.name + "发动了1技能彝语袭击,对" + fighter.name + "造成了5点伤害,"
                                + fighter.name + "还剩下" + fighter.HP + "血量");
                        this.MP -= 10;  // 己方英雄释放技能后蓝条-10
                        flag = false;  // 释放了技能之后就让flag = false,防止后面if语句判断多A一次
                        break;
                    case 2:
                        fighter.HP -= 10;
                        if (fighter.HP > 0) {  // 如果对方英雄受到伤害后,生命值低于0,那么就让HP=0。没有低于0就不变
                            fighter.HP = fighter.HP;
                        } else {
                            fighter.HP = 0;
                        }
                        System.out.println(this.name + "发动了2技能体能压制,对" + fighter.name + "造成了10点伤害,"
                                + fighter.name + "还剩下" + fighter.HP + "血量");
                        this.MP -= 20;  // 己方英雄释放技能后蓝条-20
                        flag = false;  // 释放了技能之后就让flag = false,防止后面if语句判断多A一次
                        break;
                    case 3:
                        System.out.println(this.name + "选择不释放技能");  // 因为用户选择不释放技能那么,英雄就进行平A
                        fighter.HP -= damage;
                        if (fighter.HP > 0) {  // 如果对方英雄受到伤害后,生命值低于0,那么就让HP=0。没有低于0就不变
                            fighter.HP = fighter.HP;
                        } else {
                            fighter.HP = 0;
                        }
                        System.out.println("所以" + this.name + "A了" + fighter.name + "一下,对" + fighter.name + "造成了"
                                + damage + "点伤害," + fighter.name + "还剩下" + fighter.HP + "血量");
                        this.MP += magic;  //  因为未使用蓝条且平A,所以蓝条值增加
                        System.out.println(this.name + "的能量增加了" + magic + "点");
                        flag = false;  // 平A了之后就让flag = false,防止后面if语句判断多A一次
                        break;
                }
            }
            if (this.name == "小罗") {
                System.out.println(this.name + "可以选择释放技能");
                System.out.println("1.狗粮袭击");
                System.out.println("2.故事合集");
                System.out.println("3.不释放技能");
                int l = input.nextInt();
                while (l != 1 && l != 2 && l != 3) {  // 如果用户输入的数字不是1,2,3。那么提示用户重新输入
                    System.out.println("您输入的数字不对,请重新输入:");
                    System.out.println("1.狗粮袭击");
                    System.out.println("2.故事合集");
                    System.out.println("3.不释放技能");
                    l = input.nextInt();
                }
                switch (l) {
                    case 1:
                        fighter.HP -= 5;
                        if (fighter.HP > 0) {  // 如果对方英雄受到伤害后,生命值低于0,那么就让HP=0。没有低于0就不变
                            fighter.HP = fighter.HP;
                        } else {
                            fighter.HP = 0;
                        }
                        System.out.println(this.name + "发动了1技能狗粮袭击,对" + fighter.name + "造成了5点伤害,"
                                + fighter.name + "还剩下" + fighter.HP + "血量");
                        this.MP -= 10;  // 己方英雄释放技能后蓝条-10
                        flag = false;  // 释放了技能之后就让flag = false,防止后面if语句判断多A一次
                        break;
                    case 2:
                        fighter.HP -= 10;
                        if (fighter.HP > 0) {  // 如果对方英雄受到伤害后,生命值低于0,那么就让HP=0。没有低于0就不变
                            fighter.HP = fighter.HP;
                        } else {
                            fighter.HP = 0;
                        }
                        System.out.println(this.name + "发动了2技能故事合集,对" + fighter.name + "造成了10点伤害,"
                                + fighter.name + "还剩下" + fighter.HP + "血量");
                        this.MP -= 20;  // 己方英雄释放技能后蓝条-20
                        flag = false;  // 释放了技能之后就让flag = false,防止后面if语句判断多A一次
                        break;
                    case 3:
                        System.out.println(this.name + "选择不释放技能");  // 因为用户选择不释放技能那么,英雄就进行平A
                        fighter.HP -= damage;
                        if (fighter.HP > 0) {  // 如果对方英雄受到伤害后,生命值低于0,那么就让HP=0。没有低于0就不变
                            fighter.HP = fighter.HP;
                        } else {
                            fighter.HP = 0;
                        }
                        System.out.println("所以" + this.name + "A了" + fighter.name + "一下,对" + fighter.name + "造成了"
                                + damage + "点伤害," + fighter.name + "还剩下" + fighter.HP + "血量");
                        this.MP += magic;  //  因为未使用蓝条且平A,所以蓝条值增加
                        System.out.println(this.name + "的能量增加了" + magic + "点");
                        flag = false;  // 平A了之后就让flag = false,防止后面if语句判断多A一次
                        break;
                }
            }
        }
        if (this.MP >= 50) {  // 判断如果蓝条大于50了,那么就提示玩家可以释放大招了
            if (this.name == "小肖") {
                System.out.println(this.name + "可以释放大招了");
                System.out.println("4.学委威慑");
                System.out.println("5.不释放大招");
                int X = input.nextInt();
                while (X != 4 && X != 5) {  // 如果用户输入的数字不是4,5。那么提示用户重新输入
                    System.out.println("您输入的数字不对,请重新输入:");
                    System.out.println("4.学委威慑");
                    System.out.println("5.不释放大招");
                    X = input.nextInt();
                }
                switch (X) {
                    case 4:
                        fighter.HP -= 20;
                        if (fighter.HP > 0) {  // 如果对方英雄受到伤害后,生命值低于0,那么就让HP=0。没有低于0就不变
                            fighter.HP = fighter.HP;
                        } else {
                            fighter.HP = 0;
                        }
                        System.out.println(this.name + "释放了大招学委威慑,对" + fighter.name + "造成了20点伤害,"
                                + fighter.name + "还剩下" + fighter.HP + "血量");
                        this.MP -= 50;
                        flag = false;  // 释放了技能之后就让flag = false,防止后面if语句判断多A一次
                        break;
                    case 5:
                        System.out.println(this.name + "选择不释放大招");
                        fighter.HP -= damage;
                        if (fighter.HP > 0) {  // 如果对方英雄受到伤害后,生命值低于0,那么就让HP=0。没有低于0就不变
                            fighter.HP = fighter.HP;
                        } else {
                            fighter.HP = 0;
                        }
                        System.out.println("所以" + this.name + "A了" + fighter.name + "一下,对" + fighter.name + "造成了"
                                + damage + "点伤害," + fighter.name + "还剩下" + fighter.HP + "血量");
                        this.MP += magic;  //  因为未使用蓝条且平A,所以蓝条值增加
                        System.out.println(this.name + "的能量增加了" + magic + "点");
                        flag = false;  // 平A了之后就让flag = false,防止后面if语句判断多A一次
                        break;
                }
            }
            if (this.name == "小童") {
                System.out.println(this.name + "可以释放大招了");
                System.out.println("4.极致内卷");
                System.out.println("5.不释放大招");
                int T = input.nextInt();
                while (T != 4 && T != 5) {  // 如果用户输入的数字不是4,5。那么提示用户重新输入
                    System.out.println("您输入的数字不对,请重新输入:");
                    System.out.println("4.极致内卷");
                    System.out.println("5.不释放大招");
                    T = input.nextInt();
                }
                switch (T) {
                    case 4:
                        fighter.HP -= 20;
                        if (fighter.HP > 0) {  // 如果对方英雄受到伤害后,生命值低于0,那么就让HP=0。没有低于0就不变
                            fighter.HP = fighter.HP;
                        } else {
                            fighter.HP = 0;
                        }
                        System.out.println(this.name + "释放了大招极致内卷,对" + fighter.name + "造成了20点伤害,"
                                + fighter.name + "还剩下" + fighter.HP + "血量");
                        this.MP -= 50;
                        flag = false;  // 释放了技能之后就让flag = false,防止后面if语句判断多A一次
                        break;
                    case 5:
                        System.out.println(this.name + "选择不释放大招");
                        fighter.HP -= damage;
                        if (fighter.HP > 0) {  // 如果对方英雄受到伤害后,生命值低于0,那么就让HP=0。没有低于0就不变
                            fighter.HP = fighter.HP;
                        } else {
                            fighter.HP = 0;
                        }
                        System.out.println("所以" + this.name + "A了" + fighter.name + "一下,对" + fighter.name + "造成了"
                                + damage + "点伤害," + fighter.name + "还剩下" + fighter.HP + "血量");
                        this.MP += magic;  //  因为未使用蓝条且平A,所以蓝条值增加
                        System.out.println(this.name + "的能量增加了" + magic + "点");
                        flag = false;  // 平A了之后就让flag = false,防止后面if语句判断多A一次
                        break;
                }
            }
            if (this.name == "小罗") {
                System.out.println(this.name + "可以释放大招了");
                System.out.println("4.夜不归宿");
                System.out.println("5.不释放大招");
                int L = input.nextInt();
                while (L != 4 && L != 5) {  // 如果用户输入的数字不是4,5。那么提示用户重新输入
                    System.out.println("您输入的数字不对,请重新输入:");
                    System.out.println("4.夜不归宿");
                    System.out.println("5.不释放大招");
                    L = input.nextInt();
                }
                switch (L) {
                    case 4:
                        fighter.HP -= 20;
                        if (fighter.HP > 0) {  // 如果对方英雄受到伤害后,生命值低于0,那么就让HP=0。没有低于0就不变
                            fighter.HP = fighter.HP;
                        } else {
                            fighter.HP = 0;
                        }
                        System.out.println(this.name + "释放了大招夜不归宿,对" + fighter.name + "造成了20点伤害,"
                                + fighter.name + "还剩下" + fighter.HP + "血量");
                        this.MP -= 50;
                        flag = false;  // 释放了技能之后就让flag = false,防止后面if语句判断多A一次
                        break;
                    case 5:
                        System.out.println(this.name + "选择不释放大招");
                        fighter.HP -= damage;
                        if (fighter.HP > 0) {  // 如果对方英雄受到伤害后,生命值低于0,那么就让HP=0。没有低于0就不变
                            fighter.HP = fighter.HP;
                        } else {
                            fighter.HP = 0;
                        }
                        System.out.println("所以" + this.name + "A了" + fighter.name + "一下,对" + fighter.name + "造成了"
                                + damage + "点伤害," + fighter.name + "还剩下" + fighter.HP + "血量");
                        this.MP += magic;  //  因为未使用蓝条且平A,所以蓝条值增加
                        System.out.println(this.name + "的能量增加了" + magic + "点");
                        flag = false;  // 平A了之后就让flag = false,防止后面if语句判断多A一次
                        break;
                }
            }
        }
        if (this.MP < 10 && flag) {  //  如果英雄蓝条小于10,并且没有释放过技能再平A
            fighter.HP -= damage;
            if (fighter.HP > 0) {  // 如果对方英雄受到伤害后,生命值低于0,那么就让HP=0。没有低于0就不变
                fighter.HP = fighter.HP;
            } else {
                fighter.HP = 0;
            }
            System.out.println(this.name + "A了" + fighter.name + "一下,对" + fighter.name + "造成了"
                    + damage + "点伤害," + fighter.name + "还剩下" + fighter.HP + "血量");
            this.MP += magic;  //  因为未使用蓝条且平A,所以蓝条值增加
            System.out.println(this.name + "的能量增加了" + magic + "点");
        }
    }
}

5.测试类

        在测试类里,我们先定义了三个Fighter对象,然后利用上述的有参构造器直接对它们进行赋值。后面我们再用while循环来实现连续的对打。最后如果有一方血量<=0了之后,游戏就结束了,再输出点有意思的结局

import java.util.*;

public class BoxGame {
    public static void main(String[] args) {
        Fighter x = new Fighter("小肖", 100, 0);  // 定义三个对象
        Fighter t = new Fighter("小童", 100, 0);
        Fighter l = new Fighter("小罗", 100, 0);
        System.out.println("请挑选两个英雄");
        System.out.println("1.小肖" + "," + "2.小童" + "," + "3.小罗");  // 在这里让用户选择其中两个英雄对打
        Scanner input = new Scanner(System.in);
        int i = input.nextInt();
        int j = input.nextInt();
        int p = 1;
        if (i == 1 && j == 2) {
            while (x.getHP() > 0 && t.getHP() > 0) {
                System.out.println("第" + p + "回合开始!");  // 这个是每一回合数的提示
                x.fight(t);  // 调用fight方法
                if (t.getHP() > 0) t.fight(x);  // 如果被打的英雄血量大于0,那么就打回来,再调用一次fight方法
                p++;  // 对打完回合数自增1
            }
            if (x.getHP() <= 0) {  //  后面就是判断哪一方血量小于=0,然后输出有意思的结局。
                System.out.println("身材高大的" + x.getName() + "被经常内卷的" + t.getName() + "给击倒了!");
                System.out.println(x.getName() + "真的太菜了!");
            } else {
                System.out.println("经常内卷的" + t.getName() + "被身材高大的" + x.getName() + "给击倒了!");
                System.out.println(t.getName() + "真的太弱了!");
            }
        }
        if (i == 2 && j == 3) {
            while (t.getHP() > 0 && l.getHP() > 0) {
                System.out.println("第" + p + "回合开始!");
                t.fight(l);
                if (l.getHP() > 0) l.fight(t);
                p++;
            }
            if (t.getHP() <= 0) {
                System.out.println("经常内卷的" + t.getName() + "被永不疲惫的" + l.getName() + "给击倒了!");
                System.out.println(t.getName() + "真的太弱了!");
            } else {
                System.out.println("永不疲惫的" + l.getName() + "被经常内卷的" + t.getName() + "给击倒了!");
                System.out.println(l.getName() + "真的太虚了!");
            }
        }
        if (i == 2 && j == 1) {
            while (t.getHP() > 0 && x.getHP() > 0) {
                System.out.println("第" + p + "回合开始!");
                t.fight(x);
                if (x.getHP() > 0) x.fight(t);
                p++;
            }
            if (t.getHP() <= 0) {
                System.out.println("经常内卷的" + t.getName() + "被身材高大的" + x.getName() + "给击倒了!");
                System.out.println(t.getName() + "真的太弱了!");
            } else {
                System.out.println("身材高大的" + x.getName() + "被经常内卷的" + t.getName() + "给击倒了!");
                System.out.println(x.getName() + "真的太菜了!");
            }
        }
        if (i == 3 && j == 2) {
            while (l.getHP() > 0 && t.getHP() > 0) {
                System.out.println("第" + p + "回合开始!");
                l.fight(t);
                if (t.getHP() > 0) t.fight(l);
                p++;
            }
            if (l.getHP() <= 0) {
                System.out.println("永不疲惫的" + l.getName() + "被经常内卷的" + t.getName() + "给击倒了!");
                System.out.println(l.getName() + "真的太虚了!");
            } else {
                System.out.println("经常内卷的" + t.getName() + "被永不疲惫的" + l.getName() + "给击倒了!");
                System.out.println(t.getName() + "真的太弱了!");
            }
        }
        if (i == 1 && j == 3) {
            while (x.getHP() > 0 && l.getHP() > 0) {
                System.out.println("第" + p + "回合开始!");
                x.fight(l);
                if (l.getHP() > 0) l.fight(x);
                p++;
            }
            if (x.getHP() <= 0) {
                System.out.println("身材高大的" + x.getName() + "被永不疲惫的" + l.getName() + "给击倒了!");
                System.out.println(x.getName() + "真的太菜了!");
            } else {
                System.out.println("永不疲惫的" + l.getName() + "被身材高大的" + x.getName() + "给击倒了!");
                System.out.println(l.getName() + "真的太虚了!");
            }
        }
        if (i == 3 && j == 1) {
            while (l.getHP() > 0 && x.getHP() > 0) {
                System.out.println("第" + p + "回合开始!");
                l.fight(x);
                if (x.getHP() > 0) x.fight(l);
                p++;
            }
            if (x.getHP() <= 0) {
                System.out.println("永不疲惫的" + l.getName() + "被身材高大的" + x.getName() + "给击倒了!");
                System.out.println(l.getName() + "真的太虚了!");
            } else {
                System.out.println("身材高大的" + x.getName() + "被永不疲惫的" + l.getName() + "给击倒了!");
                System.out.println(x.getName() + "真的太菜了!");
            }
        }
    }
}

6.分析

        这个简易版的对打游戏,在有一定的Java基础之后,自己都能写出来。通过这个游戏,能加深对封装无参有参构造器,自己构造方法调用方法的认识。也能使自己更加灵活的运用这几个知识。

本篇文章完毕,谢谢各位的观看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MKProgrammer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值