target-c, как вызывать разные значения на основе выбора пользователем класса - PullRequest
0 голосов
/ 16 декабря 2010

Я работаю над своего рода симулятором для игры, которую я разрабатываю, и мне нужна помощь. базовый симулятор будет запускаться из компилятора GNUstep через dos, я думаю, это лучший способ описать его. Основная идея заключается в следующем: когда программа загружается, она будет запрашивать выбор идентификатора модуля из заполненного списка, после выбора она ссылается на класс и создает новый класс и его методы, затем запрашивает идентификатор защищающегося модуля и следует за похожий путь создания этого нового класса и методов. Прошу прощения, если моя терминология неверна в отношении методов и тому подобного.

в любом случае, пока все, что я хочу, происходит. я могу позвонить новым единицам через запись, используя кейсы.

на жесткой части:

@interface Unit1: NSObject {         @interface Unit2: NSObject {

    int unitType;                        int unitType;
    int attackInfantry;                  int attackInfantry;
    int attackArmored;                   int attackArmored;
    int attackAerial;                    int attackAerial;
    int attackAquatic;                   int attackAquatic;
    int attackHeroic;                    int attackHeroic;

    int attackHP;                        int attackHP;
    int attackBAV;                       int attackBAV;
    int attackBDV;                       int attackBDV;
}                                    }
-(void) print;                       -(void) print;
-(void) Stats;                       -(void) Stats;
@end                                 @end

так вот пример моего интерфейса, у нас здесь есть два блока: Далее следует реализация:

@implementation Marine                    @implementation Speeder

-(void) Stats                             -(void) Stats
{                                         {

  attackHP = 10;                            attackHP = 10;
  attackBAV = 20;                           attackBAV = 23;
  attackBDV = 10;                           attackBDV = 10;

  unitType = 1;                             unitType = 2;
  attackInfantry = 15;                      attackInfantry = 23;
  attackArmored = 10;                       attackArmored = 18;
  attackAerial = 0;                         attackAerial = 9;
  attackAquatic = 7;                        attackAquatic = 15;
  attackHeroic = 0;                         attackHeroic = 0;
}                                         }

Итак, вот план, что я хотел бы сделать, это как-то распознать unitType и затем выбрать правильное значение атаки. так что в этом случае 1 равняется пехоте и 2 равняется броне. для этого примера первый модуль будет использовать attackArmored = 10; потому что программа распознает, что второй блок имеет unitType = 2; и второй блок будет использовать attackInfantry = 23; по той же причине он знает, что атакует юнит пехотного типа.

Я не уверен, правильно ли настроены юниты, как и должно быть, но я строю этот симулятор с целью обучения, так как я новичок в Objective-C и мире кода.

Я надеюсь, что все это имело смысл, и я смог ответить на мой вопрос ...

Ответы [ 2 ]

2 голосов
/ 16 декабря 2010

Похоже, что и Unit1 (вероятно, должно быть InfantryUnit), и Unit2 (вероятно, должно быть SpeederUnit) должны иметь абстрактного родителя с именем Unit.Все свойства (attackHP и т. Д.) Будут определены в Unit.

. Метод -init каждого подкласса Unit устанавливает точки попадания, значения атаки и т. Д. Для этого конкретногоunit.

У меня также был бы метод на Unit, который выглядит примерно так:

typedef enum {
  UnitTypeInfantry = 1,
  UnitTypeSpeeder = 2
} UnitType;

+ (Unit *) unitWithType:(UnitType)type {
  if (type == UnitTypeInfantry) {
    return [[[InfantryUnit alloc] init] autorelease];
  } else if (type == UnitTypeSpeeder) {
    return [[[SpeederUnit alloc] init] autorelease];
  }
  return nil;
}
1 голос
/ 16 декабря 2010

Вместо набора отдельных переменных атаки для всех типов противников, вы можете создать одну переменную attackValues, которая будет NSDictionary. Ключи словаря будут типом оппонента, а значения будут суммами атаки. (Другой возможностью было бы использование NSArray, индексированного по типу единицы, предполагая, что все ваши типы - это маленькие целые числа, но подход ключ / значение более гибкий.)

Например,

@interface Unit1: NSObject {         

    int unitType;           // numeric type (1, 2, ...)
    NSString *unitTypeName; // "Infantry", "Armored", ...
    NSDictionary *attackValues;                    
...
}  


-init  {
    unitType = UnitTypeInfantry;
    unitTypeName = @"Infantry";

    // Set attack values for other kinds of units
    attackValues = [NSDictionary dictionaryWithObjectsAndKeys:
       [NSNumber numberWithInt:15], @"Infantry",
       [NSNumber numberWithInt:10], @"Armored",
       [NSNumber numberWithInt:0], @"Aerial",
       [NSNumber numberWithInt:7], @"Acquatic",
       [NSNumber numberWithInt:0], @"Heroic",
       nil];
}

Затем, чтобы получить значение атаки для определенного типа противника, все, что вам нужно сделать, это:

int attack = [[attackValues objectForKey:[opponent unitTypeName]] intValue];

Преимущества использования словарного дизайна вместо отдельных свойств:

1) Вам не нужно писать много if утверждений, таких как:

if (opponent.unitType == 1) 
    attack = attackInfantry; 
else if ((opponent.unitType == 1) 
    attack = attackArmored;
else if ...

2) Если вы добавляете новый тип устройства, вам не нужно добавлять новую переменную для каждого другого типа устройства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...