combinazione cassaforte

Hai una curiosità o un problema con Game Maker? Domanda e ti sarà risposto!
Rispondi
Avatar utente
topoghigio
Newbie
Messaggi: 19
Iscritto il: 25/06/2015, 8:47
Uso: GM:Studio 2
Contatta:

combinazione cassaforte

Messaggio da topoghigio »

Ciao a tutti, rieccomi con un nuovo grattacapo :fapensare: .
Ho una valigetta 24 ore da aprire, però è chiusa con una combinazione di 3 numeri.La combinazione per aprirla facciamo finta che sia 768.
Come posso dargli il comando che deve aprirsi solo quando tutt'e tre i numeri sono nella posizione giusta? Non ne vengo fuori,potete aiutarmi? :cappa:

Avatar utente
Cash
Membro super
Messaggi: 933
Iscritto il: 09/11/2013, 20:40
Uso: GM:Studio 1.4 Pro
Contatta:

Re: combinazione cassaforte

Messaggio da Cash »

topoghigio ha scritto:Ciao a tutti, rieccomi con un nuovo grattacapo :fapensare: .
Ho una valigetta 24 ore da aprire, però è chiusa con una combinazione di 3 numeri.La combinazione per aprirla facciamo finta che sia 768.
Come posso dargli il comando che deve aprirsi solo quando tutt'e tre i numeri sono nella posizione giusta? Non ne vengo fuori,potete aiutarmi? :cappa:
Semplicemente ti tieni 3 variabili per indicare i 3 numeri della combinazione e fai un IF per vedere se la combinazione è corretta

Codice: Seleziona tutto

if ( numero1 == 7 && numero2 == 6 && numero3 == 8)
{
  //Apriti
}
(Il && significa AND,cioè le istruzioni dentro l'if vengono eseguite solo se tutte e tre le condizioni risultano vere)

Avatar utente
CaptainOlon
Membro attivo
Messaggi: 441
Iscritto il: 30/07/2011, 14:56
Specialità: Programmazione
Uso: GM:Studio 1.4 Pro
Località: Salerno
Contatta:

Re: combinazione cassaforte

Messaggio da CaptainOlon »

Ti consiglio di guardarti questo :manual:
Immagine
Immagine

Avatar utente
pacmino
GMI Guru
Messaggi: 2569
Iscritto il: 03/06/2009, 16:38
Specialità: Scazzato cronico
Uso: GM:Studio 2
Località: Seconda stella a destra questo è il cammino e poi dritto, fino al mattino...
Contatta:

Re: combinazione cassaforte

Messaggio da pacmino »

dipende da come fai selezionare la combinazione, deve essere digitata, devi clikkare su degli oggetti che rappresentano i numeri, componi la combinazione tramite freccette che cambiano i numeri da 0 a 9?
Immagine

Avatar utente
topoghigio
Newbie
Messaggi: 19
Iscritto il: 25/06/2015, 8:47
Uso: GM:Studio 2
Contatta:

Re: combinazione cassaforte

Messaggio da topoghigio »

Scusate la lentezza nello rispondere. Diciamo che ho usato un metodo un pò contorto, cerco di spiegare quel che ho fatto:ho creato oggetti numeri dallo 0 al 9.quando clicco sullo 0 creo oggetto 1 e distruggo 0 e così via.. naturalmente in 3 file perché la combinazione è di 3 numeri. Facendo finta che la combinazione sia 768, nella fila del 6(quindi la prima fila) ho detto: quando clicchi nell'ogg. 5 crea ogg. 6, distruggi ogg.5 e crea ogg.x invisibile ma solido(che però si distrugge se clicco nell'ogg.6). Poi ho fatto la stessa cosa con la seconda fila dove si crea l 'ogg.y quando arrivo nel6. L'ogg.x e y quando collidono creano l'ogg.z che a sua volta dovrà collidere con l'ogg.q creato dall'8. Si,è molto contorto ma funziona :asd: Io col codice sono proprio negata. Nella teoria ho capito cosa sono le variabili ma nella pratica non le so applicare :cry:

Avatar utente
Wolfrost
Membro super
Messaggi: 692
Iscritto il: 03/08/2014, 13:08
Specialità: Programmazione
Uso: GM:Studio 1.4 Pro
Località: Una galassia lontana lontana...
Contatta:

Re: combinazione cassaforte

Messaggio da Wolfrost »

topoghigio ha scritto:Scusate la lentezza nello rispondere. Diciamo che ho usato un metodo un pò contorto, cerco di spiegare quel che ho fatto:ho creato oggetti numeri dallo 0 al 9.quando clicco sullo 0 creo oggetto 1 e distruggo 0 e così via.. naturalmente in 3 file perché la combinazione è di 3 numeri. Facendo finta che la combinazione sia 768, nella fila del 6(quindi la prima fila) ho detto: quando clicchi nell'ogg. 5 crea ogg. 6, distruggi ogg.5 e crea ogg.x invisibile ma solido(che però si distrugge se clicco nell'ogg.6). Poi ho fatto la stessa cosa con la seconda fila dove si crea l 'ogg.y quando arrivo nel6. L'ogg.x e y quando collidono creano l'ogg.z che a sua volta dovrà collidere con l'ogg.q creato dall'8. Si,è molto contorto ma funziona :asd: Io col codice sono proprio negata. Nella teoria ho capito cosa sono le variabili ma nella pratica non le so applicare :cry:
E' un metodo TROPPO e dico TROPPO contorto. L'algoritmo che vuoi creare è semplicissimo... Cercherò di crearne uno io tutto in codice:
Abbiamo un obj_Cassaforte che ha la variabile booleana open. Open = true -> la cassaforte è aperta, open = false -> la cassaforte è chiusa.

In create event di obj_Cassaforte

Codice: Seleziona tutto

open = false; //La cassaforte non è ancora aperta, quindi open è uguale a false quando viene creata

//Creiamo una combinazione randomica e ce la piazziamo in un array
combination[2] = 0; //Prima creiamo l'array
for (var i=0; i<3; i++)
combination[i] = irandom(10); //In questo modo mettiamo all'interno dell'array dei valori randomici
Possiamo anche aver finito... adesso passiamo ad obj_Bottone... ne dovremo piazzare 3, ma per ora creiamo il codice

In create event

Codice: Seleziona tutto

numero = 0; //E' il numero del bottone
Mouse left pressed event

Codice: Seleziona tutto

if (numero<10) numero++ else numero=0; //Cicliamo ogni volta che clicchiamo sopra...
Adesso la parte un filino più complicata: aprire la cassaforte.
Quando creiamo la cassaforte, dobbiamo aggiungere il codice di creazione di 3 bottoni, ad y uguali ma x diverse

Sempre in create di obj_Cassaforte

Codice: Seleziona tutto

button1 = instance_create(x-32,y,obj_Bottone); //Il primo bottone
button2 = instance_create(x,y,obj_Bottone); //Il secondo bottone, centrale
button3 = instance_create(x+32,y,obj_Bottone); //Il terzo bottone
Potevo farlo anche con un for ma fidati non ho proprio voglia meglio farlo ignorante

Continuiamo, in Step event di obj_Cassaforte

Codice: Seleziona tutto

///Controllo per vedere se ho azzeccato la combinazione
if (button1.numero==combination[0]&&button2.numero==combination[1]&&button3.numero==combination[2]) open = true; //Apriamo la cassaforte
else open = false; //Altrimenti la cassaforte resta chiusa
Ecco fatto, facile veloce e soprattutto facile da correggere! Se ci dovessero essere problemi o si vuole aggiungere qualcosa farlo è facilissimo! I piccoli vantaggi del GML ;)
Immagine

Immagine

Avatar utente
topoghigio
Newbie
Messaggi: 19
Iscritto il: 25/06/2015, 8:47
Uso: GM:Studio 2
Contatta:

Re: combinazione cassaforte

Messaggio da topoghigio »

