簡體   English   中英

C#奇怪的類行為

[英]c# strange classes behavior

因此,即時通訊制作了小型統一游戲,並提供了一些與大型nubmer一起使用的課程

這是CurrLevel類的代碼

public class CurrLevel {

    public CurrLevel (int levelNum, string id) {
        valuesLevel = "pow" + levelNum.ToString();
        if(levelNum != 0){
            numberFormatSci = "10^" + levelNum.ToString();
        } else {
            numberFormatSci = "";
        }
        identificator = id;
    }
    public string valuesLevel;
    public string numberFormatSci;
    public string identificator;

    public int getValue(){
        return PlayerPrefs.GetInt(identificator+"-"+valuesLevel);
    }

    public void setValue(int value){
        PlayerPrefs.SetInt(identificator+"-"+valuesLevel, value);
    }

    public void add(int value){
        PlayerPrefs.SetInt(identificator+"-"+valuesLevel, PlayerPrefs.GetInt(identificator+"-"+valuesLevel) + value);
    }

    public void substract(int value){
        PlayerPrefs.SetInt(identificator+"-"+valuesLevel, PlayerPrefs.GetInt(identificator+"-"+valuesLevel) - value);
    }
}

這是SomeCurrency類的代碼

  public class SomeCurrency {
    public string identificator;
    public  CurrLevel[] levels = new CurrLevel[10];     

    public SomeCurrency(string id){
        identificator = id;
        for(int i = 0; i < 30; i=i+3){
            levels[i/3] = new CurrLevel(i, identificator);
        }
    }

    public void add(int power, double value){
        int full = (int) value;
        int leftover = (int) (value*1000 - full*1000);
        if(power >= 3){
            levels[power/3-1].add(leftover);
        }
        levels[power/3].add(full);
        updateValues();
    }

    public SomeCurrency copy(SomeCurrency CurrToCopy){
        SomeCurrency copy = new SomeCurrency(CurrToCopy.identificator);
        for(int i = 0; i < 30; i++){
            copy.levels[i/3] = CurrToCopy.levels[i/3];
        }
        return copy;
    }
    public void addAnotherCurrency(SomeCurrency anotherCurr){
        for(int i = 0; i < 30; i=i+3){
            this.add(i, anotherCurr.levels[i/3].getValue());
        }
        updateValues();
    }

    public bool substractAnotherCurrency(SomeCurrency anotherCurr){
        SomeCurrency buffer = copy(anotherCurr);
        Debug.Log(anotherCurr.levels[1].getValue());
        if(canSubstract(buffer)){
            Debug.Log(anotherCurr.levels[1].getValue());
            // for(int i = 27; i >= 0; i-=3){
            //  levels[i/3].substract(anotherCurr.levels[i/3].getValue());
            // }
            return true;
        } else {
            return false;
        }
    }

    public bool canSubstract(SomeCurrency fromWhereSubstract){
        bool possible = false;
        for(int i = 0; i < 30; i+=3){
            fromWhereSubstract.levels[i/3].substract(levels[i/3].getValue());
            if(i != 27){
                if(fromWhereSubstract.levels[i/3].getValue() < 0){
                    fromWhereSubstract.levels[i/3+1].substract(1);
                    fromWhereSubstract.levels[i/3].add(1000);
                }
            }
        }
        if(fromWhereSubstract.levels[9].getValue() < 0){
            possible = true;
        }
        return possible;
    }
    public void setValue(int power, double value){
        int full = (int) value;
        int leftover = (int) (value*1000 - full*1000);
        if(power >= 3){
            string beforeid = identificator+"-"+levels[power/3-1].valuesLevel;
            PlayerPrefs.SetInt(beforeid,leftover);
        }
        string thisid = identificator+"-"+levels[power/3].valuesLevel;
        PlayerPrefs.SetInt(thisid,full);
        updateValues();
    }

    public string getStringValue(){
        int maxlvl = 0;
        for(int i = 27; i >= 0; i=i-3){
            if(levels[i/3].getValue() > 0){
                maxlvl = i/3;
                break;
            }
        }
        string result = levels[maxlvl].getValue().ToString();
        if(maxlvl > 0){
            string leftover = levels[maxlvl-1].getValue().ToString();
            while(leftover.Length != 3){
                leftover = "0"+leftover;
            }
            result += "." + leftover + "*" + levels[maxlvl].numberFormatSci;
        }
        return result;
    }

    public void resetValues(){
        for(int i = 0; i < 30; i+=3){
            levels[i/3].setValue(0);
        }
    }

    private void updateValues(){
        for(int i = 0; i < 27; i=i+3){
            levels[i/3] = new CurrLevel(i, identificator);
            if(levels[i/3].getValue() >= 1000){
                levels[i/3].setValue(levels[i/3].getValue()-1000);
                levels[i/3+1].setValue(levels[i/3+1].getValue()+1);
            }
        }
    }
}

所以基本上,在代碼中我創建了SomeCurrency的新變量類型

  public NumberFormatting.SomeCurrency playerScore = new NumberFormatting.SomeCurrency("playerScore");
  public NumberFormatting.SomeCurrency playerClickValue = new NumberFormatting.SomeCurrency("playerClickValue");
    playerScore.resetValues();
    playerScore.add(6, 1.32);
    playerClickValue.resetValues();
    playerClickValue.add(3, 103.831);

然后,當玩家單擊按鈕時,我嘗試將另一個減去

    Debug.Log(playerClickValue.levels[1].getValue());
    Debug.Log(playerScore.substractAnotherCurrency(playerClickValue));

調試器首先打印103(click函數中playerClickValue.levels [1] .getValue()的原始值),然后再次打印103(從if(canSubstract(buffer)之前的函數substractAnotherCurrency)打印,但是在此canSubstract之后打印相同的變量顯示783的值。因此,我每次調用substractAnotherCurrency時,函數都會以某種方式更改playerClickValue的原始值。應如何更改以使playerClickValue保持不變,但仍可以檢查是否可以將其從另一個SomeCurrency中吸取,並在檢查是否可以之后-這樣做。

在C#中,對象是通過引用傳遞的,這意味着如果您以功能方式修改對象,則該對象將在所有地方被修改。 您可以閱讀有關它的更多信息,這在編碼時很重要。 似乎您嘗試在某處進行類似復制的操作,但根本不使用該復制。

另外,您確定要在canSubstact編輯變量嗎?

名稱建議if是否只會返回布爾值,什么也不會改變,但是您實際上會在其中調用substact

fromWhereSubstract.levels[i/3+1].substract(1);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM