Skocz do zawartości

Losowanie bez powtórzeń


Hawaxi

Rekomendowane odpowiedzi

Witam,

Mam 4 obiekty i chcę żeby zmieniały wygląd w zależności jaką liczbe wylosuje, wyglądy nie mogą się powtarzać...

Mam to:

 

GML
global.liczba1 = irandom_range(1,4);

 

if global.liczba1 = 1

{

sprite_index = spr_1

}

if global.liczba1 = 2

{

sprite_index = spr_2

}

if global.liczba1 = 3

{

sprite_index = spr_3

}

if global.liczba1 = 4

{

sprite_index = spr_4

}

pomoże ktoś?

 

GameMaker:Studio

Odnośnik do komentarza
Udostępnij na innych stronach

Sprawdzaj czy liczba została wylosowana. Nie mam pomysłu na kod, więc tylko przedstawię jak to można zrobić.

1. Losuj liczbę

2. W pętli sprawdzaj czy została wylosowana (stwórz tablicę)

3. Jeśli liczba nie została wylosowana zapisz liczbę w tablicy i wyjdź z pętli.

Odnośnik do komentarza
Udostępnij na innych stronach

Albo po prostu zrób tak:

 

1.zapisz dane do ds_list.

2.wymieszaj ds_list

3.Odczytuj po kolei dane z niej

 

W Twoim przypadku chciałbyś mieć obiekt który najpierw stworzy tę listę jako globalvar...

 

GML
//Tworzenie listy

globalvar lista;

lista = ds_list_create();

//Dodawanie danych do listy

ds_list_add(lista,spr1,spr2,spr3,spr4);

//Wymieszanie danych

ds_list_shuffle(lista);

 

...a dopiero potem żeby te cztery obiekty wybierały z niej na zasadzie:

 

GML
//Wziecie wartosci

sprite_index = ds_list_find_value(lista,0);

//Usuniecie pozycji

ds_list_delete(lista,0);

Odnośnik do komentarza
Udostępnij na innych stronach

Okej, mam tak:

obj_control ktory tworzy liste, dodaje dane do listy i je miesza:

 

GML
globalvar lista;

lista = ds_list_create();

 

ds_list_add(lista,spr_1);

ds_list_add(lista,spr_2);

ds_list_add(lista,spr_3);

ds_list_add(lista,spr_4);

 

ds_list_shuffle(lista);

 

Później 4 objekty które wybierają i usuwają pozycje w tabeli:

obj_1:

 

GML
sprite_index = ds_list_find_value(lista,0);

 

ds_list_delete(lista,0);

obj_2:

 

GML
sprite_index = ds_list_find_value(lista,1);

 

ds_list_delete(lista,1);

obj_3:

 

GML
sprite_index = ds_list_find_value(lista,2);

 

ds_list_delete(lista,2);

obj_4:

 

GML
sprite_index = ds_list_find_value(lista,3);

 

ds_list_delete(lista,3);

 

Wszystko elegancko ale powie mi ktoś dalczego wywala bład? :

 

FATAL ERROR in

action number 1

of Create Event

for object obj_4:

 

Push :: Execution Error - Variable Get -5.lista(100000, 0)

at gml_Object_obj_4_Create_0 (line 1) - sprite_index = ds_list_find_value(lista,3);

Odnośnik do komentarza
Udostępnij na innych stronach

obj_control mam w oddzienlym pokoju który odpala się przed pokojem w którym jest obj_4.

 

wie ktoś dlaczego w tym kodzie wyglądy się powtarzają?

 

GML
global.liczba1 = irandom_range(1,4);

k = 0

k1 = 0

k2 = 0

k3 = 0

 

 

if global.liczba1 == 1 && k == 0

{

sprite_index = spr_1

k++

}

else

randomize();

if global.liczba1 == 2 && k1 == 0

{

sprite_index = spr_2

k1++

}

else

randomize();

if global.liczba1 == 3 && k2 == 0

{

sprite_index = spr_3

k2++

}

else

randomize();

if global.liczba1 == 4 && k3 == 0

{

sprite_index = spr_4

k3++

}

