6587gianluca Posted May 3, 2009 Report Share Posted May 3, 2009 Ciao lento, ancora non sono tornato a casa e tò scrivendo m olto velocemente dal pc di mio fratello quindi sarò concisissimo. Innanzi tutto mi complimento con te in quanto ciò che il tuo alte ti ha costretto a fare è a dir poco meraviglioso, se voglismo fare un paragone in riferimento ala tua e mia capacità di programmare, io mi paragono ad un albero....tu sei una intera foresta e a dirti la verità in riferimento a ciò che tu hai scritto io non ci capisco niente.....comunqeveniamo a noi..... Ho scaricato il file DK4 e l'ho caricato sul mio telefono e dando l'invio mi da un errore alle seguenti righe mario=[0,1,2]; mario[0]=g.icon("e:\\Images\\mario1.png"); mario[1]=g.icon("e:\\Images\\mario2.png"); se le tolgo mettendoci le sbarrettine davanti il tutto parte e cioè si vede lo schermo sfondo, non si vede mario ed i barili meravigliosamente rotolano in maniera eccellente. Ora mi chiedevo, perchè mi da errore su quelle righe ?? Come faccio a far funzinare i tutto vedendo Marioche viaggia sullo schermo ??? Grazie lento e complimenti.- Link to comment Share on other sites More sharing options...
lento Posted May 3, 2009 Author Report Share Posted May 3, 2009 (edited) mario=[0,1,2]; mario[0]=g.icon("e:\\Images\\mario1.png"); mario[1]=g.icon("e:\\Images\\mario2.png"); Ciao '6587gianluca' mi fa piacere risentirti.Ho provato il programma su due cellulari diversi e mi funziona puntualmente. Ti pongo delle domande anche banali ma vediamo se riesco a risolvere. 1) hai caricato le due immagini di Bros in E:\Images e ti sei accertato che abbiano come nome mario1.png e mario2.png ? 2) Che versione di mShell stai utilizzando (Io uso la 3.01) 3) Il tuo cellulare potrebbe avere un problema di quantità di memoria, Versione di Symbian?... 4) Mi riporti cosa dice l'errore.? Approposito non mi hai dato l'immagine di Bros che salta. Alter ti ha lasciato un programma funzionante ma scritto un pò male perché spera che ci metti mano.......anche la funzione di collisione ora se capisci il programma è semplice da aggiungere.... Famme sapè. Edited May 3, 2009 by lento Link to comment Share on other sites More sharing options...
6587gianluca Posted May 4, 2009 Report Share Posted May 4, 2009 (edited) Ciao '6587gianluca' mi fa piacere risentirti.Ho provato il programma su due cellulari diversi e mi funziona puntualmente. Ti pongo delle domande anche banali ma vediamo se riesco a risolvere. 1) hai caricato le due immagini di Bros in E:\Images e ti sei accertato che abbiano come nome mario1.png e mario2.png ? 2) Che versione di mShell stai utilizzando (Io uso la 3.01) 3) Il tuo cellulare potrebbe avere un problema di quantità di memoria, Versione di Symbian?... 4) Mi riporti cosa dice l'errore.? Approposito non mi hai dato l'immagine di Bros che salta. Alter ti ha lasciato un programma funzionante ma scritto un pò male perché spera che ci metti mano.......anche la funzione di collisione ora se capisci il programma è semplice da aggiungere.... Famme sapè. _________________________________ 1) Si, ho caricato le immagini di mario1 e mario2; 2) per ciò che riguarda la versione, non so dirti di preciso che versione è (da dove si vede la versione ???) comunque è abbastanza vecchiotta, una delle prime; 3) per ciò che riguarda la versione del mjio symbian è symbian 3rd edition del Nokia N95; 4) l'errore è il seguente : ErrArgument: Invalid function argument ed il cursore si ferma all'inizio della riga mario[0]=g.icon("e:\\Images\\mario1.png"); Booooo, non lo so perchè !!!! In effetti ho installato sull'altro cellulare (Nokia N82) la versione di mShell 3.02 e tutto funziona egreggiamente. Il problema grosso per me è che non capendo il programma è difficile, se non impossibile, che riesco ad apportare modifiche ed a svilupparlo a mio piacimento. Edited May 4, 2009 by 6587gianluca Link to comment Share on other sites More sharing options...
lento Posted May 4, 2009 Author Report Share Posted May 4, 2009 (edited) In effetti ho installato sull'altro cellulare (Nokia N82) la versione di mShell 3.02 e tutto funziona egreggiamente.Il problema grosso per me è che non capendo il programma è difficile, se non impossibile, che riesco ad apportare modifiche ed a svilupparlo a mio piacimento. Dalla schermata principale-> mshell->View->About-> ti dice che versione mshell stai usando (Leggi il manuale..) Mi verrebbe voglia di dirti "aggiornalo!" ma, potrebbero esserci altre persone con quella versione e non se la sentono di smanettare il cellulare. Dato che si può eccoti la versione che dovrebbe andare bene anche per mShell piu vecchie della 3.01-3.02.Dk5.txt Provalo e fammi sapere. Come ti sembra il Mario bross salta bene? e corre?. Se hai difficoltà con il sorgente: o gli hai dedicato poco tempo per capirlo, oppure dovresti partire con qualcosa di più semplice. Alternativa... comincia a leggerlo, quello che non capisci chiedi facendo così puoi imparare con più facilità e magari permetti ad altri di imparare dalle tue domande. Parti leggendo il pezzo compreso tra MAIN e END MAIN. Nel leggerlo vedi cosa gentilmente ti aveva scritto 'Il.Socio' qualche post più addietro. Se invece ti interessava solo il gioco... be! posso chiedere ad Alter.... di sicuro le collisioni te le sistema, la musica, i punteggi non sò anche perché non era nostra intenzione scrivere videogiochi. Ciao Facci sapé. Edited May 4, 2009 by lento Link to comment Share on other sites More sharing options...
6587gianluca Posted May 5, 2009 Report Share Posted May 5, 2009 Dato che si può eccoti la versione che dovrebbe andare bene anche per mShell piu vecchie della 3.01-3.02.Dk5.txt Provalo e fammi sapere. Come ti sembra il Mario bross salta bene? e corre?. Ciao, ho provato il file Dk5 però purtroppo non funziona sul mio N95, appena lo avvio con il go mi torna a display la schermata principale..... Per ciò che riguarda Mario a correre corre perfettamente, per ciò che riguarda il salto invece secondo me ci sono alcuni problemi in quanto nel momento in cui andremo a valutare le collisioni sarà difficile che Mario riesca a saltare qualche barile. Secondo me oltre a saltare in alto dovrebbe saltare anche in avanti ed indietro, premendo ad esempio il tasto 1 dovrebbe saltare e contemporaneamente spostarsi sulla sinistra, premendo il tasto 3 dovrebbe saltare e spostarsi sulla destra. Resta il fatto che il tuo è un lavoro eccezionale.......magari io riuscissi a fare cose del genere !!!!!!!!!!!!! Link to comment Share on other sites More sharing options...
lento Posted May 5, 2009 Author Report Share Posted May 5, 2009 Resta il fatto che il tuo è un lavoro eccezionale.......magari io riuscissi a fare cose del genere !!!!!!!!!!!!! Comincia a fare quello che ti ho scritto al post precedente....vedrai che impari e qualcuno che ti risponde alle domande lo trovi. Dal messaggio di errore che mi avevi riportato sembrava che non supportasse le assegnazioni agli array di immagini. Ma visto che anche il modificato Dk5.txt ti da problemi (non avendo la tua vecchia versione di mShell), credo che ti convenga aggiornare il cellulare alla mShell3.02 o 3.01. O sperare che qualcuno in grado di adattarlo partecipi alla discussione. Per via del salto condivido le tue idee ma ricorda, prima si crea un funzionante ROZZO poi lo si affina. Ci sono altre cose da sistemare es. Mario non sale le scale le salta! Quando raggiunge la sua bella può ancora scorrere in lungo e in largo nel vuoto.... Non viene aggiudicato nessun punteggio ecc. ecc. Il gioco non è ancora completo... si sà Ti toccherà finirlo che cé voi fà! Link to comment Share on other sites More sharing options...
6587gianluca Posted May 5, 2009 Report Share Posted May 5, 2009 Con tutta la mia buona volontà.....avoglia a sbattere la testa sul sorgente....leggo, rileggo, rileggo, rileggo...non ci riesco, non riesco a capire funzioni, passaggi e collegamenti. Mi arrendo, non sarò mai in grado di fare da solo un lavoro così complicato. Link to comment Share on other sites More sharing options...
Il.Socio Posted May 5, 2009 Report Share Posted May 5, 2009 (edited) sono necessari come minimo giorni per acquisire lo stretto indispensabile, mesi per impratichirsi un po' e diversi anni per arrivare ad avere una certa padronanza della programmazione... se perdi subito di motivazione al primo ostacolo, mi trovi d'accordo con te: "non sarai mai in grado di fare da solo un lavoro così complicato" se la materia ti appasiona, potresti iniziare con un corso di programmazione basilare in cui ti spiegano flow-chart e logica di programmazione, per poi passare ad affrontare il linguaggio vero e proprio. alcuni di questi corsi sono interamente finanziati dalla comunita' europea e non hanno alcun costo. Edited May 5, 2009 by Il.Socio Link to comment Share on other sites More sharing options...
lento Posted May 5, 2009 Author Report Share Posted May 5, 2009 (edited) Con tutta la mia buona volontà.....avoglia a sbattere la testa sul sorgente....leggo, rileggo, rileggo, rileggo...non ci riesco, non riesco a capire funzioni, passaggi e collegamenti.Mi arrendo, non sarò mai in grado di fare da solo un lavoro così complicato. Di complicato cè solo quello che non conosci. Prova a leggere un libro in aramaico o in ostrogoto, ti sembrerà un insieme di simboli senza senso. Un qualcosa di impossibile da decifrare, o di trovare un senso logico, La stesa cosa è la programmazione. Sto dando una sbirciatina al linguaggio java (j2me per la precisione) e mi trovo nella tua stessa condizione!. Non ci capisco un H. Ora ti chiedo cosa devo fare abbandono?? Dammi un consiglio..... Ciao a presto... C'è qualcosa che posso fare? Edited May 6, 2009 by lento Link to comment Share on other sites More sharing options...
6587gianluca Posted May 5, 2009 Report Share Posted May 5, 2009 (edited) C'è qualcosa che posso fare? No, no.....non ti consiglio assolutamente di abbandonare. Io ho detto che mi arrendo in un momento di debolezza, ma sono già qui che trascrivo le righe a penna su di un foglio al fine di capire che cosa stò scrivendo. Non mi arrendo neanche io, comunque è difficile. Sono sicuro che tu possa fare moltissimo per uno come me che vorrebbe veramente imparare delle nozioni. Il programma che hai scritto forse per uno come me é un po lungo per poterlo capire, sono sicuro pero` che se tu scrivessi qualcosa di piu' semplice e piu' corto (come una specie di corso) magari riuscirei a trarne vantaggi. Ti ringrazio della tua grande e rara disponibilita'. Spero che questa discussione non finisca qui, spero che vada ancora avanti molto. Ad esempio al fine di scrivere qualcosa con l'utilizzo delle funzioni, ma più semplice, potresi (dico potresti in quanto tu sei l'insegnante in questo caso) scrivere un sorgente che faccia muovere a display (anche display completamente bianco) una pallina, ad esempio, da destra verso sinistra. In questo modo leggendo poche righe si potrebbe meglio comprendere il funzionamento. Ti dico la verità, mi stai quasi contagiando....il mio alter mi hadetto "giallllluuuu gli stai a rompe, l'hai capito o no ??? Edited May 6, 2009 by 6587gianluca Link to comment Share on other sites More sharing options...
lento Posted May 6, 2009 Author Report Share Posted May 6, 2009 (edited) scrivere un sorgente che faccia muovere a display (anche display completamente bianco) una pallina, ad esempio, da destra verso sinistra. In questo modo leggendo poche righe si potrebbe meglio comprendere il funzionamento. Ti dico la verità, mi stai quasi contagiando....il mio alter mi hadetto "giallllluuuu gli stai a rompe, l'hai capito o no ??? Non stai a rompe! non preoccuparti. Ti allego una pallina rimbalzanteball.txt Porta pazienza ma sono un pò preso. Devi aspettare Sabato per il resto. Ti riporterò il sorgente commentato e cominceremo a definire il concetto di variabile, in seguito modificheremo il programma. aggiungendo funzioni, e spiegandole.....poi vedremo... Ciao fammi sapere se non ti funziona, per fermarlo premi il tasto 0. Edited May 7, 2009 by lento Link to comment Share on other sites More sharing options...
lento Posted May 7, 2009 Author Report Share Posted May 7, 2009 Analizziamo brevemente il PROBLEMA: Come precedentemente detto è fondamentale sapere cosa si vuole ottenere e conoscere come si fà per averlo. (Problema ---> soluzione del problema) Ricordate questa è l'unica cosa veramente importante! è il luogo dove dei geniacci della matematica e informatica hanno dato il meglio. PROBLEMA: Vogliamo realizzare una pallina in modo grafico che si muove in linea retta, quando incontra i limiti dello schermo rimbalza in direzione opposta. SOLUZIONE: Visto che il nostro schermo lo possiamo considerare come un insieme di piccole celle (tipo quaderno a quadretti) individuablili tramite le coordinate cartesiane 240x320. Se consideriamo y i valori del lato lungo 320 pixel x i valori del lato corto 240 pixel. Vogliamo che la nostra pallina (barile) scenda basso-destra in linea retta Ora: partendo dal vertice alto-sinistra (y=0,x=0) tracciamo una retta che lo congiunge al vertice opposto in basso-destra (y=320,x=240). Se vogliamo creare l'ilusione della pallina che scende lungo la retta dobbiamo: 1) cancellare la precedente pallina disegnata sullo schermo. 2) disegnare la nuova pallina sulla retta un unità piu in basso della volta precedente. 3) Mostrare sullo schermo del cellulare la nuova immagine ottenuta. 4) continuare cosi fino al raggiungimento del vertice opposto (pareti dello schermo). 5) in caso di collisione con pareti invertire il movimento Come si intuisce si tratta di aumentare di un unità sia il valore della y che di x. Per otenere che la pallina rimbalzi indietro basta fare l'opposto diminuire prograssivamente i valori di x e y. Qui si scopre l'arcano! si scopre che con quattro variazioni di y e x si può avere la pallina che si muove in tutte le direzioni: Praticamente: 1)giu-destra : x aumenta y aumenta 2)giu-sinistra : x aumenta y diminuisce 3)su-destra : x diminuisce y aumenta 4)su-sinistra : x diminuisce y diminuisce lato A +-----------------+ | | | | | | C | | lato D | | | | | B | +-----------------+ Non solo ma scopriamo anche che a seconda della parete che la pallina colpisce dovremo cambiare direzione in modo diverso: Colpisce parete C se si stava muovendo giu-sinistra diventa giu-destra se si stava muovendo su-sinistra diventa su-destra Colpisce parete D giu-destra -> giu-sinistra su-destra -> su-sinistra Colpisce parete A su-destra -> giu-destra su-sinistra -> giu-sinistra Colpisce parete B giu-destra -> su-destra giu-sinistra -> su-sinistra Qui si riscopre un altro arcano: avete notato che le pareti A e B non fanno altro che invertire il valore della x? e che le pareti C e D non fanno altro che invertire il valore della y?. ( Spunto per migliorare il programma in futuro.) Ora il programma lo possiamo sintetizzare così: Facendo riferimento allo specchietto: 1)giu-destra : x aumenta y aumenta 2)giu-sinistra : x aumenta y diminuisce 3)su-destra : x diminuisce y aumenta 4)su-sinistra : x diminuisce y aumenta Parto con la pallina in un punto qualsiasi dello schermo Assegno alla variabile v un numero che indica come muoversi (come variare i valori x e y) ripeto ^ se v= 1 (aumento x , aumento y ) | se v= 2 (aumento x , diminuisco y) | se v= 3 (diminuisco x, aumento y ) | se v= 4 (diminuisco x, diminuisco y) | se incontro la parete C o D eseguo --> (se v=1 lo cambio in v=2)(se v=2 lo cambio in v=1) | se incontro la parete A o B eseguo --> (se v=3 lo cambio in v=4)(se v=4 lo cambio in v=3) +--- se non premi il tasto 0 ripeto il tutto. Allego programma commentato.ballcom.txt Link to comment Share on other sites More sharing options...
lento Posted May 7, 2009 Author Report Share Posted May 7, 2009 (edited) A grande richiesta (N.1 utente) di popolo!: Le variabili. Dato che il mio scopo non è fare un trattato (per mia incapacità), qui riporto come le vedo io. Cosa sono le variabili: contanti=13; In questa istruzione si è creata una variabile di nome "contanti" e si è assegnato ad essa il valore numerico di 13. In questa azione bisogna distinguere 4 cose: 0) la disposizione nome "contanti" -> simbolo "=" -> numero "13" 1) il nome della variabile 2) il segno = 3) il contenuto della variabile. Per capire meglio ricominciamo a creare fantasie mentali: Immaginiamo che la memoria del cellulare sia come un enorme casellario o se preferite come una pagina quadrettata. (Prego cliccare per ingrandire immagine!) La caratteristica di questa memoria sta nella possibilità di depositare da parte di mShell dei numeri, delle parole, delle immagini, e tante altre cose. Questi valori possono essere cancellati e riscritti a piacimento. Dall'immagine si vede un numero 13 depositato in una casella, e un pò più in là delle lettere in più caselle che unite formano la parola HELLO. (Cè sta pure Batman!). Queste che state vedendo sono i CONTENUTI cioè i valori che avete incaricato mShell di conservare. Ora come fà mShell a sapere dove sono? Notare la numerazione ai due lati del casellario. E' il vecchio sistema a coordinate cartesiane!. mShell ad esempio imdividua dove si trova realmente in memoria il numero tredici grazie ai due valori 02 e 07 (Colonna 02 Riga 07). Fa anche una cosa strana li accosta ottenendo un numero 0207. Con questo numero mShell trova il valore depositato nella memoria fisica del cellulare. Ma noi come possiamo dire a mShell di prendere il valore 13 per farne qualcosa?. Non possiamo di certo dirgli:"Ei! la la! in fondo a destra...NO! non quello lì latro, si quello!" contanti=13; svolge questo compito. mShell legge la riga da sinistra verso destra, si accorge che cè un nome valido subito dopo un sibolo di = questo indica a mShell che vogliamo assegnare alla variabile "contati" quello che si trova dopo =. mShell è un interprete di bocca buona! capisce da solo se quello dopo = è un numero, una stringa, o una funzione. MECCANISMO di assegnazione: Ora cosa fa nella mia immaginaria macchina mShell? 1)prende la parola "contanti" la immagazzina in un indice che tiene nascosto alla nostra vista. Questo indice è molto simile a quello dei libri. Parola -> pagina dove si parla di quella parola. |contanti 0207 tipo | |batman 0505 tipo | |scacchi 0904 tipo | |dadi 1203 tipo | |edificio 0302 tipo | |hello 0708 tipo | |......... | |____________________| Il suo indice è composto da una parola letterale "scacchi","contanti", ecc seguito da un valore numerico unico! unico significa che indica una e solo una casella nella memoria senza possibilità di errore, e dal tipo che gli serve per capire se è un numero corto lungo se sono lettere e quante sono. Nel caso del 13 gli indica che si tratta di un numero intero e che è contenuto solo in una casella. e il nostro numero 13? dové?. il numero 13 mShell lo ha depositato nella casella indicata dal numero 0207. Due parole sulle caselle: Effettivamente il 13 sta in una casella ma la scritta hello no! come mai? Piccola complicazione: nonostante la nostra fervida immaginazione nella memoria esistono solo numeri e per giunta binari!, cioè 01001101 ogni casella e composta da 8 o 16 o 32 numeri binari l'ampiezza dei numeri binari dipende dal tipo di processore e da come li gestisce. Per semplificare diciamo che certi numeri riesce a immagazzinarli in una sola casella altri deve usare piu caselle (quelli con la virgola per esempio). Le lettere stanno in una casella una per ogni lettera. Ma se noi vogliamo, Assegnare alla variabile hello la stringa "HELLO" come fa?. hello="HELLO"; ? Fa esattamente quello che ha fatto con contanti assegna un numero che identifica la prima casella della frase, in "tipo" depone che si tratta di testo, e quante caselle occupa nella memoria e dove sono. Con queste informazioni è in grado di gestire qualsiasi cosa mettiamo in memoria. Per concludere: print hello; questo comando stampa a video il contenuto della variabile hello. Cosa fà mShell? Legge la riga da sinistra verso destra trova il comando print e sà che deve stampare quello che segue. Si accorge che hello non è una costante letterale (non è racchiusa tra "" o '') si accorge che non è un numero, ne una funzione e capisce che si tratta di una variabile e che vogliamo stampare a video il suo contenuto. Per sapere qualé il suo contenuto, va al suo indice e lo scorre per vedere se contiene una parola uguale a hello, la trova!. |contanti 0207 tipo | |batman 0505 tipo | |scacchi 0904 tipo | |dadi 1203 tipo | |edificio 0302 tipo | |hello 0708 tipo | <----------Trovata! |......... | |____________________| Guarda che tipo di valore è (trattasi di stringa composta da 5 legge) legge il numero 0708 per sapere dove si trova preleva 5 caselle successive e le stampa sul video. +-------------+ | | | HELLO | <----video del telefonino | | +-------------+ o o Cè l'abbiamo fatta!. Con questo meccanismo mentale riesco a capire il funzionamento delle variabili nei programmi. Spero che sarà più facile per chi è totalmente digiuno capire quello che si dirà in seguito. Sempre se dopo questa onirica spiegazione non sarò cacciato dal forum!. Edited May 7, 2009 by lento Link to comment Share on other sites More sharing options...
6587gianluca Posted May 7, 2009 Report Share Posted May 7, 2009 (edited) Non stai a rompe! non preoccuparti.Ti allego una pallina rimbalzanteball.txt Porta pazienza ma sono un pò preso. Devi aspettare Sabato per il resto. Ti riporterò il sorgente commentato e cominceremo a definire il concetto di variabile, in seguito modificheremo il programma. aggiungendo funzioni, e spiegandole.....poi vedremo... Ciao fammi sapere se non ti funziona, per fermarlo premi il tasto 0. Ciao, ho provato ball su N95 con versione vecchia non funziona, sull'N82 con versione nuova di mShell funziona benissimo. sai che giochino simpatico ne nascerebbe se in basso ci fosse una piccola base che se incontrata dalla pallina quest'ultima rimbalsasse invece se non incontrasse la base non rimbalsasse e si perderebbe una vita ??? Dai alter.....non pensare sempre ai giochini....vabbene !!!! Sai, lo script è molto lineare, l'unica cosa che non mi nascerebbe spontanea sarebbe quella di assegnare i valori dei lati del display alla variabile v, nel senso che come faccio a dire che la parete superiore ad esempio deve assumere il valore v=1, quella inferiore v=2 e cosi via ??? Comunque leggendo lo script si capisce molto bene. Complimenti per il lavoro ed anche per le varie spiegazioni delle variabili. Se non ti crea problemi continua così è tutto meraviglioso. Edited May 7, 2009 by 6587gianluca Link to comment Share on other sites More sharing options...
lento Posted May 7, 2009 Author Report Share Posted May 7, 2009 sai che giochino simpatico ne nascerebbe se in basso ci fosse una piccola base che se incontrata dalla pallina quest'ultima rimbalsasse invece se non incontrasse la base non rimbalsasse e si perderebbe una vita ??? Questa è la molla che deve aiutarti a imparare...Per poter modificare il gioco come vuoi. Adesso studialo con calma.... come faccio a dire che la parete superiore ad esempio deve assumere il valore v=1, quella inferiore v=2 e cosi via ??? Comunque leggendo lo script si capisce molto bene. Uuuaaaa! me tapino....me meschino... non sono riuscito a spiegare il problema!. Consigli da alter...prova a leggere con più calma tutto poi famme sapè....ciao Se dopo la lettura (compreso il programma) non capisci indicami quali righe. Link to comment Share on other sites More sharing options...
lento Posted May 8, 2009 Author Report Share Posted May 8, 2009 (edited) Visto che i cicli for...to..do.., do..until, while...end li conosci ed anche if..then..else..end. Tento di darti un idea delle funzioni. Possiamo immaginare una funzione come un microprocessore. | | | | | +----------+ 1°segnale in entrata-> 10 -| funzione |- -> segnale in uscita 18 -|somma(a,|- 2°segnale in entrata-> 8 -| |- +----------+ | | | | | Dove dando dei segnali in ingresso su dei piedini questo ne rende altri sui altri piedini. In teoria una funzione può avere più valori in ingresso ed un solo valore in uscita. risultato=8; function somma(a,; risulato= a+b; return risultato; end; print risultato; --> stamperà 8 print somma(10,8); --> stamperà 18 print risultato; --> stamperà ancora 8 In mShell le funzioni sono viste effettivamente come una scatola chiusa dove tutto quello che si trova tra function e end sono per cosi dire isolate dal resto del programma che le contiene. La variabile risultato vale 8 sia prima che dopo l'uso della funzione perché non è la stessa variabile che vedi all'interno della funzione. Praticamente possiamo immaginare che mShell trasformi internamente il programma in questo modo: functio somma(somma.a,somma.; somma.risultato=somma.a+somma.b; return somma.risultato; end; Per mShell nella funzione somma() ci sono variabili completamente diverse da quelle esterne alla funzione stessa. (Che strano? assomiglia molto alla programmazione ad oggetti this.risultato) Perciò la definizione della funzione è come uno stampo l'archetipo che gli dice cosa deve fare ( che strano sembra di parlare di programmazione ad oggetti?) Ogni volta che attiviamo questa funzione mShell creerà le variabili somma.a somma.b e somma.risultato e le userà per gestire i valori che gli passerai. Terminata la funzione le eliminerà dal suo indice delle variabili. Ragioniamo come le gestisce mShell: (Forti del meccanismo di immagazzinamento sopra spiegato) Allora quando definisci la prima variabile risultato mshell immagazzina il valore 8 nella memoria e nel suo indice personale pone il nome risultato | risultato 0207 tipo| <-- qui mette il nome e dove si trova in memoria il numero 8. | Batman 0809 tipo| +--------------------+ Premetto che fisicamente non sò come le nomina ma di sicuro fa qualcosa di simile. Quando incontra print somma(10,8); Crea le due variabili locali per ricevere i valori che gli ai assegnato. somma.a e gli assegna il valore 10 poi crea somma.b e gli assegna il valore 8 e crea anche somma.risultato e gli assegna il risultato dell'operazione 10+8 | somma.risultato 0910 tipo| <---- ----->18 in memoria | somma.b 1011 tipo| <---- ----->8 in memoria | somma.a 1010 tipo| <---- ----->10 in memoria | risultato 0207 tipo| ----->8 in memoria | Batman 0809 tipo| +---------------------------+ Terminato lo svolgimento del programma contenuto nella funzione elimina le variabili ad essa associate che aveva messo nel suo indice. | | <---- | | <---- Terminato l'uso della funzione vengono eliminate | | <---- | risultato 0207 tipo| ---->8 in memoria rimane | Batman 0809 tipo| +---------------------------+ Una precisazione sul comando return: Abbiamo detto che una funzione restituisce al programma chiamante un valore, questo in genere lo fa il comando return (return termina lo svolgimento della funzione e rende il valore che lo segue) function folle(); return 8; end; a=folle() print a -> 8 In questo caso dopo return cè il valore 8 che renderà a print per stamparlo a video. function folle(); return 9; print "non sono folle!"; return 12; end; print folle() --> 9 Attenzione return rende un valore ma termina anche la funzione, non importa se dopo di essa ci sono altri comandi, questi non vengono eseguiti. Ultima cosa importante una funzione prima di poter essere usata deve essere definita. Perciò il tuo programma potresti suddividerlo così: +----------------------------------------------------+ | chiamata ai moduli da utilizzare <---- prima cosa da fare | | a=10; <---- poi definisci le variabili globali | colore="verde"; | |funcion folle(); <----- poi definisci tutte le funzioni che vuoi usare | return 9; nel programma attuale |end; | | //====== main====== <--- da qui in poi scrivi il programma che | ...... ........ utilizza i valori sopra riportati. | .. ..... ....... |//======END MAIN=== +---------------------------------------------------+ Un momento! fermi tutti! e questa che roba è?? risultato=8; function somma(a,; risultato a+b; return .risultato; end; print somma(10,8); -------> stampa a video 8 Dimenticavo, se all'interno di una funzione si vuol utilizzare una variabile esterna ad essa (Le cosi dette variabili globali) bisogna aggiungere il punto .risultato o doppio punto ..risultato per far capire a mShell che si sta usando una variabile non interna alla funzione, e che non deve distruggerla quando termina la funzione. Perciò questo da risultati diversi da quanto scritto sopra. risultato=8; function somma(a,; .risulato= a+b; return .risultato; end; print risultato; --> stamperà 8 print somma(10,8); --> stamperà 18 print risultato; --> stamperà 18 <-------vedi come cambia! Un ultima cosa poi dovrai camminare con i tuoi piedini....... Le variabili globali che vedi nel programma sono tali solo all'interno di questo programma. Consideriamo che hai una parte di programma in un file e lo richiami in memoria per usarlo. (I cosi detti moduli.) file di nome mio.mm +---------------------+ |risultato=8; | <------ variabile globale all'interno di mio.mm | | |function folle(); | | print .risultato; | |end; | ----------------------+ Programma principale: +-------------------+ |use mio; | | | |risultato=6; | | | |print mio.folle(); | <------- stamperà 8 e non 6 |print risultato; | <------ stampa 6 come previsto. +-------------------+ Come vedi le variabili sono globali sì ma solo all'interno del loro programma. Penso di averti incasinato la mente a sufficienza per poter usare al minimo mShell. Qui termina quanto mi ero prefisso, il resto lo devi imparare dai libri, esempi vari ecc. Sul forum puoi sempre chiedere aiuto e troverai di sicuro risposte da più persone. Magari riportando parte del codice che ti da problemi. Capisco cosa vuol dire tentare di scrivere un programma da autodidatta, imparare da soli leggendo libri è difficile. Se poi (come nel mio caso) la scuola non ti ha dato le minime basi sulla programmazione è dura. Edited June 25, 2011 by lento Link to comment Share on other sites More sharing options...
6587gianluca Posted May 12, 2009 Report Share Posted May 12, 2009 Ciao lento, il lavoro che hai fatto è veramente da lode. Lo leggo e lo rileggo ed a volte pensando che non ho analizzato bene qualche parte della discussione riparto da capo e la rileggo tutta. Comunque complimentoni, sei veramente una persona eccezionale in quanto ti sei dedicato a noi altri con vera dedizione e spirito di sacrificio. Ho buttato giù anche io uno script, naturalmente senza l'uso delle funzioni, che in linea di massima fa fare a Mario ciò che volevo, oggi seriesco ad apportare l'ultima modifica lo allego cosi gli dai un occhiata e mi fai sapere un tuo parere. Ciao e grazie.- Link to comment Share on other sites More sharing options...
lento Posted May 13, 2009 Author Report Share Posted May 13, 2009 Ciao lento, il lavoro che hai fatto è veramente da lode. Lo leggo e lo rileggo ed a volte pensando che non ho analizzato bene qualche parte della discussione riparto da capo e la rileggo tutta. Comunque complimentoni, sei veramente una persona eccezionale in quanto ti sei dedicato a noi altri con vera dedizione e spirito di sacrificio.Ho buttato giù anche io uno script, naturalmente senza l'uso delle funzioni, che in linea di massima fa fare a Mario ciò che volevo, oggi seriesco ad apportare l'ultima modifica lo allego cosi gli dai un occhiata e mi fai sapere un tuo parere. Ciao e grazie.- Ti ringrazio ancora per la tua super valutazione delle mie visioni oniriche, e attendo di poter vedere il tuo sorgente!. Un ultima cosa: Alter (preso dall'entusiasmo) ha scritto anche una base per il gioco della pallina con tanto di paletta come avevi accennato, ti può interessare? Link to comment Share on other sites More sharing options...
6587gianluca Posted May 13, 2009 Report Share Posted May 13, 2009 Ti ringrazio ancora per la tua super valutazione delle mie visioni oniriche, e attendo di poter vedere il tuo sorgente!.Un ultima cosa: Alter (preso dall'entusiasmo) ha scritto anche una base per il gioco della pallina con tanto di paletta come avevi accennato, ti può interessare? Mi chiedi se mi può interessare ?????????????????? MA CERTOOOOOOOOO !!!!!!! scusa per l'entusiasmo ad alta voce, ma io sbavo per queste cose. Attendo che Alter pubblichi il tutto. Link to comment Share on other sites More sharing options...
6587gianluca Posted May 13, 2009 Report Share Posted May 13, 2009 (edited) Allora, di seguito allego il mio sorgente. Le immagini da utilizzare (tutte da copiare in galleria) sono le seguenti : Mario si sposta a destra ed a sinistra su ogni piano con i tasti 4 (sinistra) e 6 (destra); sale le scale (non perfettamente in corrispondenza esatta con la scala) con il tasto 2 (sale); salta verso sinistra con il tasto 1 e salta verso destra con il tasto 3. Quando mario giunge sul piano ove si trova la sua bella vedrete i punti incrementarsi di 10, nello stesso punto apparirà una scritta con scritto "PIU' VELOCE" e contemporaneamente mario riprenderà la sua posizione iniziale (in basso a sinistra) e la velocità del barile anche se impercettibilmente aumenterà....se avete pazionza di scalare il palazzo qualche volta vi accorgerete che il barile verrà giù abbastanza velocemente. Per ora mi sono fermato qui, stò lavorando per fare in modo che Mario debba obbligatoriamente saltare i barili al fine di evitare di perdere una vita. use graph as g,ui; g.size(240,320); g.full(true); sfondo=g.icon("e:\\Images\\donkeysfondo.png"); mariod=g.icon("e:\\Images\\mario1.png",0x000000); marios=g.icon("e:\\Images\\mario2.png",0x000000); bariled=g.icon("e:\\Images\\barilep1.png"); bariles=g.icon("e:\\Images\\barilep1.png"); life=g.icon("e:\\Images\\mlife1.png"); a=30;b=284; score=0;lives=3;vb=30;p=0; do for y=97 to 292 do if (y=169) or (y=251) then for x=23 to 214 do ui.keys(false,false); Key=ui.cmd(vb); if Key=51 then a=a+10;dir=1; b=b-10; g.put(a,b,mariod); g.show(); sleep(100); if (b<284) then a=a+10; b=b+10; g.put(a,b,mariod); g.show(); end; end; if Key=49 then a=a-10;dir=-1; b=b-10; g.put(a,b,marios); g.show(); sleep(100); if (b<284) then a=a-10; b=b+10; g.put(a,b,marios); g.show(); end; end; if Key=52 then a=a-10; dir=-1; end; if Key=54 then dir=1; a=a+10; end; if Key=50 and (a=180) and (b>242) then b=b-2; piano=0; end; if Key=50 and (a=60) and (b>203) then b=b-2; piano=1; end; if Key=50 and (a=170) and (b>160) then b=b-2; piano=2; end; if Key=50 and (a=70) and (b>120) then b=b-2; piano=3; end; if Key=50 and (a=180) and (b>88) and(piano>1) then b=b-2; end; if Key=50 and (a=140) and (b>55) then b=b-2; piano=5; end; if b=54 then p=p+10;vb=vb-2; g.text(100,170,"PIU' VELOCE......"); g.show();sleep(900); a=30;b=284;end; g.put(0,0,sfondo); g.put(x,y,bariled); if dir=-1 then g.put(a,b,marios); else g.put(a,b,mariod); end; for z=1 to lives do g.put(z*15+165,25,life); end;g.show(); g.pen(0xff0000); g.text(160,15,"score");g.text(205,15,p); g.show(); end;end; if (y=128) or (y=209) or (y=292) then for x=214 to 23 by-1 do ui.keys(false,false); Key=ui.cmd(vb); if Key=51 then a=a+10;dir=1; b=b-10; g.put(a,b,mariod); g.show();sleep(100); if (b<284) then a=a+10; b=b+10; g.put(a,b,mariod); g.show(); end; end; if Key=49 then a=a-10;dir=-1; b=b-10; g.put(a,b,marios); g.show(); sleep(100); if (b<284) then a=a-10; b=b+10; g.put(a,b,marios); g.show(); end; end; if Key=52 then a=a-10; dir=-1; end; if Key=54 then a=a+10; dir=1; end; if Key=50 and (a=180) and (b>242) then b=b-2; piano=0; end; if Key=50 and (a=60) and (b>203) then b=b-2; piano=1; end; if Key=50 and (a=170) and (b>160) then b=b-2; piano=2; end; if Key=50 and (a=70) and (b>120) then b=b-2; piano=3; end; if Key=50 and (a=180) and (b>88)and(piano>1) then b=b-2; end; if Key=50 and (a=140) and (b>55) then b=b-2; piano=5; end; if b=54 then p=p+10;vb=vb-2; g.text(100,170,"PIU' VELOCE......"); g.show();sleep(900); a=30;b=284;end; g.put(0,0,sfondo); g.put(x,y,bariled); if dir=-1 then g.put(a,b,marios); else g.put(a,b,mariod); end; for z=1 to lives do g.put(z*15+165,25,life); end;g.show(); g.pen(0xff0000); g.text(160,15,"score");g.text(205,15,p); g.show(); end;end; end; until lives=0; Edited May 13, 2009 by 6587gianluca Link to comment Share on other sites More sharing options...
Il.Socio Posted May 13, 2009 Report Share Posted May 13, 2009 (edited) piccolo appunto... le variabili dovrebbero essere autoesplicative ed in genere hai rispettato questa regola, ma ad una prima occhiata, non mi e' chiaro cosa sono "a", "b", "vb", "p"... le altre invece sono chiarissime... potresti assegnargli nomi piu' comprensibili? EDIT: Mi pare di capire che: "a" e "b" sono la posizione x e y di mario? "p" e' il punteggio? "vb" invece non lo capisco proprio... P.S. per postare il codice sorgente puoi usare il tag: [code ] codice sorgente [ /code] oppure il tag [codebox ] codice sorgente [ /codebox] Cosi' mantiene l'intentatura ed e' piu' chiaro... Edited May 13, 2009 by Il.Socio Link to comment Share on other sites More sharing options...
6587gianluca Posted May 13, 2009 Report Share Posted May 13, 2009 (edited) vb l'ho utilizzato come velocità barile, decrementando aumenta la velocità di movimento del barile, le altre le hai azzeccate. Ciao.- Edited May 13, 2009 by Il.Socio Link to comment Share on other sites More sharing options...
Il.Socio Posted May 13, 2009 Report Share Posted May 13, 2009 (edited) allora ci sono diverse cose che non mi tornano... la velocita' del barile viene inizializzata a 30 poi Key=ui.cmd(vb); 1) cosa centra quello che che credo sia il rilevamento del tasto premuto con la velocita' del barile? 2) perche' se la posizione y di mario ("b") e' uguale a 54, la velocita' del barile diminuisce? 3) facendo sue e giu' con mario e facendolo passare continuamente attraverso la posizione 54 e' possibile portare la velocita' del barile a zero, fermando di fatto il barile. EDIT: aaaahhhh... forse ho capito... quel ui.cmd(vb) aspetta (vb) tempo prima di restituire il valore... ed il 54 e' la posizione in alto dello schermo dove si trova la principessa? In questo caso tornerebbe tutto, ma cosi' facendo non si influenza solo la velocita' del barile, ma la velocita' dell'intero gioco... compresa la velocita' di mario. Qui c'e' il codice originale, con indentazione per chi volesse capirci qualcosa: use graph as g,ui; g.size(240,320); g.full(true); sfondo=g.icon("e:\\Images\\donkeysfondo.png"); mariod=g.icon("e:\\Images\\mario1.png",0x000000); marios=g.icon("e:\\Images\\mario2.png",0x000000); bariled=g.icon("e:\\Images\\barilep1.png"); bariles=g.icon("e:\\Images\\barilep1.png"); life=g.icon("e:\\Images\\mlife1.png"); a=30;b=284; score=0;lives=3;vb=30;p=0; do for y=97 to 292 do if (y=169) or (y=251) then for x=23 to 214 do ui.keys(false,false); Key=ui.cmd(vb); if Key=51 then a=a+10;dir=1; b=b-10; g.put(a,b,mariod); g.show(); sleep(100); if (b<284) then a=a+10; b=b+10; g.put(a,b,mariod); g.show(); end; end; if Key=49 then a=a-10;dir=-1; b=b-10; g.put(a,b,marios); g.show(); sleep(100); if (b<284) then a=a-10; b=b+10; g.put(a,b,marios); g.show(); end; end; if Key=52 then a=a-10; dir=-1; end; if Key=54 then dir=1; a=a+10; end; if Key=50 and (a=180) and (b>242) then b=b-2; piano=0; end; if Key=50 and (a=60) and (b>203) then b=b-2; piano=1; end; if Key=50 and (a=170) and (b>160) then b=b-2; piano=2; end; if Key=50 and (a=70) and (b>120) then b=b-2; piano=3; end; if Key=50 and (a=180) and (b>88) and(piano>1) then b=b-2; end; if Key=50 and (a=140) and (b>55) then b=b-2; piano=5; end; if b=54 then p=p+10;vb=vb-2; g.text(100,170,"PIU' VELOCE......"); g.show();sleep(900); a=30;b=284; end; g.put(0,0,sfondo); g.put(x,y,bariled); if dir=-1 then g.put(a,b,marios); else g.put(a,b,mariod); end; for z=1 to lives do g.put(z*15+165,25,life); end; g.show(); g.pen(0xff0000); g.text(160,15,"score");g.text(205,15,p); g.show(); end; end; if (y=128) or (y=209) or (y=292) then for x=214 to 23 by-1 do ui.keys(false,false); Key=ui.cmd(vb); if Key=51 then a=a+10;dir=1; b=b-10; g.put(a,b,mariod); g.show();sleep(100); if (b<284) then a=a+10; b=b+10; g.put(a,b,mariod); g.show(); end; end; if Key=49 then a=a-10;dir=-1; b=b-10; g.put(a,b,marios); g.show(); sleep(100); if (b<284) then a=a-10; b=b+10; g.put(a,b,marios); g.show(); end; end; if Key=52 then a=a-10; dir=-1; end; if Key=54 then a=a+10; dir=1; end; if Key=50 and (a=180) and (b>242) then b=b-2; piano=0; end; if Key=50 and (a=60) and (b>203) then b=b-2; piano=1; end; if Key=50 and (a=170) and (b>160) then b=b-2; piano=2; end; if Key=50 and (a=70) and (b>120) then b=b-2; piano=3; end; if Key=50 and (a=180) and (b>88)and(piano>1) then b=b-2; end; if Key=50 and (a=140) and (b>55) then b=b-2; piano=5; end; if b=54 then p=p+10;vb=vb-2; g.text(100,170,"PIU' VELOCE......"); g.show();sleep(900); a=30;b=284; end; g.put(0,0,sfondo); g.put(x,y,bariled); if dir=-1 then g.put(a,b,marios); else g.put(a,b,mariod); end; for z=1 to lives do g.put(z*15+165,25,life); end; g.show(); g.pen(0xff0000); g.text(160,15,"score");g.text(205,15,p); g.show(); end; end; end; end; Edited May 13, 2009 by Il.Socio Link to comment Share on other sites More sharing options...
Il.Socio Posted May 13, 2009 Report Share Posted May 13, 2009 (edited) Ora che vedo la logica che c'e' alla base del codice inizio a sentirmi male... ( senza offesa eh!? ) Ad occhio e croce direi che sei partito dal codice ed hai cercato di rattoppare qua e la per riuscire a far funzionare il tutto... In realta', per la realizzazione dei programmi bisognerebbe fare il processo inverso, partire da uno schema logico a livello macroscopico per poi arrivare ad ottenere il codice sorgente. P.S. probabilmente mi consideri eccessivamente critico, ma credimi, sto gia' cercando di contenermi. Edited May 13, 2009 by Il.Socio Link to comment Share on other sites More sharing options...
lento Posted May 13, 2009 Author Report Share Posted May 13, 2009 Allora, di seguito allego il mio sorgente. Bravo! mi complimento per il programma... Ci ho giocato un pò per vedere finalmente la tua opera in azione e devo dire (usando le parole di un marines famoso) Adattarsi, Improvvisare, Raggiungere lo scopo. hai fatto esattamente questo!. Ai raggiunto il tuo scopo che era di riuscire a gestire Bros e il suo barile. Nel leggere il programma ho notato che hai compreso molte delle parti di quanto ha scritto Alter e come direbbe lui: Al diavolo le funzioni! le imparerai quando il programma diventerà più complesso. Ora ho poco tempo....Domani mi farò vivo in modo più completo. Non preoccuparti se Il.Socio ha la mano un pò pesante, vedrai che se vorrai andare oltre con il programma dovrai fare come ti ha suggerito lui. Un pò per volta dicono che le persone possono imparare solo quello che gli serve! Ciao a presto. (Bella la schermata con i punteggi!) Link to comment Share on other sites More sharing options...
Recommended Posts
Please sign in to comment
You will be able to leave a comment after signing in
Sign In Now