PDA

Visualizza la versione completa : [C] programmare il gioco di SQUASH


dexter94
21-02-2014, 23:26
salve a tutti, avrei da programmare il gioco di squash, ed è cosi composto:

*una barra verticale posta a sinistra , ma leggermente staccata dal bordo
*3 palline ( per modo di dire..) che rimbalzano in una zona di dimensioni 25x80

inizialmente dovevo creare soltanto 3 palline che rimbalzavano in 3 quadrati differenti
quindi nel codice che posterò, ho messo sotto commento la parte che crea i quadrati e i limiti nei quali le palline dovranno rimbalzare sono stati re-impostati.

vorrei chiedervi aiuto sul come far muovere la barretta ( perchè ho gia fatto delle prove, l'ho creata e ci ho fatto rimbalzare le palline contro da ferma), non riesco proprio a capire come fare a farla muovere con un imput da tastiera ( deve andare su e giu , usando W, ed S).

vi dico che inizialmente provai ad disegnarla , all'interno del ciclo while, usando un ciclo for, e poi sotto di esso, usai uno SWITCH case, con il case per imput W, ed il case per imput S, i quali dovevano cancellare sotto , e ricreare una stanghetta sopra ( per il caso W), il contrario per il ''caso '' S
ma non funzionò perchè essendo il for nel ciclo while , la BARRETTA VIENE sempre ricreata e quindi non c'è la fase della cancellazione dello switch case, quindi si vedono solo due righette che si aggiungono alla fine ed all'inizio. ho provato anche a metterlo in fondo, dopo il ciclo complessivo, ma questa non viene mostrata.

qualcuno è disposto ad aiutarmi?:dhò:


void main (){
int i,n,puntatore,su,snake;
int x=40,y=13,x1=20,y1=20,x2=60, y2=20,x3=65,y3=18; // coordinate iniziali delle palline
char incrX=1,incrY=1, incrY1=1, incrX1=1,incrX2=1,incrY2=1,incrX3=1,incrY3=1 ; // incrementi di partenza


_setcursortype( _NOCURSOR ); // togliere il cursore


do{
/*
gotoxy(30,9);
printf("--------------------");
gotoxy(30,19);
printf("--------------------");


for(n=9;n<=19;n++){
gotoxy(30,n);
printf("|");
gotoxy(50,n);
printf("|");
} // fine primo quadrato
gotoxy(10,19);
printf("--------------------");
gotoxy(10,29);
printf("--------------------");




for(n=19;n<=29;n++){
gotoxy(10,n);
printf("|");
gotoxy(30,n);
printf("|");
} // fine secondo quadrato


gotoxy(50,19);
printf("--------------------");
gotoxy(50,29);
printf("--------------------");


for(n=19;n<=29;n++){
gotoxy(50,n);
printf("|");
gotoxy(70,n);
printf("|");
} // fine terzo quadrato
*/
////////////////////////////////////////////////////////////////////////////////


//seconda pallina


gotoxy(15,20) ; // posizione di partenza
x1=x1+incrX1 ;
y1=y1+incrY1 ;


if(x1==80) incrX1=-1 ; //limiti dello schermo, nel quale la pallina dev rimbalzare
if(x1==1) incrX1=+1 ;
if(y1==25) incrY1=-1 ;
if(y1==1) incrY1=+1 ;
if((x1==5)&&(y1==n)) incrX1=+1 ;


if(kbhit()==1) exit(1) ;
//gotoxy(x,y);
//putch('°');
//putch(' ');


gotoxy(x1,y1) ; //per cancellare la scia prodotta dal movimento
putch('#') ;
Sleep(20) ;
gotoxy(x1,y1);
putch(' ');


///////////////////////////////////////////////////////////////////////////////
//terza pallina


gotoxy(60,20) ; //posizione di partenza
x2=x2+incrX2 ;
y2=y2+incrY2 ;


if(x2==80) incrX2=-1 ; //limiti dello schermo, nel quale la pallina dev rimbalzare
if(x2==1) incrX2=+1 ;
if(y2==25) incrY2=-1 ;
if(y2==1) incrY2=+1 ;
if((x2==5)&&(y2==n)) incrX2=+1 ;


if(kbhit()==1) exit(1) ;
//gotoxy(x,y);
//putch('°');
//putch(' ');


gotoxy(x2,y2) ; //per cancellare la scia prodotta dal movimento
putch('#') ;
Sleep(20) ;
gotoxy(x2,y2);
putch(' ');


////////////////////////////////////////////////////////////////////////////////
//prima pallina


gotoxy(40,13) ; // posizione di partenza
x=x+incrX ;
y=y+incrY ;


if(x==80) incrX=-1 ; //limiti dello schermo, nel quale la pallina dev rimbalzare
if(x==1) incrX=+1 ;
if(y==25) incrY=-1 ;
if(y==1) incrY=+1 ;
if((x==5)&&(y==n)) incrX=+1 ;


if(kbhit()==1) exit(1) ;
//gotoxy(x,y);
//putch('°');
//putch(' ');


gotoxy(x,y) ; //per cancellare la scia prodotta dal movimento
putch('#') ;
Sleep(20) ;
gotoxy(x,y);
putch(' ');




}while(1) ;


}

MegaAlchimista
22-02-2014, 13:38
Allora... Tu hai fatto bene a creare questo while infinito, è quello che viene chiamato main loop, application loop, o game loop.
Quello che non va nel loop è appunto l'inizializzazioine degli oggetti.
un gioco in via molto generale è una struttura di questo tipo


struct point {int x; int y;};
Int main()
{
//dichiari puntatori che rappresentano i tuoi oggetti, o sistemi
//oppure puoi dichiararli fuori come variabili globali
//ora qui faccio solo un esempio
unsigned char** _bordo = null;
unsigned char** _racchetta = null;
unsigned char* _palla = null;

bool exit = false;
point _posizionePalla; //in realtà poi per queste sarebbe meglio usare un float variabile da 0 a 1 in modo che si adatti alle dimensioni dello schermo
int _posizioneRacchetta;

//ti crei una bella funzione di inizializzazione, che disegna il bordo e la racchetta e la palla nella posizione iniziale
Init_all();

//adesso puoi entrare nel loop infinito ed ascoltare l'input dell'utente
while (!exit)
{
//prendi l'input da tastiera e lo elabori. Se l'input è di uscita metti exit=true;

//aggiorni _posizioneRacchetta
//aggiorni _posizionePalla

//cancelli lo schermo e lo ridisegni tutto

} //EO game loop
} //EO main


Poi qui ci sono tante cose da fare: per esempio per far muovere la palla ad una certa velocitá devi sapere quanto tempo ci vuole per eseguire un ciclo del loo.
Questo comunque puoi aggiungerlo in un secondo momento

dexter94
22-02-2014, 15:20
grazie per la tua risposta, MegaAlchimista, ma a scuola siamo arrivati solo fino agli array, ma non li abbiamo approfonditi molto.

quindi se ho capito bene, per progettare bene un gioco, dovrei dividerlo in piu parti, inizialmente la dichiarazione delle variabili e il campo di gioco, dopo di che si fa un'altra funzione con le dinamiche del gioco vero e proprio. Quindi è proprio perchè c'è un singolo ciclo while che non riesco a creare la ''racchetta'' e farla funzionare??
oggi pomeriggio lo riscrivo, poi ti aggiorno ;)