else

randomize();

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności

to jest ta kontrolka, tak?

po prostu przed "sprite_index" daj "x.", gdzie x to obiekt któremu chcesz zmienić sprite

 

https://gmclan.org/?wiki=article&zm=11

 

edit: Jezu, dopiero teraz zobaczyłem o co chodzi w całym temacie, przeczytałem tylko ostatni post i nie zrozumiałem

edit 2: no, ale z tym adresowaniem to trafiłem, zmień k, k1, k2 i k3 na global., żeby były dla każdego losującego obiektu takie same

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności

create jednego obiektu

GML
global.k=0

global.k1=0

global.k2=0

global.k3=0

 

step jednego obiektu

GML
global.liczba1 = irandom_range(1,4);

 

step wszystkich obiektów

GML
if global.liczba1 == 1 && global.k == 0

{

sprite_index = spr_1

global.k++

}

else if global.liczba1 == 2 && global.k1 == 0

{

sprite_index = spr_2

global.k1++

}

else if global.liczba1 == 3 && globalk2 == 0

{

sprite_index = spr_3

global.k2++

}

else if global.liczba1 == 4 && global.k3 == 0

{

sprite_index = spr_4

global.k3++

}

 

tu nie ma co się wysypywać

Odnośnik do komentarza
Udostępnij na innych stronach

Mam tak:

obj_1 > create event:

GML
global.k=0

global.k1=0

global.k2=0

global.k3=0

obj_1 > step event:

GML
global.liczba1 = irandom_range(1,4);

 

if global.liczba1 == 1 && global.k == 0

{

sprite_index = spr_1

global.k++

}

else if global.liczba1 == 2 && global.k1 == 0

{

sprite_index = spr_2

global.k1++

}

else if global.liczba1 == 3 && global.k2 == 0

{

sprite_index = spr_3

global.k2++

}

else if global.liczba1 == 4 && global.k3 == 0

{

sprite_index = spr_4

global.k3++

}

 

obj_2 obj_3 obj_4 > step event:

GML
if global.liczba1 == 1 && global.k == 0

{

sprite_index = spr_1

global.k++

}

else if global.liczba1 == 2 && global.k1 == 0

{

sprite_index = spr_2

global.k1++

}

else if global.liczba1 == 3 && global.k2 == 0

{

sprite_index = spr_3

global.k2++

}

else if global.liczba1 == 4 && global.k3 == 0

{

sprite_index = spr_4

global.k3++

}

 

obj_1 zmienił wygląd, pozostałe nie :P

 

ma być step, begin step czy end step?

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli wszystkie obiekty wylosuja liczbe 1 to tylko wygląd jednego objektu się zmieni, trzeba dodać że jeśli już występiła ta liczba to pomieszaj i jeszcze raz losuj.

 

Czyli tak jak poprzednio:

GML
if global.liczba1 == 1 && global.k == 0

{

sprite_index = spr_1

global.k++

}

else if global.liczba1 == 2 && global.k1 == 0

{

sprite_index = spr_2

global.k1++

}

else if global.liczba1 == 3 && global.k2 == 0

{

sprite_index = spr_3

global.k2++

}

else if global.liczba1 == 4 && global.k3 == 0

{

sprite_index = spr_4

global.k3++

}

plus:

GML
else if global.liczba1 == 1 && global.k1 == 1

{

randomize();

}

else if global.liczba1 == 2 && global.k2 == 1

{

randomize();

}

else if global.liczba1 == 3 && global.k3 == 1

{

randomize();

}

else if global.liczba1 == 4 && global.k4 == 1

{

randomize();

}

dobrze mysle?

 

EDIT: i tak nie działa:

 

FATAL ERROR in

action number 1

of Step Event0

for object obj_3:

 

Push :: Execution Error - Variable Get -5.k4(100005, 0)

at gml_Object_obj_3_Step_0 (line 35) - else if global.liczba1 == 4 && global.k4 == 1

 

:crying: :crying: :crying:

Odnośnik do komentarza
Udostępnij na innych stronach

  • 2 tygodnie później...

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