PDA

View Full Version : Giochetto in Delphi


gokan
01-04-2003, 17:39
Salve a tutti, sto cominciando a studiare il Delphi, ho trovato una piccola guida da seguire per realizzare un piccolo videogioco scritto in Delphi.In questo modo penso di unire l'utile al dilettevole per fare della pratica con Delphi. Qui (ci capiamo meglio se provate) trovate l'eseguibile del giochetto(i tasti da usare sono A,Z ed M,J):
http://spazioinwind.libero.it/pablosonoio/index.htm
Avevo qualche domandina da porre, e premessa qualche procedura:
*************
procedure TTennisForm.Battuta;
begin
vx:=3; //vx e vy sono le velocità della pallina nelle due direzioni (pensate ad un grafico cartesiano)
vy:=Random(4)-2;
PallinaPanel.Top:=random(CampoPanel.Height);
PallinaPanel.Left:=RetePanel.Left;
end;
*******************
Questa procedura viene richiamata all'inizio (premendo il bottone) e poi ogni volta che viene fatto un punto e si deve riniziare.

1)Se nella procedura Battuta, voglio, che in maniera random la pallina vada lanciata anche nell'altro senso
(perchè nella pratica la battuta è sempre contro la racchetta2) cosa dovrei modificare? Avevo pensato di
impostare a True la proprietà Right di PallinaPanel e RetePanel e poi fare così:
**********************
procedure TTennisForm.Battuta;
begin
vx:=3;
vy:=Random(4)-2;
PallinaPanel.Top:=random(CampoPanel.Height);
PallinaPanel.Left:=RetePanel.Left;
PallinaPanel.Right:=RetePanel.Right;
end;
******************
Così non funziona come posso realizzare quello che voglio ?

Ho tante altre domande;Cominciamo pian pianino;..:)
Nel frattempo sto lavorando alla versione 1.0 con qualche novità da inserire.

DanieleC88
01-04-2003, 19:52
Non ti ho troppo capito, spiegami meglio cosa vuoi che il programma faccia.

gokan
01-04-2003, 20:16
Originally posted by "DanieleC88"

Non ti ho troppo capito, spiegami meglio cosa vuoi che il programma faccia.
Hai provato a scaricare il giochetto? (Ci capiamo meglio se lo provi)
In pratica quando viene lanciata la pallina per la battuta avviene sempre in un verso.Vorrei che la pallina fosse indirizzata anche nel verso opposto.

DanieleC88
01-04-2003, 20:24
L'ho scaricato, ma ho capito solo ora cosa vuoi dire !

Credo sia semplicemente perchè vx é sempre impostato a 3 e mai a -3 !

Quindi devi creare un random che arrivi massimo a 1.

SegnoRandom = Trunc(Random(1));
if SegnoRandom=0 then SegnoRandom:=1 else SegnoRandom:=(SegnoRandom*True) {Inverte il valore moltioplicandolo per -1};
vx:=(3*SegnoRandom);

Prova così.

gokan
01-04-2003, 21:10
Grazie :)
ho risolto grazie alle tue delucidazioni in maniera più semplice ancora:

SegnoRandom:= Random(2); //un numero a caso tra 0 ed n-1 cioè tra 0 e 1
if SegnoRandom=0 then SegnoRandom:=1
else SegnoRandom:=-1;
vx:=(3*SegnoRandom);

gokan
01-04-2003, 21:14
Ti vorrei chiedere ancora qualcosa, visto che ci siamo :)
Avrai visto che le "racchette" nel gioco salgono e scendono, ma non si fermano quando finisce il campo.
Come mi consigli di bloccare le racchette appena giunte alla fine del campo?
Grazie

gokan
02-04-2003, 18:32
Ho fatto qualche miglioramento, vedete:
http://spazioinwind.libero.it/pablosonoio/index.htm

