Skocz do zawartości

Tablice


Phoenix

Rekomendowane odpowiedzi

Myślę, że oto Ci chodziło Harv

Tablice

W GML można używać tablic jedno i dwuwymiarowych. Tworzenie ich jest proste - poprostu wpisujemy wartość w nawiasy kwadratowe (przy jednowymiarowych jedną liczbę, przy dwuwymiarowych - liczbę, przecinek i drugą liczbę). Tablice mogą wyglądać tak:

kod:

{

a[0]=1;

b[1,3]=2;

}

 

Bo jeśli tak to już wiem jak je zrobić, ale co można z nimi zrobić. Chciałbym się naucz tablic. Ktoś mógłby mi wytłumaczyć, co z nimi można zrobić?

 

PS: Pytam się bo zaciekawił mnie kod Jakluba dla zalu.

Odnośnik do komentarza
Udostępnij na innych stronach

Hmm... Coś znalazłem ;) !

 

Tablice prosto mówiąc to są indeksowane zmienne. Potrzebę używania tablic łatwo jest zauważyć kiedy przyjdzie nam na nie zapotrzebowanie. Na przykład, chcielibyśmy aby możliwe było w łatwy sposób wyzerować wartość zmiennej a z liczbą na końcu 2, czyli a2. Wydaje to się banalne, i tak w rzeczywistości jest.

a2 = 0;

Jak widać żadnych problemów nie ma. A gdybyśmy chcieli zmienną a2, a3 itd. ... a99, a100? Akurat wtedy zauważyć by można zbędne występowanie 100 linijek kodu. Dlatego prostszym rozwiązaniem było by w jakiś sposób jednak indeksować te zmienne. Czy GML pozwala na to? Oczywiście, GML jak większość język programowania bądź skryptowych oferuje tablice (w niektórych językach występują tablice asocyjne, tzn. o indeksie w postaci łańcucha znaków, ale to tylko ciekawostka). Jak wygląda składnia nadania wartości tablicy? Przyjrzyj się dokładnie:

tablica[indeks] = <wartosc>;

Generalnie wygląda to całkiem łatwo. Jak to wygląda w praktyce? Przykład, który mogę zaoferować to program do wyliczania średni arytmetycznej spośród podanych przez nas liczb. Kod będzie banalnie prosty:

maxValues = 0;
do
{
    value[maxValues] = get_integer( "Podaj liczbę, lub wpisz zero.", 0 );
    maxValues += 1; // powiekszanie indeksu kolejnej tablicy, wydaje sie logiczne, gdyz co chwile bedziemy tworzyc nowa zmienna
} until( !value[maxValues - 1] ) // koniec petli, gdy podamy liczbe 0

divAll = 0; // znane z obliczania sredniej ocen, dodajemy wszystkie liczby
for( i = 0; i < maxValues - 1; i += 1; )
    divAll += value[i];
    
divAll /= maxValues - 1; // a potem dzielimy przez maksymalna wartosc

show_message( "Średnia tych liczb to: " + string( divAll ) );

game_end();

Przykład może wydawać się trudny. Przeanalizujmy go. Można napisać w punktach proces obliczania średniej w tym przykładzie.

 

1. Deklarujemy zmienną odpowiedzialną za maksymalną ilość liczb

2. Zaczyna sie pętla. Jeśli Podamy zero, następuje koniec i przechodzimy do następnego punktu. W przeciwnym wypadku wszystko się zapętla. Pętla ta odpowiedzialna jest za tworzenie tablicy o coraz większym indeksie, gdyż indeksem jej jest ciągle powiększająca się zmienna maxValues.

3. Teraz pętlą for dzięki iteratorowi (i += 1) będziemy "przechodzili" kolejno po wszystkich tablicach i sumowali je, tzn. wartość wszystkich liczb będzie znajdywała się w zmiennej divAll.

4. Teraz znanym nam sposobem, osiągniętą sumę dzielimy operatorem dzielenia przez największy indeks tablicy value (czyt. przez ilość liczb).

5. Na końcu wyświetlamy wartość średniej i kończymy program.

 

Wydaje się trudne, ale w ten sposób łatwo będzie ci wszystko przychodzić. Pozostaje jeszcze jedno zagadnienie, mianowicie tablice dwuwymiarowe. Tego już nie będę szczegółowo omawiał, powiem tylko, iż są to tablice z dwoma indeksami. Oddzielamy je przecinkami. Tak jak poprzednio, potrzebne nam to będzie tylko wtedy, gdy będzie nam brakowało pomysłów na stworzenie odpowiedniego elementu gry. Np. taki ekwipunek, łatwo byłoby go "wykonać" na tablicach dwuwymiarowych. Wtedy tworzymy stałą, nazywamy ją FLD_EMPTY i nadajemy jej wartość -1. W zdarzeniu Create można stworzyć ekwipunek w taki sposób:

for( i = 0; i < 10; i += 1; )
{
    for( j = 0; j < 10; j += 1; )
    {
        inv[i,j] = FLD_EMPTY; // 10 x 10 = 100 pol wolnych
    }
}

Możemy sobie napisać funkcję dodającą przedmiot do plecaka, potrzebne będzie jednak stworzenie stałej FLD_ITEM. Teraz łatwo będzie napisać tę funkcję.

for( i = 0; i < 10; i += 1; )
{
    for( j = 0; j < 10; j += 1; )
    {
        if ( inv[i,j] == FLD_EMPTY )
        {
            inv[i,j] = FLD_ITEM;
            return true;
        }
    }
}

Dodatkowo będzie ona nam zwracała wartość 1, jeśli w plecaku będzie miejsce na rzecz, lub 0, jeśli miejsca zabraknie. Wyświetlania go już nie na piszę, bo nie o tym mowa i szkoda na to czasu. Mam jednak nadzieję, że zrozumiałeś do czego służą tego typu zmienne. Miłej nauki biggrin.gif !

 

By Misztrzunio :) . Przerobiłem lekko, bo wersja Misztrzunia miała błędy :P .

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...