2015-05-16 2 views
-1

Я пытаюсь сделать игру на C, и моя проблема заключается в следующем: Мне нужно иметь какой-то метод в C, который делает базовым то, что делает этот код Python:Массив неизвестного числа элементов в c

array = list(); 
len(array)  #returns 0 
x = 1 
array.append(x) 
len(array)  #returns 1 
array.append(2) 
len(array)  #returns 2 

Это только основной метод, который мне нужно сделать, тест, если это меньше, чем 5, это просто быть различных размеров массива, первоначально моя проблема заключается в том, как манипулировать выстрелами в моей игре, создавая их нажав пространство на клавиатуре (добавление огнестрельного оружия до пустого массива до сих пор), а затем я должен сделать что-то подобное, только в C:

for i in range(len(array)): 
    print array[i] 

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

+0

C не имеет встроенной поддержки массивов переменного размера. – Frxstrem

+1

Кроме того, вы должны показать, какой код C вы уже пытались решить эту проблему. – Frxstrem

+0

Похоже, вы ищете связанный список. Найдите «динамическое распределение памяти» в Google - затем используйте его для создания связанного списка. –

ответ

1

C не поддерживает переменные массивы; если C++ - это опция, перейдите на std::vector. Если нет, вам придется реализовать это в C самостоятельно. Я лично предложил бы сделать что-то близкое к тому, что делает std::vector - каждый раз, когда у вас заканчивается память, realloc в два раза больше.

+1

Вы можете скомпилировать свой код как C++, все еще используя синтаксис c, и используйте stl :: vector. Старая пословица лечения C++ как c на стероидах! –

2

Я бы предложил связанный список вместо массива, потому что в конечном итоге вы захотите удалить произвольные элементы. (Пуля 1 по-прежнему путешествует по всему экрану, но пуля 3 врезалась в стене и пуля 6 ударила враг.) Вы можете сделать это прямо в пулевой структуре, а не в качестве отдельной структуры данных:

typedef struct bullet_t { 
    /* ...game logic... */ 
    struct bullet_t* next; 
} bullet; 
+0

Это именно то, что мне нужно, извините, я вроде как noob в C ..не могли бы вы объяснить немного больше, как это сделать, например пример для структуры и mannipulation для создания и уничтожения пули, или просто документацию, которую я мог бы использовать, чтобы изучить ее, я бы действительно воспринял ее. –

+0

[Это похоже на довольно хороший учебник.] (http://cslibrary.stanford.edu/103/) –

0

Есть разные способы делать то, что вы хотите сделать, но я советую список. В принципе, проблема преобразования кода Python в C-код заключается в том, что вам приходится вручную выделять переменные большую часть времени, и здесь у вас есть. Таким образом, вы можете сделать список с цепочкой, где вы выделяете каждый новый элемент с помощью malloc, а затем связываете его с остальной частью списка указателем.

Затем, чтобы узнать размер, просто следуйте за списком с помощью счетчика.

Удачи. ;)

0

Я бы порекомендовал другого ADT. Например, связанный список или Set ADTs (если вы немного поиграете в Google, вы, вероятно, найдете готовые). Однако, если вам абсолютно необходимо использовать массивы, вам следует искать динамически распределенные. Вот пример реализации. (Не проверено)

#include <string.h> 
#include <stdio.h> 
#include <stdlib.h> 

typedef struct { 
    int *array; 
    int size; 
    int capacity; 
} array_t; 

#define ARRAY_INIT_CAPACITY 4 

array_t *new_array(){ 
    array_t *arr=malloc(sizeof(array_t)); 
    arr->array=malloc(sizeof(int)*ARRAY_INIT_CAPACITY); 
    arr->size=0; 
    arr->capacity=ARRAY_INIT_CAPACITY; 
    return arr; 
} 

void increase_array(array_t *array){ 
    int new_capacity=array->capacity*2; 
    int *new_location = realloc(array->array, new_capacity*sizeof(int)); 
    if (!new_location) { 
     fprintf(stderr, "Out of memory"); 
     exit(1); 
    } 
    array->capacity=new_capacity; 
    array->array=new_location; 
} 

void array_append(array_t *array, int item){ 
    if (array->size >= array->capacity){ 
     increase_array(array); 
    } 
    array->array[array->size]=item; 
    array->size+=1; 
} 
int array_size(array_t *array){ 
    return array->size; 
} 
array_t *myArray=new_array(); 

Я бы рекомендовал узнать о dynamic memory allocation и Arrays in C. Надеюсь, это поможет :)

+0

В основном ООП в C;) – szczurcio

+0

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

+0

Вы можете проверить [это] (http://www.learn-c.org/en/Linked_lists) out :) (И, пожалуйста, примите ответ, если он удовлетворит ваши потребности!) –

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