Java if语句检查

时间:2014-02-13 03:35:37

标签: java if-statement minecraft

我正在制作一个糟糕的2D重拍“我的世界”作为java中的一个类项目,我有一个制作工作台的东西(或者其他任何东西)我有一个if语句来检查你是否有一块木头在左上方,在其他3个中没有任何东西,或者如果右上方有一块木头,而另外3个中没有任何东西,依此类推......

我正在使用的以下if语句似乎让你在同一时间在多个插槽中有一个“木头”块,但仍然可以让你获得“木板”块。({{ 1}} - id1代表制作工作台的插槽)2x2制作工作台id4是木块,Tile.wood基本上是空块或什么都没有。

Tile.blank

所以再一次,你应该只允许一次在一个地方有一个街区,否则它什么都不做。

我如何解决这个问题,以便只有四个插槽中只有一个“木块”才能获得“木板”块?

3 个答案:

答案 0 :(得分:2)

if条件看起来不整洁但会完美无缺。但是,您可以模块化它以便更好地理解和调试。

创建一些实用工具方法为您完成工作,如下所示:

boolean isWood(<id object>) {
     if(Tile.wood.equals(<id object>))
          return true;
     else 
          return false;
}

boolean isBlank(<id object>) {
    if(Tile.blank.equals(<id object>))
          return true;
    else 
          return false;
}

void doProcess(){
    Inventory.inv_result.id = Tile.plank;
    Inventory.inv_result.blockNum += 4;
    System.out.println("You can have 4 planks");
}

然后重写你的if条件,如下所示

if(isWood(id1.id) && isBlank(id2.id) && isBlank(id3.id) && isBlank(id4.id))
     doProcess();
else if(isWood(id2.id) && isBlank(id1.id) && isBlank(id3.id) && isBlank(id4.id))
     doProcess();
else if(isWood(id3.id) && isBlank(id2.id) && isBlank(id1.id) && isBlank(id4.id))
     doProcess();
else if(isWood(id4.id) && isBlank(id2.id) && isBlank(id3.id) && isBlank(id1.id))
     doProcess();

Shishir

答案 1 :(得分:0)

我认为如果陈述是好的,即使它太长了。尝试在if语句中使用.equal()而不是==。

答案 2 :(得分:0)

你对if条件的问题与if条件无关,而与你的制作工作台代码的其他部分无关。你应该发布你的制作工作台代码,以便找到实际问题。

除了不整洁和东西...... 这可能不是您问题的答案,但这肯定会让您更容易做出许多食谱:

// These are your function calls. One line per recipe. Way better than multiple if functions

// example for shaped crafting using minecraft's crafting bench recipe.
shapedCrafting(new int[]{Tile.plank, Tile.plank, Tile.plank, Tile.plank}, 4, Tile.plank);
// example for shapeless crafting using your recipe
shapelessCrafting(new int[]{Tile.plank}, 4, Tile.plank);

这将是您的制作工作台的示例,其中包含数组而不是变量:

// This array resembles your crafting bench grid (2x2) in this case.
public static int[] arrayCraftingSlots = {Tile.plank, 0, 0, Tile.wood};

塑造工艺的功能:

/* int elements[] - takes in the crafting layout (this should equal your crafting bench grid)
 * int amount - the amount of the item or tile you get as a result
 * int result - the id of the result you get
 */
public static void shapedCrafting(int elements[], int amount, int result)
{
    for(int i = 0; i < elements.length; i++)
    {
        if(arrayCraftingSlots[i] != elements[i])
        {
            return;
        }
    }
    Inventory.inv_result.id = result;
    Inventory.inv_result.blockNum += amount;
    System.out.println("You can have " + amount + " " + result);
}

无形制作功能: 我已经将这一个限制为每个食谱的一个项目实例,就像在Minecraft中一样。因此,在一个无形的配方中使用2个木板是不可能的。当然,如果你愿意,你可以改变它。请记住,你也必须改变一些算法。

/* int elements[] - list of elements that need to be anywhere in the crafting bench
 * int amount - the amount of the item or tile you get as a result
 * int result - the id of the result you get
 */
public static void shapelessCrafting(int elements[], int amount, int result)
{
    for(int element : arrayCraftingSlots)
    {
        boolean in = false;
        for(int i = 0; i < elements.length; i++)
        {
            if(element == elements[i] || element == 0)
            {
                in = true;
            }
        }
        if(!in)
        {
            return;    
        }
    }
    for(int element : elements)
    {
        int occassions = 0;
        for(int i = 0; i < arrayCraftingSlots.length; i++)
        {
            if(element == arrayCraftingSlots[i])
            {
                occassions++;
            }
        }
        if(occassions > 1 || occassions == 0)
        {
            return;
        }
    }
    Inventory.inv_result.id = result;
    Inventory.inv_result.blockNum += amount;
    System.out.println("You can have " + amount + " " + result);
}