Scusami Wolfrost, in questi giorni ho letto ogni post dove si parlava di arrey e variabili ecc.. ho cercato guide, tutorial ecc.. e a livello teorico li ho capiti, ma a livello pratico no!! Quando scrivi :"//Creiamo una combinazione randomica e ce la piazziamo in un array" io già mi perdo... :cry:

Avatar utente
Annoyed grunt
Membro d'elite
Messaggi: 1422
Iscritto il: 10/04/2009, 16:21
Uso: GM:Studio 2
Contatta:

Re: combinazione cassaforte

Messaggio da Annoyed grunt »

Un array è una lista di variabili. La cosa bella di un array è vi ci si può accedere dinamicamente. Mi spiego.
Se tu hai cinque variabili numerate lista_* (lista_1, lista-2, etc etc) l'unico modo per accedervi è questo:

Codice: Seleziona tutto

lista_1 = 2;
lista_2 = lista_1;
lista_3 = lista_1 * lista_2;
Praticamente devi scrivere ogni variabile, e puoi accedere solo alle variabili che hai scritto tu, quindi se tu non scrivi lista_3 = 'cicciobello', lista_3 non sarà mai uguale a 'cicciobello'.
Al contrario, puoi accedere dinamicamente a qualsiasi indice di un array.
Facciamo un esempio estremo: accedi ad un indice casuale, e mostra il suo valore.
Usando le variabili singole, sarebbe una cosa del genere:

Codice: Seleziona tutto

var i = irandom_range(1,5);
switch(i)
{
case 1: show_message(list_1); break;
case 2: show_message(list_2); break;
case 3: show_message(list_3); break;
case 4: show_message(list_4); break;
case 5: show_message(list_5); break;
}
Finché le variabili che abbiamo sono solo 5, va pure bene. E' brutto ma funziona. Ma se per esempio abbiamo 100 variabili? O 1000? Sarebbe un lavoro immane e, in definitiva, stupido.
Usando gli array:

Codice: Seleziona tutto

var i = irandom(1,5);
show_message(list[i]);
E abbiamo fatto. Ovviamente, come con le variabili normali, è necessario dare un valore ai vari indici prima di poterli recuperare.
Immagine

Avatar utente
Wolfrost
Membro super
Messaggi: 692
Iscritto il: 03/08/2014, 13:08
Specialità: Programmazione
Uso: GM:Studio 1.4 Pro
Località: Una galassia lontana lontana...
Contatta:

Re: combinazione cassaforte

Messaggio da Wolfrost »

topoghigio ha scritto:Scusami Wolfrost, in questi giorni ho letto ogni post dove si parlava di arrey e variabili ecc.. ho cercato guide, tutorial ecc.. e a livello teorico li ho capiti, ma a livello pratico no!! Quando scrivi :"//Creiamo una combinazione randomica e ce la piazziamo in un array" io già mi perdo... :cry:
Analizziamo passo passo il mio code:

Create Event

Nel Create Event vengono di solito inizializzate le variabili dell'object in modo da essere utilizzate in seguito in altri eventi dell' object. Ma cosa sono le variabili?
In GM possiamo vederle come dei contenitori di valori: puoi metterci proprio di tutto dentro, da numeri a stringhe :baron:

Nel Create Event di obj_Cassaforte, l'object che rappresenta la cassaforte, abbiamo dichiarato una variabile open, che è booleana: che significa? Che può assumere solo i valori 0 (false) e 1 (true) :asd:
Questa variabile ci serve molto perchè ci permette di capire se la cassaforte è aperta (open = true) o chiusa (open = false);

Poi procedo all'uso di un array: ma a che mi serve? Vediamo questo array dal punto di vista grafico.
Immagine

