Skocz do zawartości

problem z tablicą


boom

Rekomendowane odpowiedzi

Nie rozwodząc się: tworzę tablicę z migracją towarów (import, eksport). W evencie step mam kod:

GML
for(i = 1;i < 5; i += 1)

for(j = 1;j < 5; j += 1)

{

tabela_handlowa[1,2] = 'obe'

tabela_handlowa[1,3] = 'ird'

tabela_handlowa[1,4] = 'ane'

tabela_handlowa[2,1] = 'import'

tabela_handlowa[3,1] = 'eksport'

}

, a w draw:

GML
for(i = 1; i < 5; i += 1)

for(j = 1; j < 5; j += 1)

{

draw_text(i*32 , j * 32,tabela_handlowa[i,j])

}

jednak gdy uruchamiam grę wywala mi błąd:

Error in

action number 1

of Draw Event for object tablica:

 

draw_text(i * 32, j * 32,tabela_handlowa[i,j])

at position 30: Unknown variable tablica_handlowa or aray index of bounds

walę ignore, jest to samo. Wyłączam Display error messages, wszystko gra. Poza jednym: GM nie pisze słowa eksport, które miał napisać. co mam zrobić? :crying:

Odnośnik do komentarza
Udostępnij na innych stronach

No cholerę ci te pętle?

I na cholerę ci ten kod w stepie potrzebny?

 

A błąd oznacza, że nie istnieje komórka o podanym indexie. Bo ty tworzysz tylko komórki

[1,2]

[1,3]

[1,4]

[2,1]

[3,1]

A na przykład nie tworzysz [5,5], podczas gdy i,j mają takie wartości.

 

Nie wiem co chcesz osiągnąć, ale wiem, że robisz to źle i nie rozumiesz tablic :)

Odnośnik do komentarza
Udostępnij na innych stronach

GML
for(i = 1;i < 5; i += 1)

for(j = 1;j < 5; j += 1)

{

tabela_handlowa[1,2] = 'obe'

tabela_handlowa[1,3] = 'ird'

tabela_handlowa[1,4] = 'ane'

tabela_handlowa[2,1] = 'import'

tabela_handlowa[3,1] = 'eksport'

}

Po cholerę 25 razy tak samo definiować wartości w tablicy? o.O

Chodziło Ci chyba o

GML
for(i = 1;i < 5; i += 1)

for(j = 1;j < 5; j += 1)

{

tabela_handlowa[i,j] = 'obe'

tabela_handlowa[i,j] = 'ird'

tabela_handlowa[i,j] = 'ane'

tabela_handlowa[i,j] = 'import'

tabela_handlowa[i,j] = 'eksport'

}

Odnośnik do komentarza
Udostępnij na innych stronach

Indeks tablicy w GMie to dowolna liczba całkowita, nie mniejsza niż zero. Oznacza to, że można tworzyć element tablicy o indeksie równym 0. Poprawnie więc by było:

GML
tabela_handlowa[ 0, 1 ] = 'obe'

tabela_handlowa[ 0, 2 ] = 'ird'

tabela_handlowa[ 0, 3 ] = 'ane'

tabela_handlowa[ 1, 0 ] = 'import'

tabela_handlowa[ 2, 0 ] = 'eksport'

Dlaczego niby mamy pomijać pierwszy element? I dlaczego mamy wiele razy przypisywać tym samym zmiennym różne wartości, bądź, co gorsza, próbować wyświetlać wartości elementów tablic, które nie istnieją :) ? I ogólnie słaby pomysł z tymi tablicami - kompletnie nieprzemyślane ;) .

Odnośnik do komentarza
Udostępnij na innych stronach

Nieraz dużo wygodniej jest numerować od jedynki. Osobiście zwykle tak robię i nie widzę przeciwwskazań.

I ogólnie to nadal nie wiemy co on chce osiągnąć.

 

boom, napisz nam co dokładnie chcesz zrobić to ci pomożemy.

W tej chwili jedyne co możemy powiedzieć to to, że napisałeś coś całkowicie bezsensownego.

Odnośnik do komentarza
Udostępnij na innych stronach

chodziło bardziej o to, abym zrozumiał tablice w ogóle, bo jak stwierdził Platyna ja nie rozumiem tablic. ale i tak dzięki za pomoc.

a chodziło o to, żeby okno GM - a nie wyglądało tak:

57423a4320.jpeg

tylok żeby jednak napisał ten 'eksport'

Odnośnik do komentarza
Udostępnij na innych stronach

Platyna, to błąd robisz. Nikt ci przecież jedynki dodać do liczby nie broni :) .

 

