Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在每层打开新锁的地方实施调平系统的标准实施规程_Java - Fatal编程技术网

Java 在每层打开新锁的地方实施调平系统的标准实施规程

Java 在每层打开新锁的地方实施调平系统的标准实施规程,java,Java,下面是一个快速的场景。想象一下,我有一个地雷,可以从1级升级到3级 一级地雷:可以开采青铜。100马力 二级矿:可以开采银矿。200hp 三级采矿:可以开采黄金。300马力 我希望能够将地雷从一级升级到二级,再升级到三级。目前,我可以在一个类中完成这一切,并使用upgradeLevel()方法更新level和hp属性。然后,我的minebrown()、mineslver()和mineGold()方法可以只检查level属性,并在清除level需求的情况下执行操作。然而,这似乎不像java那样只有

下面是一个快速的场景。想象一下,我有一个地雷,可以从1级升级到3级

一级地雷:可以开采青铜。100马力

二级矿:可以开采银矿。200hp

三级采矿:可以开采黄金。300马力

我希望能够将地雷从一级升级到二级,再升级到三级。目前,我可以在一个类中完成这一切,并使用upgradeLevel()方法更新level和hp属性。然后,我的minebrown()、mineslver()和mineGold()方法可以只检查level属性,并在清除level需求的情况下执行操作。然而,这似乎不像java那样只有一个类自己完成所有更新。我想知道人们通常如何在java中实现升级/升级系统

我想到了一些基本的东西,比如下面的UML图:
我的看看/搜索有限状态机是如何在Java中实现的,这将是你的答案。如果使用一个类来完成所有这些,我不会有任何问题。过度复杂的事情并不总是好的;-)

我将使用您的简单示例来说明接口的使用和接口的多个具体类实现

public class Level1 implements Level {

    @Override
    public boolean isLevel(int level) {
        return (level == 1);
    }

    @Override
    public Player updateLevel(Player player) {
        player.setLevel(1);
        player.setMiningLevel(1);
        player.setMaximumHitPoints(100);
        return player;
    }
    
}
一级地雷:可以开采青铜。100马力

二级矿:可以开采银矿。200hp

三级采矿:可以开采黄金。300马力

如果采矿和生命点是升级所做的唯一事情,那么这种方法将过于工程化。当级别发生多个更改时,使用接口和具体类的威力就来了

首先,我们创建一个
Player
类。这是一个带有getter和setter的普通Java类

public class Player {
    private String name;
    
    private int level;
    private int maximumHitPoints;
    private int miningLevel;
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getLevel() {
        return level;
    }
    public void setLevel(int level) {
        this.level = level;
    }
    public int getMaximumHitPoints() {
        return maximumHitPoints;
    }
    public void setMaximumHitPoints(int maximumHitPoints) {
        this.maximumHitPoints = maximumHitPoints;
    }
    public int getMiningLevel() {
        return miningLevel;
    }
    public void setMiningLevel(int miningLevel) {
        this.miningLevel = miningLevel;
    }
}
此类将包含级别、挖掘级别和最大生命点的值

现在,您可以使用
if-else
语句列表或
switch
语句更新此类。当你有30个关卡和10个不同的关卡值时,这会很快变得混乱

因此,您要做的第一件事是创建一个级别接口。让我们称之为
级别

public interface Level {
    public boolean isLevel(int level);
    public Player updateLevel(Player player);
}
看起来很简单。现在,让我们看看这个接口的一个具体类实现

public class Level1 implements Level {

    @Override
    public boolean isLevel(int level) {
        return (level == 1);
    }

    @Override
    public Player updateLevel(Player player) {
        player.setLevel(1);
        player.setMiningLevel(1);
        player.setMaximumHitPoints(100);
        return player;
    }
    
}
是的,您必须为每个级别创建一个具体的类实现

最后,您将构建一个具体实现的
列表。
createLevels
方法将为每个级别设置一行。然后,当您想要更新玩家统计信息时,您只需像这样迭代
列表

Public class Levels {
    
    private List<Level> levels;
    
    public Levels() {
        this.levels = new ArrayList<>();
        createLevels();
    }
    
    private void createLevels() {
        this.levels.add(new Level1());
    }
    
    public void updatePlayer(Player player, int levelNum) {
        for (Level level : levels) {
            if (level.isLevel(levelNum)) {
                level.updateLevel(player);
                return;
            }
        }
    }
}
公共类级别{
私人名单级别;
公共级别(){
this.levels=新的ArrayList();
createLevels();
}
私有void createLevels(){
this.levels.add(新的Level1());
}
public void updatePlayer(Player-Player,int-levelNum){
用于(级别:级别){
if(level.isLevel(levelNum)){
级别。更新级别(玩家);
返回;
}
}
}
}
Public class Levels {
    
    private List<Level> levels;
    
    public Levels() {
        this.levels = new ArrayList<>();
        createLevels();
    }
    
    private void createLevels() {
        this.levels.add(new Level1());
    }
    
    public void updatePlayer(Player player, int levelNum) {
        for (Level level : levels) {
            if (level.isLevel(levelNum)) {
                level.updateLevel(player);
                return;
            }
        }
    }
}