我有一个类"水平"我在java编码,但它可以是任何面向对象的语言。
在这个类中,我有两个静态变量:
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
变得容易,你可以循环遍历数组并将所有值相加以获得所有关卡的星星总数。
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];
获取如下sum:
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方法。
这里的好处是你不需要担心计算星星的总数。它会自动为你完成。在添加另一个enum值时也同样适用。
您也不需要担心查找数组或映射来查找星星,只需在适当的枚举值上调用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
值需要存储),您不会存储太多。
在这种情况下,ArrayList
更容易添加值。例如,如果级别的数量超出了您的预期,那么它不必像数组一样调整大小,而是可以添加。
然后我确定你有或将有一个绑定到每个特定级别的级别号。这只是一个数字,表示用户当前正在玩的关卡。这看起来像' getCurrentLevelNum()
'。
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
值将由您自己决定,这将是一个漫长,艰巨的,手动过程。我建议当你为每个关卡制作一个单独的类时,你应该给出一个数字来代表关卡。这将存储在public
方法中,如getLevelNum()
。这样,您就可以更有组织地管理ArrayList
。你可以将ArrayList
中元素的编号设置为关卡的getLevelNum()
方法的编号。
尝试在每个关卡类中创建一个静态方法,返回用户可以获得的星星数量,然后创建一个关卡数组列表;之后,您只需遍历关卡并调用该方法即可。