Skocz do zawartości

Tablice odczyt,zapis


Rekomendowane odpowiedzi

czesc próbuje stworzyc kwadrat na tablicach 10x10
w basicu :P bylo by cos takiego:


data *,*,*,*,*,*,*,*,*,*
data *,-,-,-,-,-,-,-,-,*
data *,-,-,-,-,-,-,-,-,*
data *,-,-,-,-,-,-,-,-,*
data *,-,-,-,-,-,-,-,-,*
data *,-,-,-,-,-,-,-,-,*
data *,-,-,-,-,-,-,-,-,*
data *,-,-,-,-,-,-,-,-,*
data *,-,-,-,-,-,-,-,-,*
data *,*,*,*,*,*,*,*,*,*

 

chcialbym aby w roomie za pomoca instance_create()
narysowac ten kwadrat
i jezeli w odczycie z tablicy bedzie - to niech bedzie instance_create(x,y,obj_minus)
a jezeli bedzie * niech   bedzie instance_create(x,y,obj_gwiazdka)

jak mam to zrobic ?

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

no to w GM tak fajnie się raczej nie da. trzeba ręcznie data[0,0] = *.


Chociaż można by się pobawić w substringi... będzie mniej wiecej tak, ale piszę to "na sucho" z głowy, bez testowania:

var arr = [], a = 0, b = 0,c = "";

for (i=1; i<=string_length(str); i++) {
    c = string_char_at(str, i);
    if (ord(c) == 10 or ord(c) == 12) { // znak \n lub \r
		if (a > 0) {
  			a = 0;
  			b++;
  			/* przenosi tablicę to nowej linii,
  			a > 0 zapobiega sytuacji gdy jest \n\r z rzędu, zamiast tylko \n albo tylko \r
  			(obsługuje zatem windows/linux/mac) */
 		}
  		// inaczej nie rób nic, trochę jak continue, ale warunki sprawiają, ze nie trzeba go pisać
	} else {
    	arr[a, b] = c;
	}
}

return arr; // powinno zwrócić tablicę.


 

Odnośnik do komentarza
Udostępnij na innych stronach

ŁOOOO PANIE TOSZ TO ZA SKOMPLIKOWANE W TYM GMIE :P 

 

a nie idzie tego obejsc np. jedną zmienną zamiast tablic

 

var a="

**********

*         *

*         *

*         *

*         *

*         *

*         *

*         *

*         *

********** "

i potem odczytać jakoś string tej zmiennej a

 

wiem ze byla taka funkcja ze string(a,pozycja1)="*" nie pamietam dokladnie..

 

 

i pozniej if a="*" instance_create(x,y,obj_gwiazdka)

if a=" " instance_create(x,y,obj_minus)

 

 

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

Możesz wpisać to do zmiennej i z tych zmiennych tworzyć tablice za pomocą for'ów. Mój kod rysuje kwadrat z samych gwiazdek ale jestem pewien, że da Ci to jakąś poszlakę, wskazówkę, pomysł ;)

 

//Create
_wiersze = 5;
_kolumny = 5;

//Step
for(var a=0; a<_wiersze; a++)
{
    for(var b = 0; b<_kolumny; b++)
    {
        kwadrat[a,b] = "*";
    } 
}

//Draw
for(var a=0; a<_wiersze; a++)
{
    for(var b = 0; b<_kolumny; b++)
    {
        draw_text(x+10*a, y+10*b, kwadrat[a,b]);
    } 
    
}

 

Żeby dać minusy w środku, podejrzewam, że przy wkładaniu gwiazdek w tablice za pomocą forów, zrób ifa który sprawdza, czy jest to początkowy lub końcowy index tablicy

Odnośnik do komentarza
Udostępnij na innych stronach

w sumie nie do końca mi o to chodziło.w mojej grze  bedzie duzo pomieszczen i ten kwadrat to jedno z pomieszczen

a w srodku kwadratu beda jeszcze sciany i obiekty.

chodzi mi o to by z poziomu tekstowego przeniesc obiekty do roomu,dlatego narysowałem na początku DATA

bo tak sie prosto rysuje "tekstowo" i wszystko widać w kodzie.

to musi być taki generator który zczytuje po kolei tekst literka po literce i każda literka to odpowiedni obiekt np.* to sciana,a-to zloto itp.

 

nie wiem czy to dobrze opisałem :D 

 

a i jeszcze jedno jeżeli jest    i++ to jest to równoznaczne z i=i+1 ?

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

a++ - postikrementacja - dodaj do zmiennej 1 po obecnym wyrażeniu.

++a - preinkrementacja - dodaj do zmiennej przed obecnym wyrażeniem.

 

tak samo z -- oczywiście (--a, a--). Wyrażenie to jest każdy kawałek kodu, który powinien kończyć się średnikiem czy nawiasem (nawet jeśli go nie

 

Inaczej mówiąc:

show_message(a++);
// po kompilacji:
show_message(a);
a+=1;


show_message(++a);
// po kompilacji:
a+=1;
show_message(a);

Oczywiście w większości przypadków wydaje się, że a++ oznacza to samo co a+=1, bowiem dodanie wykona się zawsze w następnym kroku kodu, więc takie jest wrażenie, czy też w pętlach dodanie wykona się zaraz za średnikiem - ale właśnie przykład z show message pokazuje, ze można napisać ++ a i tak dostać poprzednią wartość. Czasem wstawienie przed czy za się przydaje, żeby osiągnąć dodatkowy efekt.

Odnośnik do komentarza
Udostępnij na innych stronach

To tak jeszcze dodam od siebie przy postinkrementacji (ta sama zasada przy postdekrementacji) :P 

var a = 3;
show_message(string(a++) + ", " + string(a++));
show_message(a);

Da wynik "3, 4" i "5", ponieważ postinkrementacja (jak i również postdekrementacja) działa jak funkcja, bo po każdym a++ zwracana jest stara wartość i dopiero dodawana 1. Gdyby w GM istniały referencje, to wyglądałoby to mniej-więcej tak (kod dla przykładu w C):

int postinc(int &var) {
  int temp = var;
  var += 1;
  return temp;
}

I wywołanie postinc wygląda tak:

// A tutaj kod w pseudo-C, więc też nie do kopiowania :)
int a = 3;
show_message(string(postinc(a)) + ", " + string(postinc(a)));
show_message(a);

 

Dlatego czasami może być szybsze używanie ++a zamiast a++ (względem wykonywania kodu, nie jego tworzenia ;)), bo pomijamy etap kopiowania wartości do zmiennej tymczasowej. Chociaż taka mikro-optymalizacja w GM jest bezużyteczna, z wiadomych chyba względów. Oraz warto pamiętać, że używanie kilka razy a++ w jednym wywołaniu skryptu/funkcji może dać nieoczekiwany wynik.

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