繁体   English   中英

C#中基于索引/引用访问变量的有效方法

[英]Efficient way to access variable based on index/reference in C#

好的,键入问题标题,我知道我可以使用数组。 但是,我想知道C#中是否有替代方法供我尝试使用。

我有一个电子表格,其中包含要应用于我的游戏船的升级。 每个条目都有四列,这些列使用int来指定升级类型,另一列具有要应用的数量,从而允许每个项目进行四次升级。

因此,在我的“船体”电子表格中,我有upgd_1_type,upgd_2_type,upgd_3_type,upgd_4_type(它们涉及七个升级类型之一)和updg_1_amnt等,以说明应用的数量。

我刚刚输入了以下代码,这是一个很棒的switch语句,其中包含许多可怕的重复代码,这让我想知道是否有更好的方法来做事情。

    void GetHullUpgradeVals(GDEHullData hullDat){
    switch(hullDat.upgd_1_type){
        case (int)UPGRADES_HULL.COST:
            upg_Hull_cost *= 1/hullDat.upgd_1_amnt; break;
        case (int)UPGRADES_HULL.IMPACT_RES:
            upg_Hull_impactRes *= hullDat.upgd_1_amnt; break;
        case (int)UPGRADES_HULL.MASS:
            upg_Hull_mass *= 1/hullDat.upgd_1_amnt; break;
        case (int)UPGRADES_HULL.MAX_HEALTH:
            upg_Hull_mxhlth *= hullDat.upgd_1_amnt; break;
        case (int)UPGRADES_HULL.PICK_RAD:
            upg_Hull_pickRad *= hullDat.upgd_1_amnt; break;
        case (int)UPGRADES_HULL.REGEN:
            upg_Hull_regen *= hullDat.upgd_1_amnt; break;
        case (int)UPGRADES_HULL.PICK_RAD:
            upg_Hull_pickRad *= hullDat.upgd_1_amnt; break;
    }
    switch(hullDat.upgd_2_type){
        case (int)UPGRADES_HULL.COST:
            upg_Hull_cost *= 1/hullDat.upgd_2_amnt; break;
        case (int)UPGRADES_HULL.IMPACT_RES:
            upg_Hull_impactRes *= hullDat.upgd_2_amnt; break;
        case (int)UPGRADES_HULL.MASS:
            upg_Hull_mass *= 1/hullDat.upgd_2_amnt; break;
        case (int)UPGRADES_HULL.MAX_HEALTH:
            upg_Hull_mxhlth *= hullDat.upgd_2_amnt; break;
        case (int)UPGRADES_HULL.PICK_RAD:
            upg_Hull_pickRad *= hullDat.upgd_2_amnt; break;
        case (int)UPGRADES_HULL.REGEN:
            upg_Hull_regen *= hullDat.upgd_2_amnt; break;
        case (int)UPGRADES_HULL.PICK_RAD:
            upg_Hull_pickRad *= hullDat.upgd_2_amnt; break;
    }
    switch(hullDat.upgd_3_type){
        case (int)UPGRADES_HULL.COST:
            upg_Hull_cost *= 1/hullDat.upgd_3_amnt; break;
        case (int)UPGRADES_HULL.IMPACT_RES:
            upg_Hull_impactRes *= hullDat.upgd_3_amnt; break;
        case (int)UPGRADES_HULL.MASS:
            upg_Hull_mass *= 1/hullDat.upgd_3_amnt; break;
        case (int)UPGRADES_HULL.MAX_HEALTH:
            upg_Hull_mxhlth *= hullDat.upgd_3_amnt; break;
        case (int)UPGRADES_HULL.PICK_RAD:
            upg_Hull_pickRad *= hullDat.upgd_3_amnt; break;
        case (int)UPGRADES_HULL.REGEN:
            upg_Hull_regen *= hullDat.upgd_3_amnt; break;
        case (int)UPGRADES_HULL.PICK_RAD:
            upg_Hull_pickRad *= hullDat.upgd_3_amnt; break;
    }
    switch(hullDat.upgd_4_type){
        case (int)UPGRADES_HULL.COST:
            upg_Hull_cost *= 1/hullDat.upgd_4_amnt; break;
        case (int)UPGRADES_HULL.IMPACT_RES:
            upg_Hull_impactRes *= hullDat.upgd_4_amnt; break;
        case (int)UPGRADES_HULL.MASS:
            upg_Hull_mass *= 1/hullDat.upgd_4_amnt; break;
        case (int)UPGRADES_HULL.MAX_HEALTH:
            upg_Hull_mxhlth *= hullDat.upgd_4_amnt; break;
        case (int)UPGRADES_HULL.PICK_RAD:
            upg_Hull_pickRad *= hullDat.upgd_4_amnt; break;
        case (int)UPGRADES_HULL.REGEN:
            upg_Hull_regen *= hullDat.upgd_4_amnt; break;
        case (int)UPGRADES_HULL.PICK_RAD:
            upg_Hull_pickRad *= hullDat.upgd_4_amnt; break;
    }
}

我将用七个数组交换七个变量,并按索引进行引用,但是有没有一种方法可以根据索引选择变量? 诸如指针之类的东西可以给新变量提供对另一个变量的引用? 还有其他聪明的解决方案吗?

编辑:使用数组

    void GetHullUpgradeVals(GDEHullData hullDat){
    upgs_Hull[hullDat.upgd_1_type] = hullDat.upgd_1_amnt;
    upgs_Hull[hullDat.upgd_2_type] = hullDat.upgd_2_amnt;
    upgs_Hull[hullDat.upgd_3_type] = hullDat.upgd_3_amnt;
    upgs_Hull[hullDat.upgd_4_type] = hullDat.upgd_4_amnt;

    upgs_Hull[(int)UPGRADES_HULL.COST] = 1/upgs_Hull[(int)UPGRADES_HULL.COST];
    upgs_Hull[(int)UPGRADES_HULL.MASS] = 1/upgs_Hull[(int)UPGRADES_HULL.MASS];
}

我不知道更优雅的解决方案。

嗨,大卫,再次!

您可以创建自定义变量。 这将是参考变量。 嗯...

例如:

public class IntVariable{
    public int Value;
    public void DivideAndMultiply(){ // for example some method we can create
        Value *= 1 / Value;
    }
}

并使用它:

IntVariable upg_Hull_cost;
IntVariable upg_Hull_impactRes;
//.....

IntVariable GetVariable(UpgradeType type) {
    switch(type) {
        case UpgradeType.COST:
            return upg_Hull_cost;
        case UpgradeType.IMPACT_RES:
            return upg_Hull_impactRes;
            //....
    }
    return null;
}
///...
void GetHullUpgradeVals(GDEHullData hullDat){
     GetVariable(hullDat.upgd_1_type).Value = hullDat.upgd_1_amnt;
     GetVariable(hullDat.upgd_2_type).Value = hullDat.upgd_2_amnt;
     //...
     GetVariable(UPGRADES_HULL.COST).DivideAndMultiply();
}

希望这会帮助您寻找其他解决方案。

您可以在游戏中将ScriptableObjects用于数据库,物品,升级,AI等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM