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());
    }
}