gokan
03-04-2003, 17:41
C'è qualche metodo che mi consente di mettere il gioco in pause/resume oppure devo implementarmi la procedura da me?

gokan
06-04-2003, 17:55
Ciao ragazzi, da un'pò sbatto la testa su un problema che mi dovete aiutare a risolvere.
In pratica, avrete visto nel giochetto che cè un menù dove potere scegliere la difficoltà del gioco (di default lo messa a medio). Avrete notato che c'è un piccolo bug, quando mi seleziono la difficoltà del gioco effettivamente la velocità della pallina aumenta o diminuisce come è giusto che sia selezionando le tre possibilità del RadioGroupClick , quando però viene fatto punto da un giocatore, la situazione ritorna al default, con la conseguente perdita di livello di difficoltà selezionato all'inizio.

procedure TOpzioniBox.DifficoltaRadioGroupClick(Sender: TObject);
begin
case DifficoltaRadioGroup.ItemIndex of
0: A:=1; //facile
1: A:=1.03; //medio
2: A:=1.2; //difficile
end;
end;

Dove A è la costante di velocità che assume la pallina ogni volta che rimbalza sulla sponda o racchetta.Ovviamente questa procedura è dichiarata ed usata in una unit diversa da quella che gestisce la MainFormTennis (in pratica la form con il campo) e se provassi quindi a gestirmi anche tramite un if le condizioni del RadioGroupClick in maniera tale da scegliere A in modo opportuno, non lo posso fare perchè il RadioGroupClick è gestito nell'altra unit.
Ammetto che è facile che mi sia spiegato non bene, però credetemi che è difficile spiegare queste cose senza usare codice.Vorrei risolvere questo problema,a costo di andare in chat con qualcuno di voi, mostrarvi tutto il codice che finora ho scritto e capirci meglio!!!

DanieleC88
06-04-2003, 18:44
Per bloccare le racchette alla fine ed all'inizio del campo, ad ogni movimento devi usare del codice simile a:

