Gioco del biliardo in C

di il
5 risposte

Gioco del biliardo in C

TESTO:
Cattura.PNG
Cattura.PNG

Purtroppo dal punto 3 mi sono trovato in difficoltà e non so come muovermi per eseguire questo programma.
Ho provato però mi ritrovo il problema che se la palla bianca colpisce la rossa e non va in buca bisogna assegnare un punto, ma non riesco a fare questa cosa. Riesco solo a fare il caso in cui la palla bianca colpisce la rossa e la manda in buca, da qui non posso fare neanche il resto del programma. Qualcuno che mi da una mano?
Mia risoluzione:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <math.h>
void genRand(double *x, double *y);
void counter(int *punteggio);
int main() {
    srand(time(NULL));
    printf("Il programma simula una partita di biliardo\n");
    int N;
    do {
        printf("Inserire il numero di colpi sulla palla bianca: ");
        scanf("%d",&N);
        if (N < 100 || N > 200)
            printf("ERRORE: il numero inserito deve appartenere all'intervallo [100,200]\n");
    } while (N < 100 || N > 200);
    int i, punteggio = 0;
    for (i = 0; i < N; i++) {
        counter(&punteggio);
    }
    printf("%d\n",punteggio);
}

void genRand(double *x, double *y) {
	double wb;
    wb = rand()/(double)RAND_MAX;
    *x = wb;
	double rb;
	if (wb > 0.4) {
        rb = rand()/(double)RAND_MAX;
        *y = rb;
    }
    if (wb > 0.1 && wb <= 0.4) {
        rb = rand()/(double)RAND_MAX * 0.5;
        *y = rb;
    }
    if (wb <= 0.1) {
        rb = rand()/(double)RAND_MAX * 0.5;
        *y = rb;
    }
}

void counter(int *punteggio) {
    double x, y;
    genRand(&x, &y);
    if (x > 0.4 && y > 0.5) {
        *punteggio += 2;
    }
    if (x > 0.1 && x <= 0.4) {
        *punteggio -= 3;
    }
    if (*punteggio < 0) {
        *punteggio = 0;
    }
}

5 Risposte

  • Re: Gioco del biliardo in C

    
    int colpo(int * serie){
    
    double r = rand()/(double)RAND_MAX;
    if(r < 0.3){ // buca
       *serie = 0;
       return -3;
    }
    else if (r < 0.4){ // nulla
       *serie = *serie + 1;
       return 0;
    }
    else{ // colpita
       r = rand()/(double)RAND_MAX;
       if(r < 0.5){ // nulla
          *serie = *serie + 1;
          return 0;
       }
       else{ // punto 
         if(*serie > 0){
            *serie = 0;
            return 1;
         }
         else
            return 2;
       }
    }
    
    }
    
    Vai avanti tu
  • Re: Gioco del biliardo in C

    In ogni caso io userei valori e intervalli interi per le probabilità.
  • Re: Gioco del biliardo in C

    Credo di averlo realizzato, però mi sorge un dubbio per il punto 4, questo array che dimensione deve avere?
    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>
    #include <math.h>
    int genRand(int *serie);
    void counter(int *punteggio);
    int main() {
        srand(time(NULL));
        printf("Il programma simula una partita di biliardo\n");
        int N;
        do {
            printf("Inserire il numero di colpi sulla palla bianca: ");
            scanf("%d",&N);
            if (N < 100 || N > 200)
                printf("ERRORE: il numero inserito deve appartenere all'intervallo [100,200]\n");
        } while (N < 100 || N > 200);
        int i, punteggio = 0;
        for (i = 0; i < N; i++) {
            counter(&punteggio);
        }
        printf("%d\n",punteggio);
    }
    
    int genRand(int *serie) {
        double rb, wb;
        wb = rand()/((double)RAND_MAX);
        if (wb < 0.1) {
            *serie = *serie + 1;
            return 0;
        }
        
        else if (wb < 0.4) {
            *serie = 0;
            return -3;
        }
        
        else {
            rb = rand()/((double)RAND_MAX);
            if (rb < 0.5) {
                *serie = *serie + 1;
                return 0;
            }
            else {
                if (*serie > 0) {
                    *serie = 0;
                    return 1;
                }
                else {
                    return 2;
                }
            }
        }
    }
    
    void counter(int *punteggio) {
        int serie;
        *punteggio += genRand(&serie);
        if (*punteggio < 0) {
            *punteggio = 0;
        }
    }
  • Re: Gioco del biliardo in C

    Ovviamente non può funzionare così. Non le studiate visibilità e tempo di vita delle variabili? O usi variabili static o le usi direttamente globali
    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>
    #include <math.h>
    
    int genRand(void);
    void counter(int *punteggio);
    
    int serie; /* inizializzata a 0 perche' globale */
    int hit[200];
    int hit_index; /* alla fine diventa il totale delle palle imbucate */
    
    int main() {
        srand(time(NULL));
        printf("Il programma simula una partita di biliardo\n");
        int N;
        do {
            printf("Inserire il numero di colpi sulla palla bianca: ");
            scanf("%d",&N);
            if (N < 100 || N > 200)
                printf("ERRORE: il numero inserito deve appartenere all'intervallo [100,200]\n");
        } while (N < 100 || N > 200);
        int i, punteggio = 0;
        for (i = 0; i < N; i++) {
            counter(&punteggio);
        }
        printf("%d\n",punteggio);
    }
    
    int genRand(void) {
        double rb, wb;
        wb = rand()/((double)RAND_MAX);
        if (wb < 0.1) {
            serie = serie + 1;
            return 0;
        }
        
        else if (wb < 0.4) {
            hit[hit_index] += serie + 1;
            serie = 0;
            return -3;
        }
        
        else {
            rb = rand()/((double)RAND_MAX);
            if (rb < 0.5) {
                serie = serie + 1;
                return 0;
            }
            else {
                hit[hit_index] += serie + 1;
                hit_index = hit_index + 1;
                if (serie > 0) {  
                    serie = 0;
                    return 1;
                }
                else {
                    return 2;
                }
            }
        }
    }
    
    void counter(int *punteggio) {
        *punteggio += genRand();
        if (*punteggio < 0) {
            *punteggio = 0;
        }
    }
  • Re: Gioco del biliardo in C

    Nippolo ha scritto:


    In ogni caso io userei valori e intervalli interi per le probabilità.
    #include <iostream>
    #include <cstdlib>
    
    using namespace std;
    
    int main()
    {
        unsigned int n = 0;
        for(unsigned int i = 1; i <= 10; ++i)
        {
            unsigned int cont = 0;
            while(n / (double)RAND_MAX < i * 0.1)
            {
                ++cont;
                ++n;
            }
            cout << cont << endl;
        }
    }
    Oltre ovviamente alla questione puramente probabilistica sopra mostrata, si aggiungono anche il problema di come definire i vari intervalli e quello relativo al confronto tra valori in virgola mobile.
Devi accedere o registrarti per scrivere nel forum
5 risposte