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

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

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基础之后,自己都能写出来。通过这个游戏,能加深对封装无参有参构造器,自己构造方法调用方法的认识。也能使自己更加灵活的运用这几个知识。

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

  • 20
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是用 Windows 计时器实现 C 语言控制台贪吃蛇的代码实现: ```c #include <stdio.h> #include <conio.h> #include <Windows.h> #include <stdlib.h> #include <time.h> #define width 60 #define height 20 enum Direction {UP, DOWN, LEFT, RIGHT}; int snake[width * height][2]; int food[2]; int length = 0; int score = 0; int direction = RIGHT; int speed = 100; void gotoxy(int x, int y) { COORD pos = { x, y }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); } void hidecursor() { CONSOLE_CURSOR_INFO cursor_info = { 1, 0 }; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info); } void initSnake() { int x = width / 2, y = height / 2; for (int i = 0; i < 5; i++) { snake[i][0] = x - i; snake[i][1] = y; } length = 5; } void initFood() { srand(time(NULL)); int x = rand() % (width - 1) + 1; int y = rand() % (height - 1) + 1; food[0] = x; food[1] = y; } void drawSnake() { for (int i = 0; i < length; i++) { gotoxy(snake[i][0], snake[i][1]); printf("*"); } } void drawFood() { gotoxy(food[0], food[1]); printf("#"); } void move() { switch (direction) { case UP: snake[length][0] = snake[length - 1][0]; snake[length][1] = snake[length - 1][1] - 1; break; case DOWN: snake[length][0] = snake[length - 1][0]; snake[length][1] = snake[length - 1][1] + 1; break; case LEFT: snake[length][0] = snake[length - 1][0] - 1; snake[length][1] = snake[length - 1][1]; break; case RIGHT: snake[length][0] = snake[length - 1][0] + 1; snake[length][1] = snake[length - 1][1]; break; } if (snake[length][0] == food[0] && snake[length][1] == food[1]) { initFood(); length++; score++; if (score % 5 == 0) { speed -= 10; } } for (int i = 0; i < length; i++) { if (i == length - 1) { break; } if (snake[length - 1][0] == snake[i][0] && snake[length - 1][1] == snake[i][1]) { printf("\a"); gotoxy(0, height + 1); printf("Game Over!\n"); exit(0); } } for (int i = 0; i < length - 1; i++) { snake[i][0] = snake[i + 1][0]; snake[i][1] = snake[i + 1][1]; } } void updateScore() { gotoxy(0, height + 1); printf("Score: %d", score); } void changeDirection() { if (_kbhit()) { char ch = _getch(); switch (ch) { case 'w': case 'W': if (direction != DOWN) { direction = UP; } break; case 's': case 'S': if (direction != UP) { direction = DOWN; } break; case 'a': case 'A': if (direction != RIGHT) { direction = LEFT; } break; case 'd': case 'D': if (direction != LEFT) { direction = RIGHT; } break; } } } void gameLoop() { while (1) { drawSnake(); drawFood(); updateScore(); changeDirection(); move(); Sleep(speed); system("cls"); } } int main() { hidecursor(); initSnake(); initFood(); gameLoop(); return 0; } ``` 代码中用到了 Windows API 中的一些函数,如 `getch()`、`Sleep()`、`SetConsoleCursorPosition()` 等,需要在 Windows 平台上运行。其中,`initSnake()` 函数初始化蛇的位置,`initFood()` 函数初始化食物的位置,`drawSnake()` 和 `drawFood()` 函数分别绘制蛇和食物,`move()` 函数控制蛇的移动,`updateScore()` 函数更新分数,`changeDirection()` 函数监听键盘输入并改变蛇的移动方向,`gameLoop()` 函数是游戏的主循环,其中不断重绘和更新蛇、食物、分数等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

MonKingProgrammer

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

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

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

打赏作者

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

抵扣说明:

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

余额充值