2015-01-07 2 views
0

im, создающий игру в покемоновую битву, где я создаю объекты pokemon в выражениях if, основанных на пользовательском вводе. Это, очевидно, проблема, потому что я не могу использовать эти объекты вне оператора if, но должны быть разные объекты pokemon, которые создаются для каждого пользователя. Мне нужен общий способ использования этих объектов и их методов вне инструкции if, или мне нужен другой способ создания объектов, которые различаются от пользовательского ввода. Имейте в виду, что я новичок в java, спасибо, мне нужна помощь, любая помощь будет очень признательна.Как использовать объект за пределами его области

Код действительно длинный, но вот его отрезок.

if(answers == 1) { 
     Gible pokemon1 = new Gible("Gible","Gabite & Garchomp", "Achieving Level 24","Dragon Type","Ground Type", "Slash, Tackle, Sandtomb, Dragonclaw", "Monster & Dragon", true , "Gabite & Garchomp", "Slash!", "Tackle!" , "Sandtomb!", "Dragonclaw!", 239, 189, 179, 189, 183, 320); 
     System.out.println(pokemon1); 
    } 
    else { 
     Squirtle pokemon2 = new Squirtle("Squirtle","Wartortle & Blastoise", "Achieving Level 16","Water", "None", "Tackle, Water Gun, Hydro Pump, Skull Bash", "Monster & Water 1", true , "Wartortle & Blastoise", "Tackle!", "Water Gun!" , "Hydro Pump!", "Skull Bash!", 195, 229, 199, 227, 185, 292); 
     System.out.println(pokemon2); 

     } 

