AI也能写游戏啦,用ChatGPT生成cocos creator代码,编写回合制文字rpg游戏(四)

320 阅读2分钟

上一篇

AI也能写游戏啦,用ChatGPT生成cocos creator代码,编写回合制文字rpg游戏(三) - 掘金 (juejin.cn)

这一节,我要来处理怪物掉落物的部分

首先,让AI帮我们设计下怪物的掉落物

image.png

生成的json小小排版了一下,如下

export let Monster = [
    {
        "id": 1,
        "name": "史莱姆",
        "type": "普通",
        "abilities": [
            {
                "name": "普通攻击",
                "damage": 10
            },
            {
                "name": "弹射攻击",
                "damage": 15
            }
        ],
        "drops": [
            {
                "id":1,
                "type": "道具",
                "name": "草药",
                "chance": 0.5
            },
            {
                "id":2,
                "type": "装备",
                "name": "铁剑",
                "chance": 0.2
            }
        ]
    },
    {
        "id": 2,
        "name": "骷髅兵",
        "type": "普通",
        "abilities": [
            {
                "name": "普通攻击",
                "damage": 20
            },
            {
                "name": "盾击",
                "damage": 15,
                "defense": 5
            }
        ],
        "drops": [
            {
                "id":3,
                "type": "道具",
                "name": "解毒草",
                "chance": 0.3
            },
            {
                "id":4,
                "type": "装备",
                "name": "铁盾",
                "chance": 0.1
            }
        ]
    }
            ,{
        "id": 3,
        "name": "火焰巨人",
        "type": "火焰",
        "abilities": [
            {
                "name": "火焰喷射",
                "damage": 30
            },
            {
                "name": "烈焰陷阱",
                "damage": 20,
                "dot": {
                    "damage": 5,
                    "turns": 3
                }
            }
        ],
        "drops": [
            {
                "id":5,
                "type": "道具",
                "name": "火之石",
                "chance": 0.2
            },
            {
                "id":6,
                "type": "装备",
                "name": "火焰护腕",
                "chance": 0.1
            }
        ]
    },
    {
        "id": 4,
        "name": "风暴元素",
        "type": "风暴",
        "abilities": [
            {
                "name": "风刃斩",
                "damage": 25
            },
            {
                "name": "狂风暴雨",
                "damage": 20,
                "dot": {
                    "damage": 10,
                    "turns": 2
                }
            }
        ],
        "drops": [
            {
                "id":7,
                "type": "道具",
                "name": "风之石",
                "chance": 0.3
            },
            {
                "id":8,
                "type": "装备",
                "name": "风暴长靴",
                "chance": 0.1
            }
        ]
    }

]

注意到drops下的掉落物品有个change字段,就是它的掉落几率,我们需要一个脚本,根据掉落几率抽掉落物品。交给AI

image.png

代码

// DropItem.ts 掉落物品脚本
export default class DropItem {
    private dropRates: { [itemId: number]: number } = {};

    // 添加掉落物品的几率
    public addDropRate(itemId: number, rate: number): void {
        this.dropRates[itemId] = rate;
    }

    // 根据几率随机掉落物品
    public getRandomItem(): number | null {
        const totalRate = Object.values(this.dropRates).reduce((acc, rate) => acc + rate, 0);
        const random = Math.random() * totalRate;

        let accumulateRate = 0;
        for (const itemId in this.dropRates) {
            if (this.dropRates.hasOwnProperty(itemId)) {
                accumulateRate += this.dropRates[itemId];
                if (random <= accumulateRate) {
                    return parseInt(itemId);
                }
            }
        }

        return null;
    }
}

image.png

代码

// 在游戏中使用 DropItem
const dropItem = new DropItem();
dropItem.addDropRate(1001, 0.2); // 物品ID为1001的掉落几率为20%
dropItem.addDropRate(1002, 0.5); // 物品ID为1002的掉落几率为50%
dropItem.addDropRate(1003, 0.3); // 物品ID为1003的掉落几率为30%

const randomItemId = dropItem.getRandomItem(); // 随机获取掉落的物品ID
if (randomItemId !== null) {
    console.log("掉落了物品ID为:" + randomItemId);
} else {
    console.log("没有掉落物品");
}

同时我自己整理了下UI生成的掉落物,得到一个物品列表

//道具列表
export let Item=[ {
    "id":1,
    "type": "道具",
    "name": "草药",
},
{
    "id":2,
    "type": "装备",
    "name": "铁剑",
},{
    "id":3,
    "type": "道具",
    "name": "解毒草",
},
{
    "id":4,
    "type": "装备",
    "name": "铁盾",
}, {
    "id":5,
    "type": "道具",
    "name": "火之石",
},
{
    "id":6,
    "type": "装备",
    "name": "火焰护腕",
} ,{
    "id":7,
    "type": "道具",
    "name": "风之石",
},
{
    "id":8,
    "type": "装备",
    "name": "风暴长靴",
}]

准备齐全,开始在结算面板接入掉落物

image.png

代码

// EndPanel.ts 结算界面脚本
const { ccclass, property } = cc._decorator;

@ccclass
export default class EndPanel extends cc.Component {
    @property(cc.Node)
    private itemList: cc.Node = null; // 用于显示掉落物品的列表节点

    // 显示掉落物品
    public showDroppedItems(itemIds: number[]): void {
        // 清空列表
        this.itemList.removeAllChildren();

        // 遍历掉落物品ID,创建列表项
        for (const itemId of itemIds) {
            const itemNode = new cc.Node("Item"); // 创建列表项节点
            const itemLabel = itemNode.addComponent(cc.Label); // 添加 Label 组件
            itemLabel.string = "物品ID:" + itemId; // 设置 Label 文字
            this.itemList.addChild(itemNode); // 添加到列表节点
        }
    }
}

把本次生成的代码粘贴进EndPanle.ts里 在UIManager里添加

@property(EndPanel)
public endPanelUI:EndPanel;

在Battle.ts胜利代码处加入

UIManager.getInstance().endPanelUI = endPanel.getComponent(EndPanel);
let monsterInfo = Monster.find(x=>x.id == this.monsterId)
let dropItemIds = []
// 在游戏中使用 DropItem
const dropItem = new DropItem();
for (let item of monsterInfo.drops){
    dropItem.addDropRate(item.id, item.chance); // 物品ID为1001的掉落几率为20%
}

const randomItemId = dropItem.getRandomItem(); // 随机获取掉落的物品ID
if (randomItemId !== null) {
    console.log("掉落了物品ID为:" + randomItemId);
    dropItemIds.push(randomItemId)
} else {
    console.log("没有掉落物品");
}

UIManager.getInstance().endPanelUI.showDroppedItems(dropItemIds);

测试下效果

5.gif