Java 练习之回合制游戏,练习接口,随机,数组,可变参数

weapon
定义一个武器类,武器需要具有武器的名称,武器的伤害值
equipment
定义一个装备类,武器需要含有装备名称,装备的防御值
character
定义一个角色类,角色含有角色名称和角色ID
skill
定义一个技能类,具备法术攻击和物理攻击的功能
hero
定义一个英雄类,英雄含有英雄名称,英雄的角色,英雄的生命值,英雄需要含有武器属性,含有装备属性
需要具备攻击功能, 切换 技能功能 ,具备添加穿戴装备的功能

游戏开始时,某些英雄登场,这些英雄需要穿戴一些装备和武器,
显示某某英雄开始交战,
某某英雄释放了,某些技能,造成了对方多大的伤害,
当某一个英雄的血量低于10% 提醒,血量过低,建议切换技能或者加血动作,
当全场只剩一个英雄的时候,其他英雄全部血量为0的时候,结束```

```java

思路: 
1.初始化
业务内容:明确参与战斗的对象数量,以及对象的属性(装备.技能等)
开发内容:
创建人物类
人物类中包含人物的基本信息: 姓名,HP(),MP(魔法)
人物类中包含装备属性:武器(攻击值),护具(防御值(减伤效果))
人物类中包含技能属性:物理攻击(伤害值),魔法攻击(伤害值)

2.确定行为
明确任何交战,如何释放技能,
如随机释放技能,按照概率释放被动,
如不需要参与者随机战斗
开发内容:
创建一个容器,存放所有要参战的人物队列



3.明确关系
是回合制还是混战,是一对多,还是多对多,还是随机匹配
如回合制,一对多随机匹配
开发内容:
遍历容器
判断容器中的对象的属性值HP,是否 <= 0
如果小于0,则不参与下次属性赋值
从容器中取出一个对象,随机遍历多个对象,按照属性赋值
------------------------------------------------
如果是混战则需要每个对象,按照攻击方式的不同(AOE或者单体伤害),决定随机多少对象来进行赋值

4.明确结束的条件
是小队存活,还是生存数量,还是最后一人
如最后一人存活
开发内容
当容器中仅剩 1个对象的属性值 HP > 0,结束循环,打印结果

weapon
定义一个武器类,武器需要具有武器的名称,武器的伤害值

private String weaponName;  // 武器的名称
    private double injuryValue; // 武器的伤害值

equipment
定义一个装备类,武器需要含有装备名称,装备的防御值

 private String equipName;
    private double defenceValue;

character
定义一个角色类,角色含有角色名称和角色ID

   private String characterName; // 角色名称
    private String charID;  

skill
定义一个技能类,具备法术攻击和物理攻击的功能

//skill
//定义一个技能类,具备法术攻击和物理攻击的功能
public interface  Skill {
    void physicsAttack(Hero ... heroes); //物理攻击
    void magicAttack(Hero ... heroes);   //法术攻击
}

hero
定义一个英雄类,英雄含有英雄名称,英雄的角色,英雄的生命值,英雄需要含有武器属性,含有装备属性
需要具备攻击功能, 切换 技能功能 ,具备添加穿戴装备的功能

package todayHw;

import java.util.Random;

/*
定义一个英雄类,英雄含有英雄名称,英雄的角色,英雄的生命值,
英雄需要含有武器属性,含有装备属性
需要具备攻击功能, 切换 技能功能 ,具备添加穿戴装备的功能
 */
public class Hero extends Character implements Skill {

    // 继承自 角色类
    // 英雄名称
    // 英雄的角色
    private double HP;       // 血量    HP=health point
    private Weapon weapon;   // 武器属性
    private Equipment equip; // 装备属性

    public int addHP() {

        int temp = new Random().nextInt(50);
        System.out.println("本次加血" + temp + "点");
        return temp;
    }


