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

    [c] Simulazione del problema la tartaruga e la lepre

    Ciao a tutti!
    Sto svolgendo un esercizio che riguarda la simulazione del gioco della tartaruga e la lepre, e tratta di un percorso di 70 caselle (quindi ho utilizzato un vettore). Ogni animale partirà dalla casella numero 1. Verrà utilizzato un orologio per scandire a ogni ciclo la posizione da effettuare secondo queste regole:

    Animale: Tipo di mossa: % di tempo: Mossa effettiva:
    Tartaruga Arrancata rapida 50% 3 caselle a destra
    Scivolone 20% 6 caselle a sinistra
    Arrancata lenta 30% 1 casella a destra

    Lepre Dormita 20% Nessuna mossa
    Salto lungo 20% 9 caselle a destra
    Scivolone lungo 10% 12 caselle a sinistra
    Salto corto 30% 1 casella a destra
    Scivolone corto 20% 2 caselle a sinistra

    Quindi verrà utilizzata una variabile i per riprodurre le percentuali in tabella (in modo casuale), per esempio nel caso della tartaruga quando 1<=i<=5 (50%) la tartaruga dovrà effettuare 3 passi a destra; quando 6<=i<=7 (20%) effettuerà 6 passi a sinistra e quando 8<=i<=10 (30%) un passo a destra.
    A ogni ciclo verrà visualizzato il percorso e nella cella dove sarà fermata la tartaruga verrà visualizzato "T", nella cella della lepre "L" e in caso di scontro tra i due animali "OUCH!".
    Bisogna tenere conto delle posizioni di ogni animale a ogni ciclo.
    Il programma termina quando uno dei 2 animali raggiunge il traguardo (casella n. 70).

    Ora il mio problema è che nell'esecuzione non vengono visualizzati i movimenti delle lepre e stranamente si scontrano solo verso un certo punto del percorso.
    vi posto il codice:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    int segnaPosTart( int ran );
    int segnaPosLepr( int ran );
    void mostraPerc( int per[70] );
    
    int main() 
    {
    	int percorso[70] = {0}; // vettore del percorso
    	int posTart = 0;
    	int posLepr = 0;
    	int i; // i è compreso tra 1 e 10 e serve per generare una mossa.
    	int k;
    
    
    
    	srand(time (NULL)); 	/* specifica il seme per il generatore di 
    				numeri casuali */
    	
    	printf("BANG !!!!!\n");
    	
    	while ( (posTart <= 69) || (posLepr <= 69) ) {
    		
    		//Azzero il percorso per mostrare solo le mosse eseguite nel ciclo
    		for (k=1; k<= 70; k++) {
    			percorso[k] = 0;
    		}
    
    		/* in base al numero generato posTart e posLepr restituiscono
    		 * il tipo di mosse da eseguire (ovvero i passi avanti o dietro) */
    		i = rand() % 9 + 1;
    		posTart += segnaPosTart(i);
    		
    		i = rand() % 9 + 1;
    		posLepr += segnaPosLepr(i);
    
    		percorso[posTart] += 1;
    		percorso[posLepr] += 2;
    		
    		mostraPerc(percorso);
    		printf("\n");
    		
    		}
    		
    	
    	
    	if (posTart >= 70)
    		printf("\n\nVINCE LA TARTARUGA!!!!");
    		
    	else if (posLepr >= 70)
    		printf("\n\nVINCE LA LEPRE!!!!");
    		
    	return 0;
    }
    
    int segnaPosTart( int ran )
    {
    
    	int pos;	
    
    	if ( (ran >= 1) && (ran <= 5) )
    		pos = 3;
    			
    	else if ( (ran >= 6) && (ran <= 7) ) 
    		pos = -6;
    			
    	else if ( (ran >= 8) && (ran <= 10) )
    		pos = 1;
    		
    	return pos;	
    }
    
    int segnaPosLepr( int ran )
    {
    	int pos;
    	
    	if ( (ran >= 1) && (ran <= 2) )
    		pos = 0;
    			
    	else if ( (ran >= 3) && (ran <= 4) ) 
    		pos = 9;
    			
    	else if ( (ran >= 5) && (ran <= 5) ) 
    		pos = -12;
    	
    	else if ( (ran >= 6) && (ran <= 8) ) 
    		 pos = 1;
    
    	else if ( (ran >= 9) && (ran <= 10) ) 
    		pos = -2;
    
    	return pos;
    }
    
    void mostraPerc( int perc[70] )
    {
    	int k;
    
    	for (k=1; k<=70; k++) {
    		
    		if (perc[k] == 1) 
    			printf("%4s", "T");
    		
    		else if (perc[k] == 2)
    			printf("%4s", "L");
    		
    		else if (perc[k] == 3)
    			printf("%5s", "OUCH!");
    			
    		else if (perc[k] == 0)	
    			printf(" ");
    		
    	}	
    
    }
    spero mi possiate dare una mano

  2. #2
    Dimenticavo che il programma non mi stampa neanche il giocatore vincente.

  3. #3
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

    ho modificato un po , nel while hai messo un OR mentre andava un AND
    se tutte e due le variabili sono minori di 70

    ho cambiato un po le variabili nei cicli for fatti partire da 0 a <70

    ho messo un controllo che il valore delle posizioni non diventi mai inferiore a 0

    ho messo un controllo che permette di non avere valori diversi da 1 2 o 3 all'interno dell'array

    per il resto tutto ok funziona

    SOTTO I COMMENTI IN MAIUSCOLO SONO LE CORREZZIONI

    codice:
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    int segnaPosTart( int ran );
    int segnaPosLepr( int ran );
    void mostraPerc( int per[70] );
    
    int main() 
    {
    	int percorso[70] = {0}; // vettore del percorso
    	int posTart = 0;
    	int posLepr = 0;
    	int i; // i è compreso tra 1 e 10 e serve per generare una mossa.
    	int k;
    
    
    
    	srand(time (NULL)); 	/* specifica il seme per il generatore di 
    				numeri casuali */
    	
    	printf("BANG !!!!!\n");
    	
    	while ( (posTart <= 69) && (posLepr <= 69) ) { //AVEVI MESSO UN OR  QUINDI CONTINUAVA ANCHE 
                  // MOLTO OLTRE I 70 PER VARIABILE
    		
    		//Azzero il percorso per mostrare solo le mosse eseguite nel ciclo
    		for (k=0; k< 70; k++) {
    			percorso[k] = 0;
    		}
    
    		/* in base al numero generato posTart e posLepr restituiscono
    		 * il tipo di mosse da eseguire (ovvero i passi avanti o dietro) */
    		i = rand() % 9 + 1;
    	
    		posTart += segnaPosTart(i);
    		if(posTart<0)posTart=0;//LIMITO LA DIMENSIONE MINIMA DELL'ARRAY
    		i = rand() % 9 + 1;
    		posLepr += segnaPosLepr(i);
    		if(posLepr<0)posLepr=0;//LIMITO LA DIMENSIONE MINIMA DELL'ARRAY
    
           // CON QUESTE CONDIZIONI IN PERCORSO PUO' ESSERCI SOLO 1 2 O 3
            if(percorso[posTart]!=1 && percorso[posTart]!=3 )
    		    percorso[posTart] += 1;
           	if(percorso[posTart]!=2 && percorso[posTart]!=3  )	    
    		    percorso[posLepr] += 2;
    		
    		mostraPerc(percorso);
    		printf("\n");
    		
    		}
    		
    	
    	
    	if (posTart >= 70)
    		printf("\n\nVINCE LA TARTARUGA!!!!");
    		
    	else if (posLepr >= 70)
    		printf("\n\nVINCE LA LEPRE!!!!");
    	getchar();	// UNA PAUSA AL PROGRAMMA
    	return 0;
    }
    
    int segnaPosTart( int ran )
    {
    
    	int pos;	
    
    	if ( (ran >= 1) && (ran <= 5) )
    		pos = 3;
    			
    	else if ( (ran >= 6) && (ran <= 7) ) 
    		pos = -6;
    			
    	else if ( (ran >= 8) && (ran <= 10) )
    		pos = 1;
    		
    	return pos;	
    }
    
    int segnaPosLepr( int ran )
    {
    	int pos;
    	
    	if ( (ran >= 1) && (ran <= 2) )
    		pos = 0;
    			
    	else if ( (ran >= 3) && (ran <= 4) ) 
    		pos = 9;
    			
    	else if ( (ran >= 5) && (ran <= 5) ) 
    		pos = -12;
    	
    	else if ( (ran >= 6) && (ran <= 8) ) 
    		 pos = 1;
    
    	else if ( (ran >= 9) && (ran <= 10) ) 
    		pos = -2;
    
    	return pos;
    }
    
    void mostraPerc( int perc[] )
    {
    	int k;
    
    	for (k=0; k<70; k++) { // K PARTE DA 0 E NON DA 1
    		
    		if (perc[k] == 1) 
    			printf("%4s", "T");
    		
    		else if (perc[k] == 2)
    			printf("%4s", "L");
    		
    		else if (perc[k] == 3)
    			printf("%5s", "OUCH!");
    			
    		else if (perc[k] == 0)	
    			printf("--"); // HO MESSO DUE TRATTINI è PIU CARNIO BA' :)
    		
    	}	
    
    }
    Tecnologia

  4. #4
    Ti ringrazio per i suggerimenti e per il tempo che mi hai dedicato, adesso il programma funziona una meraviglia

    L'unica cosa che volevo chiederti è a che server il getchar() ?

  5. #5
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

    Di solito , si esegue il programma , stampa a video i risultati , ma se non metti qualcosa
    che fa attendere il programma , il programma termina senza che hai il tempo di vedere lo schermo , allora aggiungendo un getchar() il programma attende che inserisci un carattere
    da tastiera , e puoi guardarti i risultati con calma
    non so che ambiente usi per non accorgerti che la finestra scompare in un lampo senza
    il getchar()
    Tecnologia

  6. #6
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590

    Re: ciao

    Originariamente inviato da torn24
    non so che ambiente usi per non accorgerti che la finestra scompare in un lampo senza
    il getchar()
    L'ambiente di debug di un IDE
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  7. #7
    ho capito quindi getchar() è una specie di system("PAUSE") che utilizzavo in windows

    io uso Geany in ubuntu, ma se non ricordo male, anche eseguendo da gcc la finestra a fine programma non scompare

    Cmq grazie ancora per l'aiuto!

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.