Il numeretto che vedi sopra ogni cella è il suo indice. Per accedere, ad esempio, al valore della cella 0, ci basterà scrivere combinazione[0], e così via per tutti gli indici dell' array. Ovviamente all'interno di ogni cella c'è un valore, nel mio caso ho usato l'array combinazione[] (che possiede 3 celle) per conservare i numeri della combinazione della cassaforte :mrgreen:
Con la funzione irandom(10); mi assicuro di generare all'interno di queste celle valori casuali che vanno da 0 a 9, valori che tramite un ciclo for vengono inseriti nell'array sfruttando il ciclatore (i) del for. E' una tecnica comune inizializzare gli array in questo modo. Preferisco non cadere nel puro tecnico :sisisi:

Comunque sia una volta creato questo array ce lo abbiamo pronto all'uso: conserverà la combinazione della cassaforte (che sarà sempre casuale) ;)

A questo punto procedo alla creazione del codice di obj_Bottone, l'object che ci permetterà di inserire i numeri della combinazione del gioco!
Il suo codice è parecchio basilare: inizializziamo una variabile che si chiama numero ed ogni volta che clicchiamo su questo bottone facciamo aumentare di 1 il valore di numero (numero++): attenzione però! Se il numero è 9 esso diventerà 10 e noi non vogliamo ciò, quindi tramite un if quando arriverà a 10 lo faremo ritornare a 0 (in questo modo cicleremo costantemente).

A questo punto però, abbiamo il nostro bottone, ma la cassaforte non saprà mai quale numero deve controllare: per questo creiamo le istanze di obj_Bottone tramite il Create Event di obj_Cassaforte, perchè a noi occorrono 3 ID :asd:
Ogni istanza ha un suo univoco id che ci permette di accedere alle sue personali variabili. In questo caso, ci occorre accedere alla personale variabile numero di ogni istanza, per fare questo ci basterà fare id.numero. Ma come recuperare questo ID?

La funzione instance_create(x,y,obj) permette di creare un istanza nella room, ma non solo! Essa ritornerà anche l'id di questa istanza, quindi ci basterà fare

Codice: Seleziona tutto

bottone1 = instance_create(bla bla bla)
per avere subito registrato nella variabile bottone1 l' ID univoco di quell'istanza di obj_Bottone. Questo ci è molto utile, perchè nello step controlleremo proprio questo.

Nello Step Event (quindi l'evento accade ogni singolo frame del gioco), andremo a controllare se la combinazione è giusta, usando appunto gli ID che abbiamo recuperato. Fatti i dovuti controlli, settiamo open a true (se abbiamo azzeccato la combinazione) o a false se non ce l'abbiamo fatta.

Questo sistema è parecchio basilare e ci permette di ottenere il risultato che volevi in davvero pochissime righe di codice! E non solo! Tramite la variabile open potrai personalizzare al massimo le azioni conseguenti 8)

Spero di essere stato chiaro, personalmente sono una pippa a spiegare
Immagine

Immagine

Avatar utente
topoghigio
Newbie
Messaggi: 19
Iscritto il: 25/06/2015, 8:47
Uso: GM:Studio 2
Contatta:

Re: combinazione cassaforte

Messaggio da topoghigio »

Ma che "pippa", sei stato chiarissimo e grazie per aver perso tempo con me (grazie a tutti). Purtroppo ho ancora qualche problema, infatti non mi appaiono i numeri dentro i bottoni :confuso: e non capisco perché...sicuramente mi sto perdendo dentro un bicchier d'acqua

Avatar utente
Wolfrost
Membro super
Messaggi: 692
Iscritto il: 03/08/2014, 13:08
Specialità: Programmazione
Uso: GM:Studio 1.4 Pro
Località: Una galassia lontana lontana...
Contatta:

Re: combinazione cassaforte

Messaggio da Wolfrost »

topoghigio ha scritto:Ma che "pippa", sei stato chiarissimo e grazie per aver perso tempo con me (grazie a tutti). Purtroppo ho ancora qualche problema, infatti non mi appaiono i numeri dentro i bottoni :confuso: e non capisco perché...sicuramente mi sto perdendo dentro un bicchier d'acqua
Certo non ti appaiono perchè non li disegni :asd: Game Maker non prende nulla per scontato: andiamo a vedere come si disegnano robe a schermo! :cappa:

Per farlo ci serviamo del draw event: un evento che funziona proprio come lo step event ma è fatto apposta per disegnare cose.
E' infatti in questo evento che usiamo:

Codice: Seleziona tutto

draw_text(x,y,string(numero));
Attenzione però! Il draw event farà capire a Game Maker che a te non interessa disegnare lo sprite dell'istanza, e questo in molti casi non ci sta bene! Fortunatamente esiste la funzione draw_self(); da mettere nel codice che evita questo problema :metalgo:

Purtroppo la funzione draw_text (che serve per disegnare testo a delle specifiche coordinate) accetta come parametro da scrivere solo stringhe, per questo usiamo la funzione string(int) per convertire il numero a stringa, così ad esempio 1 diventerà "1" e sarà accettato da draw_text
Ci sono un sacco di funzioni draw ma non è il luogo ne' il momento di spiegarle.
Se vuoi entrare nel tecnico e mastichi l'inglese: *click*

Di più sul draw text: *click*
Immagine

Immagine

Avatar utente
guidox
GMI Honor
Messaggi: 5765
Iscritto il: 26/07/2009, 17:23
Specialità: programmazione
Uso: GM:Studio 1.4 Android
Località: Marche
Contatta:

Re: combinazione cassaforte

Messaggio da guidox »

Credo che sia tutto giusto, ho notato solo questo nel post di Wolfrost

In game maker per inizializzare una variabile basta assegnargli un valore, quindi teoricamente questo pezzo di codice è inutile:
Wolfrost ha scritto:

Codice: Seleziona tutto

combination[2] = 0; //Prima creiamo l'array
Ed anzi, se volevi assegnare il valore 0 a combination[0],combination[1] e combination[2], è anche sbagliato!
Infatti in game maker bisogna assegnare ogni posizione dell'array. In questo caso:

Codice: Seleziona tutto

for (var i=0; i<3; i++) combination[i] = 0;
Immagine

Immagine

Avatar utente
topoghigio
Newbie
Messaggi: 19
Iscritto il: 25/06/2015, 8:47
Uso: GM:Studio 2
Contatta:

Re: combinazione cassaforte

Messaggio da topoghigio »

Siiii,grazie mille :lol: sono felicissima!!Ora i numeri ci sono e girano,però c'è ancora una cosa ( :hum: solo una, certo come no! :asd: ) che non capisco. Come devo fare con open=true o false? devo crearmi 2 obj_cassaforte, uno con l'immagine della cassaforte aperta e una chiusa? :confuso:

Avatar utente
CaptainOlon
Membro attivo
Messaggi: 441
Iscritto il: 30/07/2011, 14:56
Specialità: Programmazione
Uso: GM:Studio 1.4 Pro
Località: Salerno
Contatta:

Re: combinazione cassaforte

Messaggio da CaptainOlon »

No, basta cambiare lo sprite! Aggiungi questo nello step event:

Codice: Seleziona tutto

if(open) sprite_index = SPRITE_CASSAFORTE_APERTA;
else sprite_index = SPRITE_CASSAFORTE_CHIUSA;
Immagine
Immagine

Avatar utente
Wolfrost
Membro super
Messaggi: 692
Iscritto il: 03/08/2014, 13:08
Specialità: Programmazione
Uso: GM:Studio 1.4 Pro
Località: Una galassia lontana lontana...
Contatta:

Re: combinazione cassaforte

Messaggio da Wolfrost »

CaptainOlon ha scritto:No, basta cambiare lo sprite! Aggiungi questo nello step event:

Codice: Seleziona tutto

if(open) sprite_index = SPRITE_CASSAFORTE_APERTA;
else sprite_index = SPRITE_CASSAFORTE_CHIUSA;
Immagine

Immagine

Avatar utente
Tizzio
GMI Honor
Messaggi: 5836
Iscritto il: 29/06/2010, 23:43
Specialità: programmazione
Contatta:

Re: combinazione cassaforte

Messaggio da Tizzio »

