[英]How to calculate a sum from my class variables?
我有一个用Java编写的“级别”类,但是它可以是任何面向对象的语言。
在该类中,我有2个静态变量:
int ID;
int STARSREWARD;
在游戏中,玩家每次完成一个关卡,都会获得一定数量的星星,这由STARSREWARD的值来定义。
例如:
等等
在我的代码中,只要播放器开始播放一个级别,我就设置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
值仅仅是因为您不会存储太多,因为考虑到您很可能将拥有两位数的级别(意味着要存储的STARREWARD
值STARREWARD
)。
在这种情况下,使用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.