Zrozumieć sens tablic? Jeżeli chcesz chociażby wykonywać ciągle te same działania i przypisywać wartość na podstawie takiego samego wzoru. Wtedy zauważasz, że chcesz robić ciągle to samo, jednak musiałbyś powtarzać te linijki dla każdej zmiennej osobno. A tak - po prostu tworzysz pętlę i zwiększasz wartość zmiennej odpowiedzialnej za kolejny indeks (numer) tablicy i przypisujesz nowo powstałemu elementowi wartość.

 

A tu takie przykłady:

 

Błędy:

 

GML
x = random( 100 ) - 200;

tablica[ x ] = "moja_wartosc";

Indeks nie może być mniejszy niż zero i musi być to liczba całkowita. Poprawnie byłoby x = max( round( random( 100 ) ) - 200, 0 )

GML
for( i = 0; i < 5; i += 1; )

{

tablica[ 0 ] = 0;

tablica[ 1 ] = 0;

tablica[ 2 ] = 0;

tablica[ 3 ] = 0;

tablica[ 4 ] = 0;

}

Ogólny bezsens - pięć razy tym samym tablicom przypisujemy te same wartości. A przecież chodzi o jak najmniejszą liczbę linijek :P . Zamieniamy te pięć zbędnych linijek na jedną: tablica[ i ] = 0; Kod jest skrócony o cztery linijki!

GML
tablica[ 1, 2 ] = wartosc;

tablica[ 3, 0 ] = wartosc;

tablica[ 2, 7 ] = wartosc;

Ogólny zbędny chaos występujący u ciebie. Tablice dwuwymiarowe do tego nie służą :) .

 

Dobrze:

 

GML
for( i = 0; i < 5; i += 1; )

tablica[ i ] = random( 400 );

Wartość tablicy może być ułamkiem, ale to wartość, a nie indeks :) .

GML
indeks = 0;

while( indeks < 5 )

tablica[ indeks ] = choose( "napis1" , "napis2", "napis3" );

Umieszczamy w pięciu elementach tablicy różne napisy :) .

 

Mam nadzieję, że nieco pomogłem.

 

Boom, podam ci praktyczne zastosowanie. Jak 100 obiektów zastąpić tablicą ;) . Stwórz room 500 x 500 pikseli oraz umieść w nim stworzony wcześniej obiekt, któremu spirte'a dawać nie musisz. Daj mu w Create:

GML
for( i = 0; i < 10; i += 1; )

for( j = 0; j < 10; j += 1; )

tablica[ i, j ] = choose( c_black, c_white ); // robimy białe i czarne pola (losowo)</span>

W evencie Global mouse left pressed:

GML
i = mouse_x div 50 * 50;

j = mouse_y div 50 * 50; // na podstawie pozycji myszki obliczamy, jakie są to indeksy tablicy

if ( tablica[ i, j ] == c_black )

tablica[ i, j ] = c_white;

else

tablica[ i, j ] = c_black; // zmiana</span>

A tak wyświetlamy kwadraty na podstawie tablic w evencie Draw:

GML
for ( i = 0; i < 10; i += 1; )

for( j = 0; j < 10; j += 1; )

{

draw_set_color( tablica[ i, j ] );

draw_rectangle( i * 50, j * 50, i * 50 + 50, j * 50 + 50, 0 );

}

 

Może ten przykład ci pomoże zrozumieć tablice :P .

Odnośnik do komentarza
Udostępnij na innych stronach

nie za bardzo. Otóż chodzi o to by te napisy zostały i ja nie chcę, by były rozmieszczane losowo. chodzi mi tylko o ten eksport, którego nie umiem napisać, chociaż kiedy robię coś jak np tabliczka mnożenia (i*j) pisze mi wszystkie komórki bez przeszkód. Ale w kwestii tablic ogółem to dzięki za doinformowanie.

Odnośnik do komentarza
Udostępnij na innych stronach

Ale ty musisz swój kod przeanalizować :) . Pomogę ci:

GML
for(i = 1;i < 5; i += 1)

for(j = 1;j < 5; j += 1)

{

tabela_handlowa[1,2] = 'obe'

tabela_handlowa[1,3] = 'ird'

tabela_handlowa[1,4] = 'ane'

tabela_handlowa[2,1] = 'import'

tabela_handlowa[3,1] = 'eksport'

}

 

Pierwszy krok - i = 0, j = 0:

GML
tabela_handlowa[1,2] = 'obe'

tabela_handlowa[1,3] = 'ird'

tabela_handlowa[1,4] = 'ane'

