2014-02-13 3 views
0

Я делаю ужасный 2D римейк Minecraft в качестве проекта класса в java, и у меня есть ремесленная скамья (или что бы там ни называлось), и у меня есть оператор if, который проверяет, есть ли у вас одна часть дерева в левом верхнем углу и ничего в другом 3, или если у вас есть один кусок дерева в правом верхнем углу и ничего в другом 3 и т. д.Проверка Java if statement

Следующая инструкция, m, похоже, позволяет вам иметь блок «wood» в нескольких слотах одновременно и все же позволяет вам получить блок «доски». (id1 - id4 представляют собой игровые площадки для скалолазания) 2x2 ремесленная скамья Tile.wood - деревянный блок, Tile.blank - это в основном нулевой блок или ничего.

//this if statement is what I need to change maybe? 
if ((id1.id == Tile.wood && id2.id == Tile.blank 
&& id3.id == Tile.blank && id4.id == Tile.blank) || 
(id1.id == Tile.blank && id2.id == Tile.wood 
&& id3.id == Tile.blank && id4.id == Tile.blank) || 
(id1.id == Tile.blank && id2.id == Tile.blank 
&& id3.id == Tile.wood && id4.id == Tile.blank) || 
(id1.id == Tile.blank && id2.id == Tile.blank 
&& id3.id == Tile.blank && id4.id == Tile.wood)) { 
    //this code I don't need to change, it works fine 
    Inventory.inv_result.id = Tile.plank; 
    Inventory.inv_result.blockNum += 4; 
    System.out.println("You can have 4 planks"); 
} 

Таким образом, вам снова разрешается иметь только один блок в одном месте, иначе он ничего не сделает.

Как исправить это, поэтому я получаю только блок «доски», если в одном из четырех слотов есть только один «деревянный» блок?

+3

Во-первых, это утверждение 'if' является чудовищным. Вы *** подумали о лучших способах выразить это. Во-вторых, если 'Tile' не является' enum', '==' не будет работать так, как вы ожидаете. В-третьих, укажите, какие условия вы хотите быть правдой, - где конкретно вас волнует, что древесина? – Makoto

+1

Я не вижу здесь вопроса, кроме «... что мне нужно изменить, может быть?» - Я не знаю, что спрашивает ОП. – arcy

+2

Если вам нужен лучший способ сделать эту логику, я предлагаю подсчитать «деревянные» и «пустые» блоки в четырех позициях. В конце вы должны иметь 1 и 3 – arcy

ответ

0

Я думаю, что если утверждение хорошо, хотя оно так долго. Попытайтесь использовать .equal() вместо == в выражении if.

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

Шишир

+0

Yay для модульного программирования. Это должно стать привычкой для вашей карьеры программирования. Он не только упрощает чтение программ, но и облегчает их отладку, а также легче изменять. –

+0

Я бы не создал функцию для каждой плитки. Я бы не использовал их, если вы еще не используете. Если вы посмотрите на Minecraft, вы поймете, как лучше всего сделать «скалолазание» или подобное, предоставив все необходимые параметры функции, которая обрабатывает все. Приятно и мягко закодировано, как мы его любим. –

+0

@PascalNeubert Ну, точка проекта класса заключается в том, чтобы использовать что-либо, кроме Minecraft, он хочет, чтобы мы либо выяснили это сами, либо получили помощь через форумы, но он не хочет, чтобы мы украли MC-кодирование ... –

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. Поэтому использование двух досок в одном бесформенном рецепте было бы невозможно. Конечно, вы можете изменить это, если хотите. Имейте в виду, что вам придется немного изменить алгоритм.

/* 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); 
}