guidox ha scritto:Credo che sia tutto giusto, ho notato solo questo nel post di Wolfrost

In game maker per inizializzare una variabile basta assegnargli un valore, quindi teoricamente questo pezzo di codice è inutile:
Wolfrost ha scritto:

Codice: Seleziona tutto

combination[2] = 0; //Prima creiamo l'array
Ed anzi, se volevi assegnare il valore 0 a combination[0],combination[1] e combination[2], è anche sbagliato!
Infatti in game maker bisogna assegnare ogni posizione dell'array. In questo caso:

Codice: Seleziona tutto

for (var i=0; i<3; i++) combination[i] = 0;
E' giusto come ha fatto wolfrost, per il modo in cui GM gestisce gli array.
Prima definisci il valore alla massima grandezza (per evitare il resize del buffer a ogni iterazione) e gamemaker creerà automaticamente tutto il buffer
Poi inserisci i valori che vuoi.

Avatar utente
topoghigio
Newbie
Messaggi: 19
Iscritto il: 25/06/2015, 8:47
Uso: GM:Studio 2
Contatta:

Re: combinazione cassaforte

Messaggio da topoghigio »

Sisisi, è proprio come lo volevo io! Grazie a tutti, mi avete aiutato tantissimo, grazie per la pazienza. Grazie Wolf!

Avatar utente
Wolfrost
Membro super
Messaggi: 692
Iscritto il: 03/08/2014, 13:08
Specialità: Programmazione
Uso: GM:Studio 1.4 Pro
Località: Una galassia lontana lontana...
Contatta:

Re: combinazione cassaforte

Messaggio da Wolfrost »

Tizzio ha scritto: E' giusto come ha fatto wolfrost, per il modo in cui GM gestisce gli array.
Prima definisci il valore alla massima grandezza (per evitare il resize del buffer a ogni iterazione) e gamemaker creerà automaticamente tutto il buffer
Poi inserisci i valori che vuoi.
Esattamente Tizzio :asd:
topoghigio ha scritto:Sisisi, è proprio come lo volevo io! Grazie a tutti, mi avete aiutato tantissimo, grazie per la pazienza. Grazie Wolf!
Prego di niente :cappa: Semmai avessi bisogno di qualcos'altro non esitare a postare e soprattutto non esitare a codare! E' il passo avanti che ti serve per iniziare a fare dei giochi degni di questo nome! :mrgreen:
Immagine

Immagine

Avatar utente
guidox
GMI Honor
Messaggi: 5765
Iscritto il: 26/07/2009, 17:23
Specialità: programmazione
Uso: GM:Studio 1.4 Android
Località: Marche
Contatta:

Re: combinazione cassaforte

Messaggio da guidox »

Tizzio ha scritto:
guidox ha scritto:Credo che sia tutto giusto, ho notato solo questo nel post di Wolfrost

In game maker per inizializzare una variabile basta assegnargli un valore, quindi teoricamente questo pezzo di codice è inutile:
Wolfrost ha scritto:

Codice: Seleziona tutto

combination[2] = 0; //Prima creiamo l'array
Ed anzi, se volevi assegnare il valore 0 a combination[0],combination[1] e combination[2], è anche sbagliato!
Infatti in game maker bisogna assegnare ogni posizione dell'array. In questo caso:

Codice: Seleziona tutto

for (var i=0; i<3; i++) combination[i] = 0;
E' giusto come ha fatto wolfrost, per il modo in cui GM gestisce gli array.
Prima definisci il valore alla massima grandezza (per evitare il resize del buffer a ogni iterazione) e gamemaker creerà automaticamente tutto il buffer
Poi inserisci i valori che vuoi.
Scusa Wolfrost non avevo capito... :cry:
Effettivamente ho sempre definito gli array a partire dall'indice 0 quando invece sarebbe meglio definirli a partire dall'ultimo valore! :rockrock:
Immagine

Immagine

Rispondi

Chi c’è in linea

Visitano il forum: Google [Bot] e 27 ospiti