繁体   English   中英

如何从我的班级变量计算总和?

[英]How to calculate a sum from my class variables?

我有一个用Java编写的“级别”类,但是它可以是任何面向对象的语言。

在该类中,我有2个静态变量:

int ID;
int STARSREWARD;

在游戏中,玩家每次完成一个关卡,都会获得一定数量的星星,这由STARSREWARD的值来定义。

例如:

  • 1级,STARSREWARD = 1
  • 对于级别2,STARSREWARD = 3
  • 对于级别3,STARSREWARD = 2

等等

在我的代码中,只要播放器开始播放一个级别,我就设置STARSREWARD的值,即当播放器仅开始播放一个级别1时,未设置级别10的STARSREWARD的值。但是,每个STARSREWARD值都是静态的,并且已经写入了码。

有没有一种方法可以直接计算所有级别的恒星总数? 在我的示例中为1 + 3 + 2 = 6。

将这些STARSREWARD值存储在数组STARSREWARD是最有意义的。 这将使访问STARSREWARD每个级别STARSREWARD容易,并且您可以遍历数组并累加所有值以获得所有级别的星星总数。

static int[] STARSREWARDS = new int[numLevels];
STARSREWARDS[0] = 1; // level 1
STARSREWARDS[1] = 3; // level 2
STARSREWARDS[2] = 2; // level 3
// etc...

像这样访问:

// subtract 1, since the indices start at 0, and level starts at 1
STARSREWARDS[currentLevel - 1];

得到这样的总和:

int sum = 0;
for(int i = 0; i < STARSREWARDS.length; i++) {
    sum += STARSREWARDS[i];
}

附加说明:如果多次获得总和,则可以将该循环放入函数中。 另外,如果可以在首次初始化原始的级别数组之后添加更多级别,则可以使用ArrayList而不是Array 另外,您可以创建一个函数来根据级别获取星数,因此不必担心每次获取级别的星数时都会从级别数中减去1(该函数可以处理为了你)。

枚举怎么样:

public enum StarsReward {   

    LEVEL_1(1),LEVEL_2(3),LEVEL_3(2);

    private int stars;

    private static int starsTotal;

    StarsReward(int stars) {
        this.stars = stars;
        addToStarsTotal(stars);
    }

    public int getStars() {
        return stars;
    }

    private static void addToStarsTotal(int stars) {
    starsTotal += stars;    
}

    public static int getStarsTotal() {
        return starsTotal;  
    }

}

然后使用静态getStarsTotal方法。

这样做的好处是您不必担心计算星星总数。 它会自动为您完成。 添加另一个枚举值时也是如此。

您也不必担心查找数组或映射来找到星星,只需在适当的枚举值上调用getStars方法即可。

您可以只使用Map数据结构,然后将级别编号添加为键,将星数添加为值。

我将尽力为您提供帮助。 好的,到目前为止,我了解的是,您已经为每个级别设置了预定数量的星星,但是,您希望在玩家开始该级别时为该特定级别设置STARSREWARD

我假设您已确定对每种特定的恒星值都有某种存储方式。 这种方法可能与使用数组或ArrayList 一个例子是;

ArrayList<Integer> starvalues = new ArrayList<Integer>();
starvalues.add(1);
starvalues.add(3);
starvalues.add(2);
// More starvalues additions ///

要么

// A really shoddy method of inputting random values ///
// (IN OTHER WORDS, NOT RECOMMENDED IN THE LEAST BIT!) ///
int[] starvalues = new int[];
starvalues[0] == 1;
starvalues[1] == 3;
starvalues[2] == 2;

我个人推荐ArrayList来存储STARREWARD值仅仅是因为您不会存储太多,因为考虑到您很可能将拥有两位数的级别(意味着要存储的STARREWARDSTARREWARD )。

在这种情况下,使用ArrayList可以更轻松地添加值。 例如,如果级别数超出了您的期望,则不必像数组那样调整大小,而可以添加数组。

然后,我确定您已经或将有一个绑定到每个特定级别的级别编号。 这只是代表用户当前正在播放的级别的数字。 这看起来像是“ getCurrentLevelNum() ”。

有了这个,您将可以检查一个for循环,它是您的总级别数的大小。 代码看起来像这样:

for(int i = 0; i < totalLevelNum; i++){
// i May start at whichever number you started first level at ///
    if(i == getCurrentLevelNum()){
        STARREWARD = starvalues.get(i);
    }
}

