Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    14

    [C] programmare il gioco di SQUASH

    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?

    codice:
    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) ;
    
    
    }

  2. #2
    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
    codice:
    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
    E Dai Dai Dai !!!

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    14
    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
    Ultima modifica di dexter94; 22-02-2014 a 15:25

  4. #4
    Quando esci dal loop non dimenticare di deallocare tutta la memoria
    E Dai Dai Dai !!!

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    14
    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?

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    14
    [ 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[i]=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||s omma==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||s omma==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||so mma==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||so mma==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:
    }


    [ / c o d e ]

  7. #7
    Usa le funzioni, così è un casino da leggere
    E Dai Dai Dai !!!

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    14
    l'ho fatto prima che ci spiegassero le funzioni, e non riuscivo a capire come mettere il tag code

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.