[botta&risposta] Funzioni per array (anche lite)

Tutorial, videotutorials ed esempi creati da noi
Rispondi
Avatar utente
Homunculus
Admin
Messaggi: 6840
Iscritto il: 25/11/2007, 20:36
Contatta:

[botta&risposta] Funzioni per array (anche lite)

Messaggio da Homunculus »

Visto che le funzioni ds_* di game maker sono un'esclusiva della pro, ho pensato di strizzare l'occhio a chi utilizza gm lite (ma non necessariamente) implementando un paio di funzioni utili per la gestione di array. Si tratta di una funzione che mescola a caso i valori di un'array, e una funzione che ordina gli elementi di un array.
Gli algoritmi utilizzati dovrebbero essere piuttosto veloci, purtroppo però immagino che ci siano problemi di performance dovuti al fatto che non si puo passare array agli script di gm se non indicando il nome come stringa (che viene poi interpretata al volo, generalmente un'operazione lenta)

array_shuffle
Riordina a caso gli elementi di un'array
Spoiler

Codice: Seleziona tutto

//Prende come argomento il nome di un array in stringa e la sua grandezza, e mescola i valori
//argomenti: nome_array,dimensione_array

var array,size,i,rnd,temp;

array = argument0;
size = argument1;

for(i=0;i<size;i+=1) {
    rnd = floor(random(size-i))+i;
    temp = variable_local_array_get(array,i);
    variable_local_array_set(array,i,variable_local_array_get(array,rnd));
    variable_local_array_set(array,rnd,temp);
}
array_sort
Ordina gli elementi di un array in modo ascendente (stringhe o numeri, non funziona con array misti) utilizzando l'algoritmo quicksort. La funzione necessita dello script array_partition.
Spoiler

Codice: Seleziona tutto

//Ordina un array in modo ascendente. Prende come argomenti il nome dell'array in stringa
//e la sua dimensione - 1 .
//argomenti: nome_array,dimensione-1

var array,lo,hi,pivot;

array = argument0;
lo = argument2;
hi = argument1;

if(lo < hi) {
    pivot = array_partition(array,hi,lo);
    array_sort(array,pivot-1,lo);
    array_sort(array,hi,pivot+1);
}
array_partition
funzione utilizzata in array_sort

Codice: Seleziona tutto

var array,i,j,pivot,lo,hi,temp;

array = argument0;
lo = argument2;
hi = argument1;
pivot = variable_local_array_get(array,hi);
i = lo - 1;

for(j=lo;j<hi;j+=1) {
    if(variable_local_array_get(array,j) <= pivot) {
        i += 1;
        temp = variable_local_array_get(array,i);
        variable_local_array_set(array,i,variable_local_array_get(array,j));
        variable_local_array_set(array,j,temp);
    }
}

temp = variable_local_array_get(array,i+1);
variable_local_array_set(array,i+1,variable_local_array_get(array,hi));
variable_local_array_set(array,hi,temp);

return i+1;
:cappa:

Avatar utente
maz85
Admin
Messaggi: 8287
Iscritto il: 07/02/2004, 15:57
Specialità: Nientologo
Località: Oblio
Contatta:

Re: [botta&risposta] Funzioni per array (anche lite)

Messaggio da maz85 »

L'ordinare array è veramente utile. :cappa:

Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: [botta&risposta] Funzioni per array (anche lite)

Messaggio da Jak »

Che senso ha mescolare i valori di un'array? Inoltre che centra mescolare valori con le ds? Bastava fare una funzione per generare ad esempio griglie da array semplici.
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you

Avatar utente
Homunculus
Admin
Messaggi: 6840
Iscritto il: 25/11/2007, 20:36
Contatta:

Re: [botta&risposta] Funzioni per array (anche lite)

Messaggio da Homunculus »

-Senso ne ha eccome, prendi per esempio un gioco di carte dove il tuo mazzo é un array. Se vuoi mescolarlo usi la funzione (é solo un'esempio, ma le applicazioni del mescolamento sono parecchie)
-Il sort e il mescolamento nelle ds_list esistono già, ma le ds_list sono un'esclusiva della pro, chi non ha la pro deve accontentarsi dei normali array
-Non ho capito la questione delle griglie, che c'entra col mescolamento?

Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: [botta&risposta] Funzioni per array (anche lite)

Messaggio da Jak »

Tu avevi parlato di ds_* quindi pensavo che intendessi anche ds_grid ecc oltre alle ds_list
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 14 ospiti