我有一个“Level”类我在java编码,但它可以是任何面向对象的语言。
在该课程中,我有2个静态变量:
int ID;
int STARSREWARD;
在比赛期间,每当玩家完成一个等级时,他就会获得一定数量的星星奖励,由STARSREWARD的值定义。
例如:
等
在我的代码中,每当玩家开始一个等级时我设置STARSREWARD的值,即当玩家只开始玩等级1时,没有设置等级为STARSREWARD的值。但是每个STARSREWARD值都是静态的并且已经是写在代码中。
有没有办法直接计算所有等级的星数总和? 在我的例子中,它将是1 + 3 + 2 = 6。
答案 0 :(得分:2)
将这些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(该函数会为你处理这个问题。)
答案 1 :(得分:2)
枚举如何:
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方法。
答案 2 :(得分:1)
您可以使用Map数据结构,并将关卡编号和星号作为值添加。
答案 3 :(得分:1)
我会尽我所能帮助你。好吧,所以我到目前为止所理解的是你已经为每个级别设置了预定数量的星星,但是当玩家开始说明级别时你想要为该特定级别设置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
值。
在这种情况下,ArrayList
更容易添加值。例如,如果级别数超出预期,则不必像数组那样调整大小,而是可以添加。
然后我确定您已经或将要有一个与每个特定级别绑定的级别编号。这只是一个数字,表示用户当前正在播放的级别。这看起来像&#39; getCurrentLevelNum()
&#39;。
通过这个你可以检查一个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
和方法{ {1}}来自上一段代码:
buildStarValues()
要添加它,您只需添加一个STARREWARDTOT变量,并在每次用户完成关卡时添加它。
重要:无论哪种方式,考虑到您的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
值将由您自己决定,这将是一个漫长,艰巨,手动过程。我建议当你为每个级别创建一个单独的类时,你给出一个代表级别的数字。这将存储在STARREWARD
方法中,如public
。这样,您就可以在更有组织的事务中管理getLevelNum()
。您可以将ArrayList
中的元素编号设置为级别ArrayList
方法的编号。
我希望这可能有助于或者至少引发了一些想法。如果您对任何事情感到困惑或感到有问题,请随时提出或纠正我。
答案 4 :(得分:-1)
尝试在每个Level-类中创建一个静态Method,返回用户可以获得的星数,然后创建一个LevelList;之后你只需要遍历关卡并调用方法。