有没有办法将静态变量的值重置为初始状态?例如:
我有很多变量,它们包含分数,速度等。所有这些变量在程序执行期间都在变化。因此,当用户在游戏中失败时,我想将所有变量重置为其初始状态。有什么办法吗?因为我不知道在我的程序中为EACH变量手动执行此操作是否是个好主意。例如:
static int SCORE = 0;
static float SPEED = 2.3f;
public void resetGame() {
SCORE = 0;
SPEED = 2.3;
}
答案 0 :(得分:14)
使用对象,并在构造函数中设置其初始状态:
public class GameSettings {
private int score = 0;
private float speed = 2.3F;
// methods omitted for brevity
}
...
public void resetGame() {
gameSettings = new GameSettings();
}
另外,请尊重Java命名约定。 ALL_CAPS保留给常量。变量应该是lowerCase。
答案 1 :(得分:3)
存储默认值。
static final int DEFAULT_SCORE = 0;
static final float DEFAULT_SPEED =2.3;
static int SCORE = DEFAULT_SCORE;
static float SPEED = DEFAULT_SPEED;
public static void resetGame() {
SCORE = DEFAULT_SCORE;
SPEED = DEFAULT_SPEED;
}
答案 2 :(得分:2)
为什么不重新创建对象,如果你想重置它?然后它隐含地具有默认值。
答案 3 :(得分:1)
您可以只声明没有值的变量,并使用方法initGamestate()
将所有变量设置为初始值。在应用程序初始化和用户启动新游戏时调用此函数。
更面向对象的解决方案是使class GameState
具有所有这些变量并在其构造函数中设置默认值。然后,您可以通过使用new GameState();
答案 4 :(得分:0)
你只需要逐个重置它们。如果您担心拼写错误,可以执行:int initialscore = 0; int score = initialscore;
,然后将其重置为函数中的initial...
变量。
答案 5 :(得分:0)
我有很多变量,包括分数,速度等
您应该将它们全部放入一个类中,并且每个成员都会被初始化(如果默认值不起作用)。 您将在一个对该类对象的引用中保持玩家的状态。要重置,只需创建此类的新对象并将其分配给引用。
答案 6 :(得分:0)
通常游戏使用多个线程(例如,当使用Swing或绘制任何图形时),例如所以输入不会被阻止。这意味着使用所有其他解决方案,您可能会遇到竞争条件。这solution of Evan Knowles最接近。
我建议使用不可变的GameState
类,例如
public GameState {
private final int score;
private final int speed;
// initial state/"reset game"
public GameState() {
score = 0;
speed = 2.3;
}
// Private so we are always in a valid state
private GameState(int _score, int _speed) {
score = _score;
speed = _speed;
}
public GameState updateSpeed(int _speed) { return new GameState(this.score, _speed); }
public GameState updateScore(int _score) { return new GameState(_score, this.speed); }
public int getSpeed() { return speed;}
public int getScore() { return score;}
// add getters, setters and whatsoever here. But watch for proper synchronization between threads!
}
这里的优点是,一旦分配了值,就不能再从外部更改它们("不可变" /只读),因此不存在并发问题。另外,你可以免费获得一种chaing(见下文)!此外,您可以安全地(取消)序列化游戏状态以保存/加载游戏。
实际上,每个GameState
代表finite state machine中的一个州。调用updateSpeed或updateScore是向新状态的转换。
公共默认构造函数是到状态机初始状态的转换。
另一方面,状态机是有限的,因为得分和速度的值范围是有限的,因此它们的所有组合都会导致有限的状态。
我现在假设你做其他游戏的课程称为Game
。
public Game {
private volatile GameState gameState = new GameState();
public void resetGame() {
gameState = new GameState();
}
// Just an example
public increaseSpeed(int _additionalSpeed) {
gameState = gameState.updateSpeed(gameState.getSpeed() + _additionalSpeed);
}
// Change more than one value
public changeBoth(int _newSpeed, int _newScore) {
// First way: Create a new GameState, change both values step by step and then assign afterwards.
GameState _newState = gameState.updateScore(_newScore);
// other computations follow
// Do NOT assign to gameSpate here, because the state would be inconsistent then.
_newState = _newState.updateSpeed(_newSpeed);
// At the END of the method, assign the new game state. That ensures that the state is always valid
gameState = _newState;
// Second way: Use method chaining if you don't need to make other computations in between. Again, do this at the end of the method
gameState = gameState.updateScore(_newScore).updateSpeed(_newSpeed);
}
}
volatile
关键字确保每个线程都看到gameState
变量的相同值。您也可以考虑使用其他同步/锁定技术。或者,您可以将gameState
字段设为静态,如果只有一个Game对象,则跳过volatile
关键字。
因为GameState
是不可变的(只读),所以现在游戏的状态始终是一致/有效的。
答案 7 :(得分:-1)
一种好方法是使用静态init()并在发生异常时调用它。
package com.kvvssut.misc;
public class ResetStatic {
private static int SCORE = 0;
private static float SPEED = 2.3f;
private static void init() {
SCORE = 0;
SPEED = 2.3f;
}
public static void main(String[] args) {
SCORE = 100;
SPEED = 230.3f;
try {
throw new RuntimeException();
} catch (Exception e) {
init();
}
System.out.println(SCORE);
System.out.println(SPEED);
}
}