MegaAlchimista
22-02-2014, 15:38
Quando esci dal loop non dimenticare di deallocare tutta la memoria

dexter94
23-02-2014, 14:16
non so se hai provato il codice nel ''tagcode'' però ho il problema delle palline che ''lampeggiano'' e non capisco come risolvere senza far lasciare la traccia. tu come lo risolveresti?

dexter94
25-02-2014, 00:26
[ c o d e ]

#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <time.h>


//nome_var1 è sempre riferito agli oggetti a sinistra
//nome_var2 è sempre riferito agli oggetti a destra


void main()
{
int x_palla,y_palla,x_barra1,y_barra1,x_barra2,y_barra 2,x_corn,y_corn,somma;
int x_palla2,y_palla2,punteggio1=0,punteggio2=0,speed, y_b1[3],y_b2[3],i;
char mov1; //memorizza i caratteri premuti


x_barra1=1;
//a seconda del n casuale calcolato in seguito,
//questo valore potrebbe non essere usato
y_barra1=11;
x_barra2=80;
//a seconda del n casuale calcolato in seguito,
//questo valore potrebbe non essere usato
y_barra2=11;


//informazioni iniziali per l'utilizzo del programma
printf("Comandi: BARRA DESTRA SU: k\n");
printf(" BARRA DESTRA GIU: m\n");
printf(" BARRA SINISTRA SU: a\n");
printf(" BARRA SINISTRA GIU: z\n\n");
printf("IMPORTANTE PER EVITARE PROBLEMI!!! ");
printf("NON MUOVERE LA BARRETTA OPPOSTA AL VERSO DEL MOTO DELLA PALLINA.\n");
printf("\nInserire velocita' movimento pallina (millisecondi): ");
scanf("%d",&speed);
printf("\nSe in qualsiasi momento vuoi uscire dal programma premi ESC.");
printf("\n\nPremi un tasto per cominciare...");
getch();
clrscr();


//inizio parte principale
inizio:


//stampa cornicie
y_corn=1;
x_corn=0;
for(i=0;i<=79;i++)
{
x_corn=x_corn++;
gotoxy(x_corn,y_corn);
printf("#");
}
y_corn=24;
x_corn=0;
for(i=0;i<=79;i++)
{
x_corn=x_corn++;
gotoxy(x_corn,y_corn);
printf("#");
}
//fine stampa cornicie


//stabilisce inizialmente le posizioni delle barre e la direzione della palla
//in tutta questa prima parte i è usata come variabile di comodo
randomize();
i=random(21)+2;
if(i%2==0)
{
if(random(2)==0)
{
somma=2;
y_barra2=i;
x_palla=x_barra2;
y_palla=y_barra2+2;
}
else
{
somma=3;
y_barra2=i;
x_palla=x_barra2;
y_palla=y_barra2;
}
}
else
{
if(random(2)==0)
{
somma=1;
y_barra1=i;
x_palla=x_barra1;
y_palla=y_barra1+2;
}
else
{
somma=0;
y_barra1=i;
x_palla=x_barra1;
y_palla=y_barra1;
}
}


gotoxy(25,25);
printf("Giocatore 1: %d || Giocatore 2: %d",punteggio1,punteggio2);
//FINE "PRIMA PARTE"


do
{
for(i=0;i<=2;i++)
{
gotoxy(x_barra1,y_barra1+i);
printf("%c",219);
y_b1=y_barra1+i;
gotoxy(x_barra2,y_barra2+i);
printf("%c",219);
y_b2[i]=y_barra2+i;
}


do{


x_palla2=x_palla;
y_palla2=y_palla;


switch(somma)
{
case 0: {
x_palla=x_palla++;
y_palla=y_palla++;
break;
}
case 1: {
x_palla=x_palla+1;
y_palla=y_palla-1;
break;
}
case 2: {
x_palla=x_palla-1;
y_palla=y_palla-1;
break;
}
case 3: {
x_palla=x_palla-1;
y_palla=y_palla+1;
break;
}
case 4: {
x_palla=x_palla+1;
y_palla=y_palla-2;
break;
}
case 5: {
x_palla=x_palla-1;
y_palla=y_palla+2;
break;
}
case 6: {
x_palla=x_palla+1;
y_palla=y_palla+2;
break;
}
case 7: {
x_palla=x_palla-1;
y_palla=y_palla-2;
break;
}
}


if((y_palla>=24)&&(somma==0||somma==1||somma==2||somma==3))
{
y_palla=y_palla-2;
if(x_palla2>x_palla) somma=2;
else somma=1;
}


if((y_palla>=24)&&(somma==4||somma==5||somma==6||somma==7))
{
y_palla=y_palla-3;
if(x_palla2>x_palla) somma=7;
else somma=4;
}


if((y_palla<=1)&&(somma==0||somma==1||somma==2||somma==3))
{
y_palla=y_palla+2;
if(x_palla2>x_palla) somma=3;
else somma=0;
}


if((y_palla<=1)&&(somma==4||somma==5||somma==6||somma==7))
{
y_palla=y_palla+3;
if(x_palla2>x_palla) somma=5;
else somma=6;
}


for(i=0;i<=2;i++)
{
if((x_palla==x_barra1)&&(y_palla2==y_b1[i]))
{
switch(i)
{
case 0: {
x_palla=x_palla+3;
if(y_palla2>y_palla) somma=4;
else somma=6;
break;
}
case 1: {
x_palla=x_palla+2;
if(y_palla2>y_palla) somma=1;
else somma=0;
break;
}
case 2: {
x_palla=x_palla+3;
if(y_palla2>y_palla) somma=4;
else somma=6;
break;
}
}
}
else
{
if((x_palla==x_barra2)&&(y_palla2==y_b2[i]))
{
switch(i)
{
case 0: {
x_palla=x_palla-3;
if(y_palla2>y_palla) somma=7;
else somma=5;
break;
}
case 1: {
x_palla=x_palla-2;
if(y_palla2>y_palla) somma=2;
else somma=3;
break;
}
case 2: {
x_palla=x_palla-3;
if(y_palla2>y_palla) somma=7;
else somma=5;
break;
}
}
}
}
}


if(x_palla>=x_barra2)
{
punteggio1=punteggio1++;
gotoxy(25,25);
printf("Giocatore 1: %d || Giocatore 2: %d",punteggio1,punteggio2);
gotoxy(27,11);
printf("PUNTEGGIO AGGIORNATO!!!\n");
gotoxy(15,12);
printf("(Premi ESC per uscire, o un tasto per ripartire)");
Sleep(1000);
mov1=getch();
if(mov1==27) goto fine;
clrscr();
goto inizio;
}


if(x_palla<=x_barra1)
{
punteggio2=punteggio2++;
gotoxy(25,25);
printf("Giocatore 1: %d || Giocatore 2: %d",punteggio1,punteggio2);
gotoxy(27,11);
printf("PUNTEGGIO AGGIORNATO!!!\n");
gotoxy(15,12);
printf("(Premi ESC per uscire, o un tasto per ripartire)");
Sleep(1000);
mov1=getch();
if(mov1==27) goto fine;
clrscr();
goto inizio;
}


gotoxy(x_palla,y_palla);
printf("O");
Sleep(speed);
gotoxy(x_palla,y_palla);
printf(" ");


}while(!kbhit());


mov1=getch();


for(i=0;i<=2;i++)
{
gotoxy(x_barra1,y_barra1+i);
printf(" ");
gotoxy(x_barra2,y_barra2+i);
printf(" ");
}


if((mov1=='a')&&((y_barra1-1)!=1)) y_barra1=y_barra1-1;
if((mov1=='z')&&((y_barra1+3)!=24)) y_barra1=y_barra1++;
if((mov1=='k')&&((y_barra2-1)!=1)) y_barra2=y_barra2-1;
if((mov1=='m')&&((y_barra2+3)!=24)) y_barra2=y_barra2++;




}while(mov1!=27); //condizione di uscita
fine:
}


[I][ / c o d e ]

MegaAlchimista
27-02-2014, 00:23
Usa le funzioni, così è un casino da leggere

dexter94
14-03-2014, 17:12
l'ho fatto prima che ci spiegassero le funzioni, e non riuscivo a capire come mettere il tag code

Loading