我意识到您提到STARREWARD变量是static ,但是对您来说效果不佳。 随着用户的进步,它会不断地被修改,因此将其保持为static无疑会带来不便。 我建议将其public并放在您的游戏课程中。

我还建议为此使用单独的方法。 (您可能应该将它们作为测试类复制粘贴到实际的编辑器中,以便可以更好地对其进行查看。)该类最终将看起来像这样:

(请记住,这只是一个例子)

import java.util.ArrayList;

public class GameTest{
    private ArrayList<Integer> starvalues = new ArrayList<Integer>(); // An ArrayList of type Integer ///
    private int STARREWARD; // the Star reward's variable ///
    private int levelNum; // The Level Num variable ///


    public GameTest(){
        // This is used to make an object so we can test GameTest's methods with our static main() method ///
    }


    // Build Star Values (stores the STARREWARD values in order of each level) ///
    public void buildStarValues(){
        starvalues.add(1); // Level 0;
        starvalues.add(3); // Level 1;
        starvalues.add(2); // Level 2;
        // More STARREWARD additions here ///
    } // end buildStarValues()


    // Get Current Level Num (Get's the current level the user is on) ///
    public int getCurrentLevelNum(){
        // Let's say the user chooses Level 1 ///
        return levelNum = 1;
        // This is only an example. This is the number representing the level the user chooses.
    } // end getCurrentLevelNum()


    // Set Star Reward Value (Checks level number and sets the STARREWARD variable accordingly, and then returns it) ///
    public int getStarRewardValue(){
        stop:{ // Used to jump out of for-loop once you set STARREWARD
            for(int i = 0; i < starvalues.size(); i++){
                if(i == getCurrentLevelNum()){
                    STARREWARD = starvalues.get(i);
                }
            }
        }
        return STARREWARD; // return statement
    } // end setStarRewardValue()


    // Main ///
    public static void main(){
        GameTest g = new GameTest();
        g.buildStarValues();
        System.out.println("STARREWARD = " + g.getStarRewardValue());
    } // end main()
} // end class

您还可以使用switch-case语句,如果您计划制作级别数为负的等,则可能更有用。这将摆脱ArrayList starvalues和先前代码中的buildStarValues()方法:

public class GameTest2{ // Class with switch-case (No ArrayList) ///
    private int STARREWARD; // the Star reward's variable ///
    private int levelNum; // The Level Num variable ///


    // Game Test 2 ///
    public GameTest2(){
        // This is used to make an object so we can test GameTest2's methods with our static main() method ///
    } // end gameTest2()


    // Get Current Level Num (Get's the current level the user is on) ///
    public int getCurrentLevelNum(){
        // Let's say the user chooses Level 1 ///
        return levelNum = 1;
        // This is only an example. This is the number representing the level the user chooses.
    } // end getCurrentLevelNum()


    // Set Star Reward Value (Checks level number and sets the STARREWARD variable accordingly, and then returns it) ///
    public int getStarRewardValue(){
        switch(getCurrentLevelNum()){
            case 0: STARREWARD = 1; break;
            case 1: STARREWARD = 3; break;
            case 2: STARREWARD = 2; break;
            // More switch-case statements ///
        }
        return STARREWARD; // return statement
    } // end setStarRewardValue()


    // Main ///
    public static void main(){
        GameTest2 g = new GameTest2();
        System.out.println("STARREWARD = " + g.getStarRewardValue());
    } // end main()
} // end class

要添加它,您只需添加一个STARREWARDTOT变量,并在用户每次完成关卡时添加到该变量。

重要提示 :无论哪种方式,考虑到您的STARREWARD值将由您自己决定,这将是一个漫长而艰巨的手动过程 我建议,当您为每个级别创建一个单独的类时,请提供一个数字来代表该级别。 这将存储在诸如getLevelNum()public方法中。 这样,您可以以更有条理的方式管理ArrayList 您可以将ArrayList元素的数量设置为该级别的getLevelNum()方法的数量。

我希望这可能对您有所帮助或至少激发了一些想法。 如果您对任何事情感到困惑或觉得有什么问题,请随时询问或纠正我。

尝试在每个Level-class中创建一个静态方法,该方法返回用户可获得的星数,然后创建一个Levels的ArrayList; 之后,您只需要遍历各个级别并调用该方法即可。

暂无
暂无

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

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