tabela_handlowa[2,1] = 'import'

tabela_handlowa[3,1] = 'eksport'

Drugi - i = 0; j = 1:

GML
tabela_handlowa[1,2] = 'obe'

tabela_handlowa[1,3] = 'ird'

tabela_handlowa[1,4] = 'ane'

tabela_handlowa[2,1] = 'import'

tabela_handlowa[3,1] = 'eksport'

 

Szósty - i = 1; j = 0:

GML
tabela_handlowa[1,2] = 'obe'

tabela_handlowa[1,3] = 'ird'

tabela_handlowa[1,4] = 'ane'

tabela_handlowa[2,1] = 'import'

tabela_handlowa[3,1] = 'eksport'

 

Bez względu na wartości i oraz j kod jest zawsze ten sam. Wspomniałem już wcześniej o tym - kod wykonywany jest niezależnie od pętli, ponieważ indeksy tablic to stałe wartości, a nie zmienne.

Odnośnik do komentarza
Udostępnij na innych stronach

A, to już inna sprawa, że jeszcze pętli nie opanowałeś. Za wysoko sobie na starcie poprzeczkę postawiłeś ;) .

 

Tak. Bo po co je dałeś, skoro i tak indeks tablicy nie jest uzależniony od pętli (zamiast tablica[ i, j ] jest np. tablica[ 2, 0 ]), więc zawsze wykonuje się to samo.

Odnośnik do komentarza
Udostępnij na innych stronach

Ambicje ambicjami, a błąd błędem :) . I wcale nie musisz się ograniczać, lecz powoli iść do przodu. Gdy jest moment, że czegoś nie rozumiesz, na siłę nie ucz się czegoś nowego. Taka rada :P .

 

A tak poza tym - czemu tak chaotycznie indeksujesz elementy tablicy? 0,0 | 0,1 | 0,2 | 1,0 | 2,0 . Nie idzie ciebie w ten sposób zrozumieć ;) .

Odnośnik do komentarza
Udostępnij na innych stronach

Platyna, to błąd robisz. Nikt ci przecież jedynki dodać do liczby nie broni :) .

 

Co za brednie. Dlaczego niby robię błąd? Nie mam obowiązku wypełniać komórki 0. Na jaką cholerę za każdym razem miał bym tą jedynkę dodawać/odejmować jak mogę sobie po prostu od 1 numerować.

Tak wiele pamięci ta jedna wolna komórka nie zabierze. Już więcej czasu by zabrało dodawanie tej jedynki.

Odnośnik do komentarza
Udostępnij na innych stronach

Czyli współrzędne lewego górnego rogu obrazka to także 1,1? Tak ciężko jest się do tych zer przyzwyczaić? Platyna, wcale nie, bo nawet nie wiem po jakiego grzyba te jedynki dawać, kiedy to się przyda :) ? Kiedyś już o tym w jakimś temacie była mowa i, jak to podsumował Ranmus, "Chodzi o to, że niepotrzebnie nie wykorzystujemy pierwszego elementu". Tyle, nie mam zamiaru się kłócić, a tym postem twojego sposobu i tak nie zmienię ;) .

 

Nie chcę nikogo prowokować do kłótni, a tym bardziej redaktora.

 

I bez takich tekstów mi tutaj! Bez przesady. To że jestem redaktorem, nie oznacza, że trzeba isę mnie bać i nie wolno mi zwrócić uwagi czy też nawet ochrzanić. Czy kadra musi być na jakichś specjalnych prawach w tego typu sprawach? =)

Platyna

Odnośnik do komentarza
Udostępnij na innych stronach

Ależ to nie kłótnie tylko wymiana zdań.

Co do obrazka: nie powiedziałem, że zawsze tak robię. Napisałem, że zdarzają się przypadki dla których jest to wygodniejsze!

Przykładowo: Większość zadań na olimpiadach ma dane tak podawane. Jak mamy jakieś n miast czy coś. Zawsze są numerowane od jedynki. Wtedy jest dużo wygodniej niż myśleć o jakimś durnym dodawaniu jedynki.

 

Oczywiście są też przypadki, że wygodniej jest od zera. Chociażby kopiec czy inne dżewo. Lepiej synów oznaczać jako

(i*2+1) i (i*2+2)

niż

(i*2) i (i*2+1).

 

Jakoś bardziej intuicyjnie.

 

Więc co byś nie mówił. Nie wmówisz mi że to jest błąd. Wprawdzie to są setne sekundy, ale nawet optymalniej jest nie dodawać tej jedynki ;)

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ę...