if (
not (Racchetta.Top+Racchetta.Height)>=Pannello.Height
and
not (Racchetta.Top<=Pannello.Top) then Muovi;


Per la pausa, se usi un timer basta usare "Timer.Enabled:=False;".

Per il radio group non ho capito bene, ma credo che debba dichiarare come public la variabile con la velocità, in modo da accedervi anche dall'altra finestra. (Velocità:=Form2.Velocità)

gokan
06-04-2003, 21:27
Originally posted by "DanieleC88"

Per bloccare le racchette alla fine ed all'inizio del campo, ad ogni movimento devi usare del codice simile a:

if (
not (Racchetta.Top+Racchetta.Height)>=Pannello.Height
and
not (Racchetta.Top<=Pannello.Top) then Muovi;


Per la pausa, se usi un timer basta usare "Timer.Enabled:=False;".

Questi problemi li ho risolti in maniera simile.

Per il radio group non ho capito bene, ma credo che debba dichiarare come public la variabile con la velocità, in modo da accedervi anche dall'altra finestra. (Velocità:=Form2.Velocità)
Sono già dichiarate come public. Se ti può servire posto un'pò di codice?

Grazie per le risposte

DanieleC88
09-04-2003, 20:17
Si, forse é meglio che mi mandi un pò di codice.
Potrei anche aiutarti: mi mandi il codice completo, mi dici cosa vuoi fare e cerco di aiutarti a finirlo (se vuoi :D ).

gokan
10-04-2003, 18:52
Originally posted by "DanieleC88"

Si, forse é meglio che mi mandi un pò di codice.
Potrei anche aiutarti: mi mandi il codice completo, mi dici cosa vuoi fare e cerco di aiutarti a finirlo (se vuoi :D ).
Finalmente è pronta la versione finale del giochetto.
Potete trovare l'eseguibile alla solita pagina:
http://spazioinwind.libero.it/pablosonoio/index.htm
Con la sorpresa di una nuova veste grafica del sito.
A voi i commenti!!

gokan
12-04-2003, 09:03
Potrebbe interessare a qualcuno, ho messo i sorgenti del giochetto. Il codice è ben commentato, anche i delphini più inesperti (tipo me stesso) possono trovarlo interessante.
:D

gokan
12-04-2003, 13:45
Avrei intenzione di "far gestire" una delle due racchette al computer,
nella pratica vorrei poter giocare da solo contro il computer. Implementare questo in Delphi
non sembrerebbe una cosa tanto ardua (quindi lo potrei fare anch'io).
La mia idea sarebbe (non so se è la strada giusta) randomizzare i movimenti della racchetta2
(adesso che avete i sorgenti del gioco mi posso spiegare meglio), non vorrei però che tale
metodo sia troppo semplicistico e nella pratica la racchetta "gestita dal computer" faccia
sempre gli stessi movimenti e quindi renda il gioco molto meno interessante rispetto al
metodo in cui si gioca in due persone.
Avete qualche idea?
Nel frattempo io provo qualcosina....

DanieleC88
16-04-2003, 17:53
Vedrò quello che posso fare per l'intelligenza artificiale....

nel frattempo ti mando il codice che ho "corretto"... ho aggiunto qualcosa di utile: leggi i commenti e non ti spaventare per i cambiamenti !

gokan
17-04-2003, 17:42
Originally posted by "DanieleC88"

Vedrò quello che posso fare per l'intelligenza artificiale....

nel frattempo ti mando il codice che ho "corretto"... ho aggiunto qualcosa di utile: leggi i commenti e non ti spaventare per i cambiamenti !
Ti ringrazio tantissimo :D
I tuoi accorgimenti hanno migliorato di molto il giochino.
Dammi un'pò di tempo per studiarmeli e poi preparati ad un interrogatorio di 3° grado.
Ciao :sofico:

DanieleC88
17-04-2003, 19:38
OK, vada per gli interrogatori, ma preparati: l'intelligenza artificiale é vicina ! Anche troppo: l'ho fatto troppo intelligente e nel livello Facile non si riesce mai a vincere. Ora la devo far diventare più stupida.

gokan
17-04-2003, 20:18
Originally posted by "DanieleC88"

OK, vada per gli interrogatori, ma preparati: l'intelligenza artificiale é vicina ! Anche troppo: l'ho fatto troppo intelligente e nel livello Facile non si riesce mai a vincere. Ora la devo far diventare più stupida.
Sei grande!!! :D
Come c***o fai?
Ho perso un bel pò di tempo a fare questo giochino e tu in quattro e quattro otto mi spari un gioco che è molto più bello esteticamente e molto migliorato a livello di codice...meno male che era qualche modifica :p

Ti devo chiedere una cosa.Ho dovuto abbassare questi valori
if (vx<=(-2147483648)) or (vx>=2147483647) then.....
altrimenti mi dava errore.Inoltre giocando a livello impossibile se la pallina assume una velocità troppo alta comincia a dare 200 errori e il gioco esce, forse dovremmo fare in modo che se la pallina è troppo veloce (come prima) oltrepassi la racchetta.

Diverse cosette non le avevo mai incontrato nè usate...quante cose ho ancora da imparare :eek:

Ciao e grazie per il tempo dedicato al giochetto ;)

gokan
17-04-2003, 20:19
Originally posted by "DanieleC88"

OK, vada per gli interrogatori, ma preparati: l'intelligenza artificiale é vicina ! Anche troppo: l'ho fatto troppo intelligente e nel livello Facile non si riesce mai a vincere. Ora la devo far diventare più stupida.
Aspetto con ansia!!!! :eek:

eraser
19-04-2003, 13:57
OT

Ragazzi siccome conoscete il delphi (e io lo sto imparando), sapete con quale elemento si gestisce la porta seriale?

grazie

Ciao

Eraser :cool: