RPG 多重状态效果
RPG Multiple Status Effects
我正在尝试实现的 class 将处理角色的不同状态效果。想想神奇宝贝,一只神奇宝贝既可以麻痹又可以中毒。
为此,我首先想到了一个文件,其中存储了所有不同的状态效果,全部是 public final static List<String> effects
。然后我想尝试将其作为 bitfield
来做。在我尝试了这个之后不确定哪个是最好的方法,但是这是 CodeReview 而不是 Whosebug 的问题。现在我想让这段代码起作用。
public class CharacterStatus {
public static final int EFFECTS_MAX = 7;
public enum StatusFlags {
DEAD (1<<0),
PARALYZED (2<<0),
SLEEPING (3<<0),
CONFUSED (4<<0),
POISONED (5<<0),
BURNING (6<<0),
FROZEN (7<<0);
private final long status;
StatusFlags (long status) {
this.status = status;
}
public long getStatus () {
return status;
}
}
public CharacterStatus () {
// declare a Status Flag with all bits set to 0
}
public setBit (String effect) {
// It should set the correct bit Based on DEAD, PARALYZED etc
}
public clearBit (String effect) {
// It should clear the correct bit Based on DEAD, PARALYZED etc
}
public setBit (int b) {
// It should set the correct bit Based on DEAD, PARALYZED etc
}
public clearBit (int b) {
// It should clear the correct bit Based on DEAD, PARALYZED etc
}
public long getValue () {
return statusFlags.getStatus();
}
public String getValueAsString (String d) {
String s = "";
d = "|";
int currentEffect = EFFECTS_MAX;
for (int i = EFFECTS_MAX; statusFlags.getStatus() > 0; i--) {
if (statusFlags.getStatus() > Math.pow(2, i)) {
// load effect #i based on the StatusFlags
s+= EFFECT#i + d;
}
}
s.substring(0, s.length()-d.length());
return s;
}
}
此代码中有很多是伪代码,例如 s+= EFFECT#i + d;
应该根据 i
拥有的号码获取标志的名称。
迷你版Character.java
public abstract class Character
{
// alive and well
private final CharacterStatus characterStatus = new CharacterStatus ();
/**
* @return the status of this character
*/
public CharacterStatus getCharacterStatus () {
return characterStatus;
}
}
说明:我想做的是为 Character
存储 StatusFlags
并能够操作和打印不同的标志。例如在战斗中 A 对 B 施放毒药攻击。这将导致 B.getCharacterStatus().setBit("POISONED");
这里是一个使用 EnumSet 而不是位标志的修改。修改为自成体系(我写在ideone里面)
import java.util.*;
import java.lang.*;
import java.io.*;
class CharacterStatus
{
public enum StatusFlags {
DEAD,
PARALYZED,
SLEEPING,
CONFUSED,
POISONED,
BURNING,
FROZEN;
}
private EnumSet<StatusFlags> status;
public EnumSet<StatusFlags> getStatus () {
return this.status;
// you could return another format if you like, e.g., string array
}
public String toString() {
String s = "";
for (StatusFlags stat : this.status){
s+= stat.toString()+"\n";
}
return s;
}
public CharacterStatus () {
this.status = EnumSet.noneOf(StatusFlags.class);
// declare a Status Flag with all bits set to 0
}
public void setBit(StatusFlags effect) {
this.status.add(effect);
// It should set the correct bit Based on DEAD, PARALYZED etc
}
public void clearBit (String effect) {
this.status.remove(effect);
// It should clear the correct bit Based on DEAD, PARALYZED etc
}
public static void main (String[] args) throws java.lang.Exception
{
CharacterStatus status = new CharacterStatus ();
status.setBit (StatusFlags.CONFUSED);
System.out.println(status.toString());
}
}
我正在尝试实现的 class 将处理角色的不同状态效果。想想神奇宝贝,一只神奇宝贝既可以麻痹又可以中毒。
为此,我首先想到了一个文件,其中存储了所有不同的状态效果,全部是 public final static List<String> effects
。然后我想尝试将其作为 bitfield
来做。在我尝试了这个之后不确定哪个是最好的方法,但是这是 CodeReview 而不是 Whosebug 的问题。现在我想让这段代码起作用。
public class CharacterStatus {
public static final int EFFECTS_MAX = 7;
public enum StatusFlags {
DEAD (1<<0),
PARALYZED (2<<0),
SLEEPING (3<<0),
CONFUSED (4<<0),
POISONED (5<<0),
BURNING (6<<0),
FROZEN (7<<0);
private final long status;
StatusFlags (long status) {
this.status = status;
}
public long getStatus () {
return status;
}
}
public CharacterStatus () {
// declare a Status Flag with all bits set to 0
}
public setBit (String effect) {
// It should set the correct bit Based on DEAD, PARALYZED etc
}
public clearBit (String effect) {
// It should clear the correct bit Based on DEAD, PARALYZED etc
}
public setBit (int b) {
// It should set the correct bit Based on DEAD, PARALYZED etc
}
public clearBit (int b) {
// It should clear the correct bit Based on DEAD, PARALYZED etc
}
public long getValue () {
return statusFlags.getStatus();
}
public String getValueAsString (String d) {
String s = "";
d = "|";
int currentEffect = EFFECTS_MAX;
for (int i = EFFECTS_MAX; statusFlags.getStatus() > 0; i--) {
if (statusFlags.getStatus() > Math.pow(2, i)) {
// load effect #i based on the StatusFlags
s+= EFFECT#i + d;
}
}
s.substring(0, s.length()-d.length());
return s;
}
}
此代码中有很多是伪代码,例如 s+= EFFECT#i + d;
应该根据 i
拥有的号码获取标志的名称。
迷你版Character.java
public abstract class Character
{
// alive and well
private final CharacterStatus characterStatus = new CharacterStatus ();
/**
* @return the status of this character
*/
public CharacterStatus getCharacterStatus () {
return characterStatus;
}
}
说明:我想做的是为 Character
存储 StatusFlags
并能够操作和打印不同的标志。例如在战斗中 A 对 B 施放毒药攻击。这将导致 B.getCharacterStatus().setBit("POISONED");
这里是一个使用 EnumSet 而不是位标志的修改。修改为自成体系(我写在ideone里面)
import java.util.*;
import java.lang.*;
import java.io.*;
class CharacterStatus
{
public enum StatusFlags {
DEAD,
PARALYZED,
SLEEPING,
CONFUSED,
POISONED,
BURNING,
FROZEN;
}
private EnumSet<StatusFlags> status;
public EnumSet<StatusFlags> getStatus () {
return this.status;
// you could return another format if you like, e.g., string array
}
public String toString() {
String s = "";
for (StatusFlags stat : this.status){
s+= stat.toString()+"\n";
}
return s;
}
public CharacterStatus () {
this.status = EnumSet.noneOf(StatusFlags.class);
// declare a Status Flag with all bits set to 0
}
public void setBit(StatusFlags effect) {
this.status.add(effect);
// It should set the correct bit Based on DEAD, PARALYZED etc
}
public void clearBit (String effect) {
this.status.remove(effect);
// It should clear the correct bit Based on DEAD, PARALYZED etc
}
public static void main (String[] args) throws java.lang.Exception
{
CharacterStatus status = new CharacterStatus ();
status.setBit (StatusFlags.CONFUSED);
System.out.println(status.toString());
}
}