2015-06-06 3 views
-2

Я относительно новичок в области программирования. Я попробовал несколько языков, но поселился на C, чтобы начать с него из-за поддержки и легкости начала работы. В настоящее время я пытаюсь написать простую текстовую игру на основе завоевания. С этим есть большое количество мест или территорий, чтобы выбрать атаку, а что нет. Я дал каждой территории числовой идентификатор 1-50, где моя проблема. Единственный способ, которым я могу придумать, проверить, какой идентификатор введен пользователем, - написать 50, если утверждения, которые являются очень утомительными и раздражающими. Есть ли более простой способ сделать это?C как скрыть, если утверждения

AttackTrue(){ 
int AmountOfTroops; 
int TerrToAttack; 
//List of territories with their id 
// example: int California = 1; 
    printf("You have %d troops\n"); 
    printf("Enter the number of troops you want to use."); 
      scanf(" %d",&AmountOfInfantry); 
      printf("Enter the ID of the territory you want to attack.\n"); 
      scanf(" %d",&TerrToAttack); 
      /*HERE IS WHERE ALL THE IF STATEMENTS WOULD GO*/ 
      } 

} 
+0

Как насчет 'strtol()' или 'atoi()'? – rodrigo

+1

Опубликовать фрагмент того, что у вас есть (используйте [edit], чтобы добавить его). Как бы то ни было, все, что я могу сказать, «возможно». – usr2564301

+2

Это зависит от того, как вы его структурировали, как упомянуто @Jongware. Например, если вы используете 'struct' для представления' территории', и у вас есть массив 'Territory', вы можете просто индексировать его в массив и называть' attack (domains [user_input]) ' – Alejandro

ответ

0

использование switch случае вместо if else.

scanf("%d",&a);  
    switch (a) { 
    case 1: 
     /* Code */ 
     break; 
    case 2: 
     /* Code */ 
     break; 
. 
. 
. 
    default: 
     /* Code */ 
     break; 
    } 
0

Вы можете использовать Switch или Ternary Operator. Что конкретно следует использовать в реализации. Вы получите хорошее время исполнения во время работы Switch по сравнению с if-else

+1

Я думаю, что троянец для 50 случаев будет хуже, чем 'if-else's;) – szczurcio

+0

@szczurcio: На самом деле фрагмент кода даст больше информации о том, что есть в условном заявлении, чтобы мы могли предложить. –

1

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

void* (*funcLUT[50])(void*); 

создать функцию инициализации для заполнения массива (это хорошо, чтобы иметь функцию DoNothing() в качестве значения по умолчанию) и вызов функции в соответствии с ID:

retValue = funcLUT[ID](data); 

Надежда Я помог

+0

Barebones отвечают, но что-то, что OP может реализовать за секунды, таким образом +1 :) –

0

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

Что вы сейчас имеете в виду, это плохое понимание вашей проблемы. Не рекомендуется каким-то образом форсировать код «лучше», который плохо понимает. Просто попробуйте переосмыслить проблему.

Например, как насчет видеть вашу территорию в виде сетки. В частности, двумерная сетка. Затем продолжайте и заполните эту сетку ячейками.

typedef struct Cell {void (*cellBehaviour)(struct Cell *);} Cell; 
typedef struct Grid {Cell *cells;} Grid; 

Здесь вы можете прикрепить различное поведение в каждой ячейке (или они могут иметь поведение по умолчанию, это до вас). Поведение выражается с помощью функций, поэтому у вас может быть что-то вроде этого.

void cellBehaviourDefault(struct Cell *cell); 

Назначают некоторую функцию поведения для каждой ячейки, а затем вам не нужно любой ИФ, только когда у вас есть клетки, чтобы сделать что-то с, называют это функция поведения.

cell.cellBehaviour(cell); 

Надеюсь, что это поможет.

0

Как я вскользь упомянул в комментариях, вы могли бы, возможно, структурировать territories модели следующие:

struct territory 
{ 
    // territory code... 

}; 

Поскольку вы упомянули вас есть 50 territories, это может быть решена довольно красиво, создавая массив territories и просто вызывает функцию с аргументом territory. Таким образом, нет необходимости использовать длинную цепочку операторов if/else. Вот пример:

void attack(struct territory* to_attack) 
{ 
    // attack the territory 
} 

int main() 
{ 
    const int num_territories = 50; 
    struct territory territories[num_territories]; 
    int territory_id; 

    // code logic, call the following in a loop perhaps, based on user input: 
    scanf("%i",&territory_id); 
    attack(&territories[territory_id]); 
} 

Я прошел territory указателем так, что любые изменения, внесенные в него в функции attack на самом деле получить отражение в игре. Если какие-либо территории нуждаются в специальном лечении или должны подвергаться нападению по-разному, достаточно простого флага в структуре territory должно быть достаточно для реализации этого изменения в функции attack. И, если вы когда-либо вырасти свои территории до более чем 50, есть только одна переменная, которая изменится (num_territories), в отличие от добавления новых блоков логики if/else.

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