Условный оператор просто пользовательский ввод решить, какой покемон они хотят, (# 1 или # 2). Объекты, которые я создаю, привязаны непосредственно к подклассу абстрактного класса, который возвращает кучу статистики и информации (в основном материал, который я вставляю в параметры).

+0

Поместите код пожалуйста –

+0

«вне * его * сфера», опечатка в названии –

ответ

3

Вы можете объявить объект за пределами операторов if и затем инициализировать его. Таким образом, вместо этого:

if (some test) { 
    PokemonObject po = new PokemonObject(); 
    // ... use po 
} else if (another test) { 
    PokemonObject po = new PokemonObject(); 
    // ... use po 
} else if (a third test) { 
    PokemonObject po = new PokemonObject(); 
    // ... use po 
} 
// try to use po (doesn't compile) 

Используйте вместо этого:

PokemonObject po = null; 
if (some test) { 
    po = new PokemonObject(); 
    // ... use po 
} else if (another test) { 
    po = new PokemonObject(); 
    // ... use po 
} else if (a third test) { 
    po = new PokemonObject(); 
    // ... use po 
} 
if (po != null) { 
    // try to use po (works!) 
} 

EDIT: Если есть специализированные классы объектов покемон, то вы можете либо указать базовый класс (что классы могут расширить) или интерфейса (который классы могут реализовать), который определяет поведение, общее для всех объектов покемонов. Ваш код может выглядеть следующим образом:

PokemonObject po = null; // base class type for Gibble and Squirtle 
if (answers == 1) { 
    Gible pokemon = new Gible("Gible","Gabite & Garchomp", "Achieving Level 24","Dragon Type","Ground Type", "Slash, Tackle, Sandtomb, Dragonclaw", "Monster & Dragon", true , "Gabite & Garchomp", "Slash!", "Tackle!" , "Sandtomb!", "Dragonclaw!", 239, 189, 179, 189, 183, 320); 
    // do Gible-specific stuff here 
    po = pokemon; 
} else { 
    Squirtle pokemon = new Squirtle("Squirtle","Wartortle & Blastoise", "Achieving Level 16","Water", "None", "Tackle, Water Gun, Hydro Pump, Skull Bash", "Monster & Water 1", true , "Wartortle & Blastoise", "Tackle!", "Water Gun!" , "Hydro Pump!", "Skull Bash!", 195, 229, 199, 227, 185, 292); 
    // do Squirtle-specific stuff here 
    po = pokemon; 
} 
// do general Pokemon stuff here 
System.out.println(pokemon.getName()); 

При использовании базового класса, а не интерфейс, конструктор базового класса (или конструкторов) будет принимать только те параметры, которые имеют смысл для всех объектов Pokemon. Он также будет определять только те операции (например, getName()), которые являются общими для всех объектов Покемона.

Как и в любом случае, ваши вызовы конструктора кажутся чрезвычайно сложными и подверженными ошибкам. Вы можете взглянуть на использование builder pattern или связанных с ним методов, чтобы избежать конструкторов с too many parameters.

+0

и как в этом примере, это означает, что вы есть родительский супер-класс для всех покемонов – Greg

+0

Будет ли это работать, если я хотел распечатать объект? –

+0

Объект высшего класса –

0

Попробуйте это:

public Gible pokemon1; 
public Squirtle pokemon2; 
    if(answers == 1) { 
      this.pokemon1 = new Gible("Gible","Gabite & Garchomp", "Achieving Level 24","Dragon Type","Ground Type", "Slash, Tackle, Sandtomb, Dragonclaw", "Monster & Dragon", true , "Gabite & Garchomp", "Slash!", "Tackle!" , "Sandtomb!", "Dragonclaw!", 239, 189, 179, 189, 183, 320); 
      System.out.println(pokemon1); 
     } 
     else { 
      this.pokemon2 = new Squirtle("Squirtle","Wartortle & Blastoise", "Achieving Level 16","Water", "None", "Tackle, Water Gun, Hydro Pump, Skull Bash", "Monster & Water 1", true , "Wartortle & Blastoise", "Tackle!", "Water Gun!" , "Hydro Pump!", "Skull Bash!", 195, 229, 199, 227, 185, 292); 
      System.out.println(pokemon2); 

      } 

и теперь вы можете называть эти 2 переменные из любого где.

0

Как Тед Хопп Предлагая вместо объявления и инстанцирования внутри блока IF, вы можете объявить объекты вне блока IF, и когда вы вводите блок IF, вы можете создавать объекты.

GibleClass gb = null; 
SquirtleClass sq = null; 

     if(answer == 1){ 
     gb = new Gible("Gible","Gabite & Garchomp", "Achieving Level 24","Dragon Type","Ground Type", "Slash, Tackle, Sandtomb, Dragonclaw", "Monster & Dragon", true , "Gabite & Garchomp", "Slash!", "Tackle!" , "Sandtomb!", "Dragonclaw!", 239, 189, 179, 189, 183, 320); 
     System.out.println(gb); 

     } else { 
     sq = new Squirtle("Squirtle","Wartortle & Blastoise", "Achieving Level 16","Water", "None", "Tackle, Water Gun, Hydro Pump, Skull Bash", "Monster & Water 1", true , "Wartortle & Blastoise", "Tackle!", "Water Gun!" , "Hydro Pump!", "Skull Bash!", 195, 229, 199, 227, 185, 292); 
     System.out.println(sq); 
     } 
+0

Привет, проблема с этим методом заключается в том, что я не могу «сгруппировать» всех покемонов вместе, потому что я буду использовать этот покемон для следующей сцены битвы. И мне нужно установить экземпляр pokemon, как например, Fighter # 1. И так потому, что все объекты pokemon имеют разные имена, потому что они будут переменными экземпляра, это затрудняет выбор того, какой покемон выбран как истребитель # 1. Извините, если он немного запутан –

+0

Я попытался использовать arraylist pokemons, в котором я добавил объекты pokemon, которые я создал в операторах if в списке массивов. Затем я написал (ArraylistName).Добавить (имя_объект()); Затем я попытался распечатать метод getAttack. System.out.println (ArrayListName) (0.getAttack()); и он не смог найти метод getAttack. Все исправлено для этого? –

Смежные вопросы