    /**
     * 减去对方英雄的HP
     *
     * @param heroes
     */
    // 实现一下 接口中的 物理攻击 和 法术攻击
    @Override
    public void physicsAttack(Hero... heroes) {
        // 物理攻击
        System.out.println("===================================");
        // 输出获取武器的伤害值
        double weaponThisInjury = weapon.getInjuryValue();


        // 减去对方英雄的HP
        for (int i = 0; i < heroes.length; i++) {

            // 1. 判断对方的血量是否为 0
            if (heroes[i].getHP() > 0 && this.getHP() > 0) {


                // 0.8 ~ 1.5之间随机
                // 武器造成的伤害值 = 武器的伤害值(80% - 150%) - 防御值
                Random r = new Random();
                weaponThisInjury = (int) (weaponThisInjury * r.nextDouble() * 1.5) - heroes[i].getEquip().getDefenceValue();

                // 如果伤害值 经过 防具减伤后 攻击值小于0,则不减少 HP
                if (weaponThisInjury < 0) {
                    System.out.println(" 格挡掉了本次所造成的所有伤害");
                } else {
                    // 显示盾牌
                    System.out.println(heroes[i].getCharacterName()
                            + " 装备了 "
                            + heroes[i].getEquip().getEquipName()
                            + "格挡掉了 , 来自"
                            + this.getCharacterName()
                            + " 的 "
                            + heroes[i].getEquip().getDefenceValue()
                            + " 点 伤害值! ");

                    System.out.println(this.getCharacterName()
                            + " 使用 "
                            + this.getWeapon().getWeaponName()
                            + " 对 "
                            + heroes[i].getCharacterName()
                            + " 本次物理攻击的伤害值是: " + weaponThisInjury + " HP");
                    heroes[i].setHP(heroes[i].getHP() - weaponThisInjury);
                }

                // 判断此次攻击后 血量是否 小于 10
                if (isLowerThenTen(heroes[i])) {
                    System.out.println(heroes[i].getCharacterName() + " 发动被动魔法攻击");
                    magicAttack(this);
                }

                // 判断此次攻击后, 血量是否为 0
                isEmpty(heroes[i]);

                // 输出对方的英雄剩余的HP
                if (heroes[i].getHP() > 0) {
                    System.out.println("对方 " + heroes[i].getCharacterName() + " 还剩余 " + heroes[i].getHP() + " HP");
                }
                // 输出己方的血量
                System.out.println("己方 " + this.getCharacterName()
                        + " 还剩余 "
                        + this.getHP()
                        + " 点血量 "
                );
            }
        }


        System.out.println("===================================");
    }


    // 判断对方血量是否低于 10
    public boolean isLowerThenTen(Hero hero) {
        //
        if (hero.getHP() < 10 && hero.getHP() > 0) {
            System.out.println(
                    hero.getCharacterName() + " 血量低于10"
            );
            System.out.println("建议 " + hero.getCharacterName() + " 转换技能或者加血!!!");


            boolean addOrMagic = new Random().nextBoolean();
            if (addOrMagic) {
                System.out.println(hero.getCharacterName() + " 使用加血功能 ");
                int tempAddHP = addHP();
                hero.setHP(hero.getHP() + tempAddHP);
                System.out.println(hero.getCharacterName() + " 加血 " + tempAddHP + "点");

            }


            return true;
        } else {
            return false;
        }
    }

    // 判断对象经过本次攻击后,血量是否小于 0;
    public void isEmpty(Hero hero) {
        //
        if (hero.getHP() < 0) {
            System.out.println(
                    hero.getCharacterName() + " 的血量低于0 " + " 结束本次战斗"
            );
            System.out.println("造成 " + Math.abs(hero.getHP()) + " 点,过量伤害!!!");
            return;
        }
    }

    @Override
    public void magicAttack(Hero... heroes) {
        // 魔法攻击
        /*
        1.判断血量是否为 0
        2.攻击对方
         */
        for (int i = 0; i < heroes.length; i++) {

            // 1. 判断对方的血量是否为 0
            if (heroes[i].getHP() > 0) {

                // 2. 获取对方的血量
                // 3. 以对方血量为随机数,对 对方 造成伤害
                int magicInjury = new Random().nextInt((int) heroes[i].getHP());

                System.out.println("对 "
                        + heroes[i].getCharacterName()
                        + "造成"
                        + magicInjury
                        + " 点 魔法伤害 "
                );

                // 4.减掉血量
                heroes[i].setHP(heroes[i].getHP() - magicInjury);

            }

            // 判断此次攻击后 血量是否 小于 10
            isLowerThenTen(heroes[i]);

            // 判断此次攻击后, 血量是否为 0
            isEmpty(heroes[i]);

            // 输出对方的英雄剩余的HP
            if (heroes[i].getHP() > 0) {
                System.out.println(heroes[i].getCharacterName() + " 还剩余 " + heroes[i].getHP() + " HP");
            }

        }

    }


    // 空参构造
    public Hero() {
    }

    // 构造方法
    public Hero(double HP, Weapon weapon, Equipment equip) {
        this.HP = HP;
        this.weapon = weapon;
        this.equip = equip;
    }

    // 全参构造
    public Hero(String characterName, String charID, double HP, Weapon weapon, Equipment equip) {
        super(characterName, charID);
        this.HP = HP;
        this.weapon = weapon;
        this.equip = equip;
    }

