从零开始手写mmo游戏从框架到爆炸(二十四)— 装备系统二

文章介绍了如何在MMO游戏中实现从零开始创建装备系统,包括根据野怪等级和品质动态生成装备,如武器和非武器的属性计算,品质影响属性浮动的设计。作者还提供了测试代码示例。

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

导航:从零开始手写mmo游戏从框架到爆炸(零)—— 导航-CSDN博客

      本章主要是补充装备工厂,增加根据野怪等级和品质获得装备的方法:

      增加的代码如下- EquipmentFactory:

public static Equipment createEquipment(Monster monster,
                                            QualityEnum qualityEnum){
        Equipment result;
        // 根据怪物等级,找到对应的装备; 去掉等级过高的装备
        List<EquipmentTemplate> templates = allEquipmentTemplates.stream().filter(e -> e.getLevel() <= monster.getLevel()).collect(Collectors.toList());

        // 随机找到一个装备模板
        EquipmentTemplate equipmentTemplate = templates.get(new Random().nextInt(templates.size()));
        // 找到装备的品质
        if(equipmentTemplate.getType().equalsIgnoreCase(EquipmentEnum.WEAPON.getCode())){
            result = getWeapon(equipmentTemplate,qualityEnum);
        }else{
            // 不是武器的话都一样
            result = getOtherEquipment(equipmentTemplate,qualityEnum);
        }
        // 添加词缀
        return result;
    }

    private static Weapon getWeapon(EquipmentTemplate equipmentTemplate, QualityEnum qualityEnum) {
        Weapon weapon = new Weapon(equipmentTemplate.getName(),equipmentTemplate.getType(),
                equipmentTemplate.getDesc(), EquipmentEnum.WEAPON,
                WeaponTypeEnum.getByCode(equipmentTemplate.getWeaponType()),qualityEnum,equipmentTemplate.getId());
        // 品质越高,浮动越小
        weapon.setGoods_id(equipmentTemplate.getId());
        weapon.setLevel(equipmentTemplate.getLevel());
        weapon.setArmature(calculate(equipmentTemplate.getArmature(),qualityEnum));
        weapon.setStrength(calculate(equipmentTemplate.getStrength(),qualityEnum));
        weapon.setSpeed(calculate(equipmentTemplate.getSpeed(),qualityEnum));
        weapon.setConstitution(calculate(equipmentTemplate.getConstitution(),qualityEnum));
        weapon.setTechnique(calculate(equipmentTemplate.getTechnique(),qualityEnum));
        weapon.setHp(calculate(equipmentTemplate.getHp(),qualityEnum));
        weapon.setMagic(calculate(equipmentTemplate.getMagic(),qualityEnum));
        weapon.setSpeed(calculate(equipmentTemplate.getSpeed(),qualityEnum));
        weapon.setEvasion(calculate(equipmentTemplate.getEvasion(),qualityEnum));
        weapon.setFortune(calculate(equipmentTemplate.getFortune(),qualityEnum));
        weapon.setPoisonResistance(calculate(equipmentTemplate.getPoisonResistance(),qualityEnum));
        weapon.setFlameResistance(calculate(equipmentTemplate.getFlameResistance(),qualityEnum));
        weapon.setThunderResistance(calculate(equipmentTemplate.getThunderResistance(),qualityEnum));
        weapon.setIceResistance(calculate(equipmentTemplate.getIceResistance(),qualityEnum));
        return weapon;
    }


    public static Equipment getOtherEquipment(EquipmentTemplate equipmentTemplate, QualityEnum qualityEnum) {
        Equipment equipment = new Equipment(equipmentTemplate.getName(),equipmentTemplate.getType(),
                equipmentTemplate.getDesc(),EquipmentEnum.getByCode(equipmentTemplate.getType()),qualityEnum,equipmentTemplate.getId());
        // 品质越高,浮动越小
        equipment.setGoods_id(equipmentTemplate.getId());
        equipment.setLevel(equipmentTemplate.getLevel());
        equipment.setArmature(calculate(equipmentTemplate.getArmature(),qualityEnum));
        equipment.setStrength(calculate(equipmentTemplate.getStrength(),qualityEnum));
        equipment.setSpeed(calculate(equipmentTemplate.getSpeed(),qualityEnum));
        equipment.setConstitution(calculate(equipmentTemplate.getConstitution(),qualityEnum));
        equipment.setTechnique(calculate(equipmentTemplate.getTechnique(),qualityEnum));
        equipment.setHp(calculate(equipmentTemplate.getHp(),qualityEnum));
        equipment.setMagic(calculate(equipmentTemplate.getMagic(),qualityEnum));
        equipment.setSpeed(calculate(equipmentTemplate.getSpeed(),qualityEnum));
        equipment.setEvasion(calculate(equipmentTemplate.getEvasion(),qualityEnum));
        equipment.setFortune(calculate(equipmentTemplate.getFortune(),qualityEnum));
        // 四种元素的抗性
        equipment.setPoisonResistance(calculate(equipmentTemplate.getPoisonResistance(),qualityEnum));
        equipment.setFlameResistance(calculate(equipmentTemplate.getFlameResistance(),qualityEnum));
        equipment.setThunderResistance(calculate(equipmentTemplate.getThunderResistance(),qualityEnum));
        equipment.setIceResistance(calculate(equipmentTemplate.getIceResistance(),qualityEnum));
        return equipment;
    }

    private static int calculate(String data, QualityEnum qualityEnum) {
        if(StringUtils.isEmpty(data)){
            return 0;
        }
        String[] split = data.split("-");
        int min = Integer.parseInt(split[0]);
        int max = Integer.parseInt(split[1]);
        int add = max - min;
        if(add > 1){
            switch (qualityEnum){
                case 黄色:
                    min = min + add/5;
                    break;
                case 紫色:
                    min = min + add/4;
                    break;
                case 红色:
                    min = min + add/3;
                    break;
                case 暗金:
                    min = min + add/2;
                    break;
                default:
                    break;
            }
        }
        if(max > min) {
            // 根据品质改变最大最小值
            return min + new Random().nextInt(max - min);
        }else if (max == min){
            return max;
        }
        return 0;
    }

       大概解释一下就是根据野怪的等级找到可获得的装备模板列表,再根据品质去获得属性的浮动,品质越高浮动越小,这样品质高的武器将有机会获得更高的属性加成。

      我们来测试一下-测试代码:

    public static void main(String[] args) {
//        for (EquipmentTemplate template : allEquipmentTemplates) {
//            System.out.println(template.toString());
//        }

        Equipment equipment = createEquipment(MonsterFactory.createMonster(101, 10), QualityEnum.白色);
        System.out.println("获得装备");
        System.out.println(equipment.prettyPrint());

    }

结果:

获得装备
									****物品信息****
									名称:布甲
									品质:普通
									位置:胸甲
									说明:布甲
									护甲:6
									体力:13
									***************

全部源码详见:

gitee : eternity-online: 多人在线mmo游戏 - Gitee.com

分支:step-12

请各位帅哥靓女帮忙去gitee上点个星星,谢谢! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值