基于c#实现游戏装备系统(基础篇)

基于c#实现游戏装备系统(基础篇)

摘要

作为游戏中的重要组成部分,装备是重中之重,那么装备系统的代码应该怎么实现呢?

基础

  • 我们先定义一个类,作为我们所定义的人物:

    class People
    {
    	public int Attack;//攻击
    	public int Defence;//防御
    	public int Speed;//速度
        public Dictionary<EquipPlace, Equips> MyEquips = new Dictionary<EquipPlace, Equips>();//自身装备
    }
    

    作为例子,仅仅设定它的三个基础属性

  • 对于装备,我们需要设定它的适配位置,用枚举来表示:

    enum EquipPlace
    {
        Weapon,//武器
        Clothes,//护甲
        LHand,//左护腕
        RHand//右护腕
    }
    

    作为例子,这里仅设定了4个类型

  • 然后我们需要设定装备类:

class Equips
{
	public string Name;//名称
	public int ID;//编号
	public string Attack;//攻击加成
	public string Defence;//防御加成
	public string Speed;//速度加成
	public EquipPlace Adapt;//适配位置
	public Equips Copy()//拷贝一份装备,用以装上装备时的计算
	{
    	Equips e = new Equips();
   		FieldInfo[] fi = GetType().GetFields();//获取装备类的所有公共字段
    	foreach (FieldInfo field in fi)
    	{
    	    field.SetValue(e, field.GetValue(this));//将自身的所有公共字段赋值给e的对应字段
    	}
    	return e;
	}
}

至于为什么攻击、防御、速度加成类型是string而不是int,有特殊用法,后续会讲到

  • 紧接着我们需要设定装备的初始化,让每个装备都有不同的属性加成,这块用作初始化Equips类:

    public Equips(int ID)//以ID作为装备识别区分
    {
        this.ID = ID;
        switch (ID)
        {
            case 0:
                Attack = "i80";
                Defence = "i0";
                Speed = "i0";
                Adapt = EquipPlace.Head;
                break;
            case 1:
                Attack = "i0";
                Defence = "i50";
                Speed = "i20";
                Adapt = EquipPlace.Clothes;
                break;
            case 2:
                Attack = "i0";
                Defence = "i10";
                Speed = "i15";
                Adapt = EquipPlace.LHand;
                break;
            case 3:
                Attack = "i0";
                Defence = "i10";
                Speed = "i15";
                Adapt = EquipPlace.RHand;
                break;
            case 4:
                Attack = "f0.3";
                Defence = "i0";
                Speed = "i0";
                Adapt = EquipPlace.Head;
                break;
            case 5:
                Attack = "i0";
                Defence = "f0.2";
                Speed = "f0.05";
                Adapt = EquipPlace.Clothes;
                break;
        }
    }
    

    代码设定部分不作过多解释,因为举例,所有没有采用策划文案也仅仅只设计了六个装备,其中0-3为一整套。在此需要重点解释下加成中的fi

    i表示int说明加成部分是以整数相加,即在原有的基础上直接加上一个数

    f表示float说明加成部分是浮点数相乘,即在原有基础上加上原有基础乘以一个表示百分比的浮点数

  • 紧接着就可以写装上装备和卸下装备的函数了

    装上装备:

public void EquipEquipments(Equips Equipment)
{
    if (MyEquips.ContainsKey(Equipment.Adapt))//如果存在同位置的装备则先卸下原有装备
    {
        UnloadEquipments(MyEquips[Equipment.Adapt]);
    }
    Equipment = Equipment.Copy();//拷贝一份装备,防止修改原有属性
    if (Equipment.Attack.Substring(0, 1) == "f")
    {
        Equipment.Attack = "i" + (int)(Attack * float.Parse(Equipment.Attack.Remove(0, 1)) + 0.5f);//将百分比加成改为整数加成,方便后续计算
    }
    Attack += int.Parse(Equipment.Attack.Remove(0, 1));//在原基础上加成
    if (Equipment.Defence.Substring(0, 1) == "f")
    {
        Equipment.Defence = "i" + (int)(Defence * float.Parse(Equipment.Defence.Remove(0, 1)) + 0.5f);
    }
    Defence += int.Parse(Equipment.Defence.Remove(0, 1));
    if (Equipment.Speed.Substring(0, 1) == "f")
    {
        Equipment.Speed = "i" + (int)(Speed * float.Parse(Equipment.Speed.Remove(0, 1)) + 0.5f);
    }
    Speed += int.Parse(Equipment.Speed.Remove(0, 1));
    MyEquips.Add(Equipment.Adapt, Equipment);//添加装备到自身装备列表
}

卸下装备:

public void UnloadEquipments(Equips Equipment)
{
    Attack -= int.Parse(Equipment.Attack.Remove(0, 1));//减去加成整数
    Defence -= int.Parse(Equipment.Defence.Remove(0, 1));
    Speed -= int.Parse(Equipment.Speed.Remove(0, 1));
    MyEquips.Remove(Equipment.Adapt);//从自身装备列表中去掉该装备
}

以上两个函数均写在People这个类中

  • 最后我们给People这个类添加个打印的函数:

    public void Print()
    {
        Console.WriteLine("装备列表:");
        foreach (EquipPlace qp in MyEquips.Keys)
        {
            Console.WriteLine(qp.ToString() + ":" + MyEquips[qp].ID);
        }
        Console.WriteLine("攻击:" + Attack);
        Console.WriteLine("防御:" + Defence);
        Console.WriteLine("速度:" + Speed);
        Console.WriteLine();
    }
    

    这个函数用以输出人物的信息

  • 最后我们在Main中测试下功能:

    static void Main(string[] args)
    {
        People Me = new People();
        Equips[] AllEquipments = new Equips[6];
        for (int i = 0; i < 6; i++)
        {
            AllEquipments[i] = new Equips(i);
        }
        Me.Attack = 20;
        Me.Defence = 10;
        Me.Speed = 30;
        Me.Print();
        Me.EquipEquipments(AllEquipments[0]);
        Me.Print();
        Me.EquipEquipments(AllEquipments[1]);
        Me.Print();
        Me.EquipEquipments(AllEquipments[2]);
        Me.Print();
        Me.UnloadEquipments(AllEquipments[1]);
        Me.Print();
        Me.EquipEquipments(AllEquipments[4]);
        Me.Print();
        Me.EquipEquipments(AllEquipments[0]);
        Me.Print();
        Console.Read();
    }
    

    输出信息如下:
    在这里插入图片描述

到此为止,我们就实现了最基本的装备系统。
下一节将会讲解实现更为复杂的装备系统(包括不同职业加成,套装等等)

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值