    public double getHP() {
        return HP;
    }

    public void setHP(double HP) {
        this.HP = HP;
    }

    public Weapon getWeapon() {
        return weapon;
    }

    public void setWeapon(Weapon weapon) {
        this.weapon = weapon;
    }

    public Equipment getEquip() {
        return equip;
    }

    public void setEquip(Equipment equip) {
        this.equip = equip;
    }
}

游戏开始时,某些英雄登场,这些英雄需要穿戴一些装备和武器,
显示某某英雄开始交战,
某某英雄释放了,某些技能,造成了对方多大的伤害,
当某一个英雄的血量低于10% 提醒,血量过低,建议切换技能或者加血动作,
当全场只剩一个英雄的时候,其他英雄全部血量为0的时候,结束

package todayHw;

public class Battle {
    public static void main(String[] args) {
        Hero h = new Hero(" A ", "100", 100,
                new Weapon(" 埃辛诺斯双刃 ", 35),
                new Equipment(" 埃辛诺斯盾牌 ",10));

        Hero h2 = new Hero(" B ", "101", 100,
                new Weapon(" 风剑 ", 25),
                new Equipment(" 橡木盾 ",5));

        Hero h3 = new Hero(" C ", "102", 100,
                new Weapon(" 战斧 ", 15),
                new Equipment(" 复活甲 ",2));

        boolean flag = true;
        int count = 1;
        while (flag) {
            //
            System.out.println(
                    "第" + count++ +" 回合"
            );
            System.out.println("A 攻击 BC");
            h.physicsAttack(h2,h3);

            System.out.println("B 攻击 AC");
            h2.physicsAttack(h,h3);

            System.out.println("C 攻击 AB");
            h3.physicsAttack(h,h2);

            if((h.getHP() < 0 && h2.getHP()< 0)
                    ||(h2.getHP() < 0 && h3.getHP()< 0)
                    ||(h.getHP() < 0 && h3.getHP()< 0)){
                flag = false;
            }
        }


    }
}
JavaSwing 是一个 JavaGUI 工具箱,可以用于构建桌面应用程序。回合制游戏通常需要一个 GUI 来显示游戏状态和交互。下面是一个简单的回合制游戏示例,使用 JavaSwing 实现。 首先,需要创建一个 JFrame 来作为游戏窗口。在 JFrame 中添加一个 JPanel 作为游戏画布。在 JPanel 中绘制游戏状态和交互元素。使用 JButton 或其他组件来实现交互。 接着,创建一个游戏循环,在每个回合更新游戏状态并重新绘制 JPanel。可以使用 Java 的 Timer 类来实现循环。在每个回合中,可以让玩家进行操作,如选择一个单位或移动一个单位。然后更新游戏状态并重新绘制 JPanel。 最后,需要处理用户输入。可以使用 JavaSwing 的事件处理机制来处理按钮点击或其他用户操作。在事件处理器中更新游戏状态,并重新绘制 JPanel。 这是一个简单的示例代码,实现了一个回合制游戏: ```java import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Random; import javax.swing.*; public class TurnBasedGame extends JFrame implements ActionListener { private JPanel gamePanel; private JButton actionButton; private JLabel statusLabel; private int currentPlayer; private Random random; public TurnBasedGame() { super("Turn-Based Game"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(400, 300); // Create game panel gamePanel = new JPanel(); gamePanel.setLayout(new BorderLayout()); add(gamePanel); // Create action button actionButton = new JButton("End turn"); actionButton.addActionListener(this); gamePanel.add(actionButton, BorderLayout.SOUTH); // Create status label statusLabel = new JLabel("Player 1's turn"); gamePanel.add(statusLabel, BorderLayout.NORTH); // Initialize game state currentPlayer = 1; random = new Random(); // Show frame setVisible(true); } public void actionPerformed(ActionEvent e) { // End current player's turn currentPlayer = 3 - currentPlayer; // Switch player statusLabel.setText("Player " + currentPlayer + "'s turn"); // Do AI turn if (currentPlayer == 2) { // Do some random action int action = random.nextInt(3); if (action == 0) { statusLabel.setText("AI attacked"); } else if (action == 1) { statusLabel.setText("AI healed"); } else { statusLabel.setText("AI skipped"); } } } public static void main(String[] args) { new TurnBasedGame(); } } ``` 这个示例实现了一个简单的回合制游戏,玩家和 AI 交替进行回合。点击按钮将结束当前玩家的回合,并开始下一个玩家的回合。AI 的回合是随机的,有三种可能的操作:攻击、治疗或跳过。在每个回合中,状态标签将显示当前回合的玩家或 AI 的名称和操作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值