Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    Progetto in c Gioco del tennis

    Dovrei realizzare questo programma in c per un esame.. idee?

    Si vuole sviluppare un programma per la simulazione del gioco del tennis.
    Supponiamo di avere un giocatore che gioca contro un simulatore. Il simulatore
    lancia la palla che deve essere respinta dal giocatore.
    Il giocatore (rettangolo rosso) viene collocato in una mappa regolare di dimensioni
    come in figura. Il giocatore ha a disposizione una racchetta (nero in figura). Il
    simulatore fa un punto se il giocatore non riesce a respingere la palla altrimenti se il
    ricevitore colpisce la palla il punto va al giocatore.
    http://img130.imageshack.us/img130/1893/tenniscampo.png
    Il gioco procede in questo modo:
    · Il simulatore lancia la palla con una certa intensità che è identificata da un
    numero casuale da 1 a 10.
    · Se la palla cade nella cella arancione questa viene respinta dal battitore che
    fa un punto.
    · Se la palla cade in una cella gialla il punto va al battitore se l’intensità del
    tiro è minore di 3 altrimenti il punto va al simulatore.
    · Se la palla ricade in una zona azzurra il punto va al giocatore.
    · La palla non può essere mai lanciata sul giocatore.
    Simulare 100 volte la gara ognuna composta da 500 lanci. Il giocatore vince se
    respinge almeno l’80% dei lanci. Stampare la statistica delle vittorie.
    L’algoritmo usa la function rand() in stdlib per generare numeri casuali: si
    ricorda che, per esempio, se numero_casuale è un int, la chiamata
    numero_casuale=rand()%11; genera un numero casuale intero (distribuzione
    uniforme) nell’insieme (0,1,2,3,4,5,6,7,8,9,10). Usare sempre la srand() per
    rendere automatica la scelta iniziale del seed della sequenza di numeri casuali.
    Effettuare almeno 5 test, visualizzando lo schema come presentato in figura.

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320

    Re: Progetto in c Gioco del tennis

    Originariamente inviato da Leonhearth
    Dovrei realizzare questo programma in c per un esame.. idee?
    Tu hai delle idee da proporre?
    Hai buttato giù qualcosa?
    Dove hai, precisamente, dei dubbi?
    Hai preso visione del Regolamento interno di questa sezione?


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Bè si ho già buttato giù qualche riga di codice ecco:
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>
    #define COLONNE    5
    #define RIGHE      4
    void visualizza_mat(char b[RIGHE][COLONNE],int n,int m);
    struct giocatore {
           char nome[10];
           char cognome[10];
    				};
        typedef struct giocatore gt;
           void main()
           {
           
               int j,r,i,c,simulatore=0,tennista=0,palla,n_lanci=50000,vittorie=0,sconfitte=0,perc_respinte=0,perc_respinte2=0;
     int campo[4][5];
               gt gioc ;
    char campo2[RIGHE][COLONNE]={
        {'B','B','B','B','B'},
    	{'B','G',' ','G','B'},
    	{'B','A',' ','A','B'},
    	{'B','G',' ','G','B'}};
               printf("Benvenuto nel programma di simulazione del gioco del tennis vuoi giocare?\n");
    		   visualizza_mat(campo2,RIGHE,COLONNE);
               printf("\n-- Inserisci il tuo nome -- \n");
               scanf("%c",&gioc.nome);
    		   fflush(stdin);
               printf("-- Inserisci il tuo cognome -- \n");
               scanf("%c",&gioc.cognome);
        		   srand(time(NULL));
    			   perc_respinte=(n_lanci*80)/100;
    			    perc_respinte2=(500*80)/100;
    printf(">> IL GIOCO PUO' INIZIARE <<\n\n");
    
    
    for(i=1;i<100;i++)
     for(j=1;j<500;j++)
    	{ char  campo2[RIGHE][COLONNE]={
        {'B','B','B','B','B'},
    	{'B','G',' ','G','B'},
    	{'B','A',' ','A','B'},
    	{'B','G',' ','G','B'}};
    	                                     //INIZIO FOR
    	 palla=1+rand()%10;
    	 do{									//INIZIO REPEAT UNTIL
            r=1+rand()%4;
    		c=1+rand()%5;
    	 }									    //FINE REPEAT UNTIL
    	 while((r!=2 && c!=3) || (r!=3 && c!=3) || (r!=4 && c!=3)) ;
    	
              campo[r][c]=palla;
    		  fflush(stdin);
    		  campo2[r-1][c-1]='X'; 
    		  visualizza_mat(campo2,RIGHE,COLONNE);
    		  printf("%d comb: r=%d c=%d pall=%d\n",j,r,c,palla);
    
    		  if((r==3 && c ==2) || (r==3 && c==4))
    			  tennista++;
    		  else if((r==2 && c==2) || (r==2 && c==4) || (r==4 && c==2) || (r==4 && c==4)){
    		   
    			  if(palla<3)
    				  tennista++;
    			  else
    				  simulatore++;}
    		   			
    				  if((r==1 && c==1) || (r==1 && c==2) || (r==1 && c==3) || (r==1 && c==4) || (r==1 && c==5) || (r==2 && c==1) || (r==2 && c==5) || (r==3 && c==1) || (r==3 && c==5) || (r==4 && c==1) || (r==4 && c==5))			
    					 tennista++;
    				   
    				  
    				  if(tennista>perc_respinte2)
    					  vittorie++;
    				  else
    					  sconfitte++;
    	   }										//FINE FOR
    printf("\n-- Il giocatore ha totalizzato %d punti --\n",tennista);
    printf("\n-- Il simulatore ha totalizzato %d punti --\n",simulatore);
    printf("\n-- Le partite vinte sono: %d quelle perse invece sono: %d --\n",vittorie,sconfitte);
    
    printf("\nPer vincere il giocatore deve totalizzare un numero di punti maggiore della \npercentuale di lanci respinti che risulta essere: %d, di conseguenza :\n",perc_respinte);
     if(tennista>perc_respinte)
    	 printf("\n-- Hai vinto tu giocatore!! --\n");
     else
    	 printf("\n-- Mi dispiace hai perso, ha vinto il simulatore --\n");
    
    }
    
    
    void visualizza_mat(char b[RIGHE][COLONNE],int n,int m)
    {
    	int i,j;
    	printf("\n");
    	printf("ECCO IL CAMPO DI TENNIS: \n");
    	for(i=0;i<RIGHE;i++)
    	{	
    		for(j=0;j<COLONNE;j++)
    			printf("  %c",b[i][j]);
    		printf("\n");
    	}
    }
    però la pallina da tennis indicata nella matrice dalla 'X' si trova anche nelle posizioni in cui nn dovrebbe ossia al centro della matrice(da leggere il testo e vedere l'immagine) se poi cambio la condizione del repeat until
    codice:
    do{									//INIZIO REPEAT UNTIL
            r=1+rand()%4;
    		c=1+rand()%5;
    	 }									    //FINE REPEAT UNTIL
    	 while((r!=2 && c!=3) || (r!=3 && c!=3) || (r!=4 && c!=3)) ;
    mettendo
    codice:
    do{									//INIZIO REPEAT UNTIL
            r=1+rand()%4;
    		c=1+rand()%5;
    	 }									    //FINE REPEAT UNTIL
    	 while((r==2 && c==3) || (r==3 && c==3) || (r==4 && c==3)) ;
    la posizione casuale della pallina diventa corretta però alla fine la percentuale di respinte invece di assumere il valore 40000 assume altri strani valori.. per di più se ho ben visto nn legge le combinazioni che si ripetono infatti quando alla fine stampa il numero di vittorie e sconfitte sommandole nn da come risultato il numero totale delle partite.. questi sono i miei problemi principali..

    p.s. ho letto il regolamento ora^^ e grazie a chiunque si interessi è importante!

  4. #4
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Non ho letto tutto il codice ma mi è saltato subito all'occhio questo pezzo:
    codice:
    scanf("%c",&gioc.nome);
    gioc.nome è un array di char e tu stai leggendo un singolo char. La versione corretta è
    codice:
    scanf("%s", gioc.nome);
    (senza &, nome è già un indirizzo (essendo un vettore))
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  5. #5
    Grazie per le info, corretto^^ cmq sia nel corso della giornata ho cambiato un pò il prg ecco:
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>
    #define COLONNE    5
    #define RIGHE      4
    void visualizza_mat(char b[RIGHE][COLONNE],int n,int m);
    struct giocatore {
           char nome[10];
           char cognome[10];
    				};
        typedef struct giocatore gt;
           void main()
           {
           
               int j,r,i,c,simulatore=0,tennista=0,palla,n_lanci=50000,vittorie=0,sconfitte=0,perc_respinte=0,perc_respinte2=0;
    
               gt gioc ;
    char campo2[RIGHE][COLONNE]={
        {'B','B','B','B','B'},
    	{'B','G',' ','G','B'},
    	{'B','A',' ','A','B'},
    	{'B','G',' ','G','B'}};
               printf("Benvenuto nel programma di simulazione del gioco del tennis vuoi giocare?\n");
    		   visualizza_mat(campo2,RIGHE,COLONNE);
               printf("\n-- Inserisci il tuo nome -- \n");
               scanf("%s",gioc.nome);
    		   fflush(stdin);
               printf("-- Inserisci il tuo cognome -- \n");
               scanf("%s",gioc.cognome);
        		   srand(time(NULL));
    			   perc_respinte=(n_lanci*80)/100;
    			    perc_respinte2=(500*80)/100;
    printf(">> IL GIOCO PUO' INIZIARE <<\n\n");
    
    
    for(i=0;i<100;i++)
     for(j=0;j<500;j++)
    	{ char  campo2[RIGHE][COLONNE]={
        {'B','B','B','B','B'},
    	{'B','G',' ','G','B'},
    	{'B','A',' ','A','B'},
    	{'B','G',' ','G','B'}};
    	                                     //INIZIO FOR
    	 palla=1+rand()%10;
    	 do{									//INIZIO REPEAT UNTIL
            r=rand()%3;
    		c=rand()%4;
    	 }									    //FINE REPEAT UNTIL
    	 while ((c == 2) && (r == 1 || r == 2 || r == 3));
    	
           		  fflush(stdin);
    		  campo2[r][c]='X'; visualizza_mat(campo2,RIGHE,COLONNE);printf("%d comb: r=%d c=%d pall=%d\n",j,r+1,c+1,palla);
    		  
    
    		  if((r==2 && c ==1) || (r==2 && c==3))
    			  tennista++;
    		  else if((r==1 && c==1) || (r==1 && c==3) || (r==3 && c==1) || (r==3 && c==3)){
    		   
    			  if(palla<3)
    				  tennista++;
    			  else
    				  simulatore++;}
    		   			
    				  if((r==0 && c==0) || (r==0 && c==1) || (r==0 && c==2) || (r==0 && c==3) || (r==0 && c==4) || (r==1 && c==0) || (r==1 && c==4) || (r==2 && c==0) || (r==2 && c==4) || (r==3 && c==0) || (r==3 && c==4))			
    					 tennista++;
    				   
    				  
    				  if(tennista>perc_respinte2)
    					  vittorie++;
    				  else
    					  sconfitte++;
    	   }										//FINE FOR
    printf("\n-- Il giocatore ha totalizzato %d punti --\n",tennista);
    printf("\n-- Il simulatore ha totalizzato %d punti --\n",simulatore);
    printf("\n-- Le partite vinte sono: %d quelle perse invece sono: %d --\n",vittorie,sconfitte);
    
    printf("\nPer vincere il giocatore deve totalizzare un numero di punti maggiore della \npercentuale di lanci respinti che risulta essere: %d, di conseguenza :\n",perc_respinte);
     if(tennista>perc_respinte)
    	 printf("\n-- Hai vinto tu giocatore!! --\n");
     else
    	 printf("\n-- Mi dispiace hai perso, ha vinto il simulatore --\n");
    
    }
    
    
    void visualizza_mat(char b[RIGHE][COLONNE],int n,int m)
    {
    	int i,j;
    	printf("\n");
    	printf("ECCO IL CAMPO DI TENNIS: \n");
    	for(i=0;i<RIGHE;i++)
    	{	
    		for(j=0;j<COLONNE;j++)
    			printf("  %c",b[i][j]);
    		printf("\n");
    	}
    }
    solo che ora mi esce sempre "hai vinto" cioè viene sempre superata la soglia dei 40000 punti necessari per vincere.. eppure i numeri sn casuali qualche volta dovrebbe pur apparire la scritta " Mi dispiace hai perso, ha vinto il simulatore".. che ne pensate voi???

  6. #6
    Prova a guardare qui:

    http://www.cplusplus.com/reference/c...cstdlib/srand/

    così vedi come devi (e puoi) usare srand..


    Ciao

  7. #7
    la srand l'ho appunto dichiarata come nell'esempio cioè:
    srand(time(NULL));

    però pensavo forse dovrei modificare l'uniformità della generazione degli indici per il campo di tennis?(cioè r e c) :S che dite? tanto nella traccia nn ne parla proprio quindi non sarebbe da escludere penso..il fatto è anche che se la pallina cade in 16 celle su 20 (la matrice è 4x5) il punto va al giocatore se ricade nelle rimanenti 4 bisogna valutare l'intensità della pallina che varia da 1 a 10 uniformemente, se tale intensità è <3 il punto va al giocatore altrimenti va al simulatore, quindi solo in questi pochi casi c'è la possibilità di sconfitta del giocatore :\

  8. #8
    Scusa, non avevo visto bene il tuo codice..

    In ogni caso la probabilità di sconfitta è: 1/5 * 7/10 = 7/50 -> circa 1/7..

    Ciao

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 © 2025 vBulletin Solutions, Inc. All rights reserved.