Entra

View Full Version : [C] Simulazione gioco Tennis


Vincenzoflaminio
19-02-2010, 23:50
Salve , devo sviluppare questo progetto per l'esame di programmazione I .
Non ho ancora studiato tutti gli argomenti tuttavia nonostante abbia trattato la maggior parte degli argomenti come Function , array , insiemi , stringhe , approccio incrementale non so neanche come iniziarlo :confused: ... Qualcuno sapremme darmi qualche dritta su quali argomenti studiare per risolvere qst problema? :help:

Gioco del tennis:
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 che può muovere solo a sinistra (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://www.allfreeportal.com/imghost/images/890255tennis.jpg

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.

bobbytre
20-02-2010, 02:13
forse puoi fare che il campo sia un array di interi , e il colore il numero contenuto ( blu = 0 , arancio =2 , giallo = 1)

http://i.imagehost.org/0272/Immagine.png

if( campo[ destinazione_della_palla ] == BLU)
{
perdi();
}

if( campo[ destinazione_della_palla ] == GIALLO)
{
if( potenza > 3)
perdi();
else
vinci();
}

if( campo[ destinazione_della_palla ] == ARANCIO)
{
vinci();
}

WarDuck
20-02-2010, 09:59
Beh ci vedrei meglio una matrice (che poi a basso livello è gestita come un array è un altro paio di maniche :D ).

bobbytre
20-02-2010, 15:04
Beh ci vedrei meglio una matrice (che poi a basso livello è gestita come un array è un altro paio di maniche :D ).

ho scelto l'array perche puoi determinare la posizione con una singola variabile, con una matrice ne servirebbero due ( riga e colonna ) , perchè complicarsi la vita ? :)

Vincenzoflaminio
21-02-2010, 04:14
forse puoi fare che il campo sia un array di interi , e il colore il numero contenuto ( blu = 0 , arancio =2 , giallo = 1)

http://i.imagehost.org/0272/Immagine.png

if( campo[ destinazione_della_palla ] == BLU)
{
perdi();
}

if( campo[ destinazione_della_palla ] == GIALLO)
{
if( potenza > 3)
perdi();
else
vinci();
}

if( campo[ destinazione_della_palla ] == ARANCIO)
{
vinci();
}

Mi sembra un ottima idea ... potrei definire un tipo derivato e una struct

typedef enum {Blu,giallo,arancione} Colori;
struct area_gioco{
int valore;
Colori colore;
};
typedef area_gioco Area_gioco;

e magari usare i tuoi esempi in qst modo definendo un array di tipo derivato:

Area_gioco campo[];

if( campo[10,arancione] )
{
punt_giocatore=punt_giocatore+1;


Correggetemi se sbaglio sono alle prime armi :D

nikel
21-02-2010, 20:31
come gestisci la parte grafica? testuale o grafica "seria"???

comunque avevo fatto una cosa molto simile in pascal tempo fa se ti interessa...

bobbytre
21-02-2010, 23:38
come gestisci la parte grafica? testuale o grafica "seria"???

comunque avevo fatto una cosa molto simile in pascal tempo fa se ti interessa...

non credo che l'esame preveda una parte grafica ,

anzi che glielo fanno scrivere al computer , e non con carta e penna :D

Vincenzoflaminio
22-02-2010, 00:29
non credo che l'esame preveda una parte grafica ,

anzi che glielo fanno scrivere al computer , e non con carta e penna :D

Si infatti niente grafica , devo mandare via email il progetto al prof per accedere all'orale... Nikel mi fare piacere vedere qualcosina .
Bobby scusami mi sapresti dire se il ragionamento sopra è esatto quello del tipo derivato e la struct vedo che tu sei piu esperto ;)

bobbytre
22-02-2010, 01:53
Mi sembra un ottima idea ... potrei definire un tipo derivato e una struct

typedef enum {Blu,giallo,arancione} Colori;
struct area_gioco{
int valore;
Colori colore;
};
typedef area_gioco Area_gioco;

e magari usare i tuoi esempi in qst modo definendo un array di tipo derivato:

Area_gioco campo[];

if( campo[10,arancione] )
{
punt_giocatore=punt_giocatore+1;


Correggetemi se sbaglio sono alle prime armi :D

Si infatti niente grafica , devo mandare via email il progetto al prof per accedere all'orale... Nikel mi fare piacere vedere qualcosina .
Bobby scusami mi sapresti dire se il ragionamento sopra è esatto quello del tipo derivato e la struct vedo che tu sei piu esperto ;)

non lo so, non mi convince...

per "valore" dentro struct area_gioco cosa intendi ?
questo if( campo[10,arancione] ) non è corretto

riguardo ai colori va bene , anche se puoi anche dichiararli cosi



#define BLU 0
#define GIALLO 1
#define ARANCIO 2

// se devi usare una struct puoi usarla cosi:
typedef struct _tiro_
{
int destinazione;
int potenza;
}
Tiro;

// insieme a una funzione tipo questa
void tiro_del_computer(Tiro *cpu_tiro)
{
cpu_tiro->destinazione = random( DIM_CAMPO );
cpu_tiro->potenza = random( MAX_POWER );
}

// e quindi come prima

main()
{
Tiro cpu_tiro;

tiro_del_computer(&cpu_tiro);

int destinazione_della_palla = cpu_tiro.destinazione;
int potenza = cpu_tiro.potenza ;

if( campo[ destinazione_della_palla ] == BLU)
{
perdi();
}

if( campo[ destinazione_della_palla ] == GIALLO)
{
if( potenza > 3)
perdi();
else
vinci();
}

if( campo[ destinazione_della_palla ] == ARANCIO)
{
vinci();
}
}

Vincenzoflaminio
22-02-2010, 16:39
Bene ho quasi finito di scriverlo, però qui dove mi dici
// insieme a una funzione tipo questa
void tiro_del_computer(Tiro *cpu_tiro)
{
cpu_tiro->destinazione = random( DIM_CAMPO );
cpu_tiro->potenza = random( MAX_POWER );

come faccio a dare il valore a cpu_tiro destinazione e a potenza ovviamente
cpu_tiro->destinazione non è esatto ... come si fa precisamente?

bobbytre
22-02-2010, 16:47
Bene ho quasi finito di scriverlo, però qui dove mi dici
// insieme a una funzione tipo questa
void tiro_del_computer(Tiro *cpu_tiro)
{
cpu_tiro->destinazione = random( DIM_CAMPO );
cpu_tiro->potenza = random( MAX_POWER );

come faccio a dare il valore a cpu_tiro destinazione e a potenza ovviamente
cpu_tiro->destinazione non è esatto ... come si fa precisamente?

tu come vuoi che siano dati i paramatri ?
puoi usare una funziore random che ti restituisce un valore tra 0 e MAX , o puoi inserire tu i valori ( ma a quel punto non sarebbe piu un tiro "pensato" dal computer) , lo stesso vale per la potenza.

riguardo a cpu_tiro->destinazione non è esatto in che senso ?

Vincenzoflaminio
22-02-2010, 19:22
#include <stdio.h>
#include <stdlib.h>

#define BLU 0
#define GIALLO 1
#define ARANCIO 2

struct _tiro_
{
int destinazione ;
int potenza;
};
typedef struct _tiro_ Tiro;
void tiro_del_computer(Tiro *);

int main()
{
int area_gioco [3]= {0 , 1 , 2};
int dim_area_gioco=3;
int potenza_tiro []={1,2,3,4,5,6,7,8,9,10};
int dim_potenza_tiro=10;
int punteggio_cpu=0;
int punteggio_giocatore=0;
Tiro cpu_tiro;
tiro_del_computer(&cpu_tiro);
int destinazione_palla= cpu_tiro.destinazione;
int potenza = cpu_tiro.potenza ;
if (area_gioco[destinazione_palla] == BLU);
{
punteggio_cpu=punteggio_cpu+1;
}
if (area_gioco[destinazione_palla] == GIALLO);
{
if (potenza>3)
punteggio_cpu=punteggio_cpu+1;
else
punteggio_giocatore=punteggio_giocatore+1;
}
printf("i punteggi sono %d vs %d", punteggio_cpu, punteggio_giocatore);
system("PAUSE");
return 0;


void tiro_del_computer(Tiro *cpu_tiro);
{
cpu_tiro.destinazione = rand()%dim_area_gioco;
cpu_tiro.potenza = rand()%dim_potenza_tiro;
}
}

Eccolo qui finito... unico errore del COMPILATORE (dev c++) :
Linker error : undefined reference to tiro_del_computer

bobbytre
22-02-2010, 19:35
hai messo un punto è virgola di troppo

void tiro_del_computer(Tiro *cpu_tiro); <-- qui !
{
cpu_tiro.destinazione = rand()%dim_area_gioco;
cpu_tiro.potenza = rand()%dim_potenza_tiro;
}

Vincenzoflaminio
23-02-2010, 01:08
hai messo un punto è virgola di troppo

void tiro_del_computer(Tiro *cpu_tiro); <-- qui !
{
cpu_tiro.destinazione = rand()%dim_area_gioco;
cpu_tiro.potenza = rand()%dim_potenza_tiro;
}

GIUSTO! però ora mi da questi altri due errori:
46 request for member `destinazione' in something not a structure or union
47 request for member `potenza' in something not a structure or union

bobbytre
23-02-2010, 02:00
se quello è il tuo codice originale , devi fare attenzione ci sono tanti errori ,
funzioni dichiarate dentro altre funzioni (tiro_del_computer dentro il main) ,
i valori dei campi della struct sono assegnati in modo errato dentro la funzione tiro_del_computer
e ci sono punti e virgola posizionati in modo errato,
e non stai valutando il caso che uscisse ARANCIO.

Vincenzoflaminio
23-02-2010, 16:37
se quello è il tuo codice originale , devi fare attenzione ci sono tanti errori ,
funzioni dichiarate dentro altre funzioni (tiro_del_computer dentro il main) ,
i valori dei campi della struct sono assegnati in modo errato dentro la funzione tiro_del_computer
e ci sono punti e virgola posizionati in modo errato,
e non stai valutando il caso che uscisse ARANCIO.

- tiro_del_computer dentro il main è una chiamata alla funzione
- ho aggiunto il caso ARANCIONE
- i valore assegnati in modo errato nella funzione nn ho capito...

ti riposto il codice con commento mio
struct _tiro_
{
int destinazione[3]; "]/* dichiaro la struct con i valori di destinazione e potenza */
int potenza[10]:
};
typedef struct _tiro_ Tiro;
void tiro_del_computer(Tiro *); /* dichiaro la funzione con argomento un tipo Tiro*/int main()
{
int area_gioco [3]= {0 , 1 , 2};
int dim_area_gioco=3;
int dim_potenza_tiro=10;
int punteggio_cpu=0;
int punteggio_giocatore=0;
Tiro cpu_tiro; /* inizializzo un tipo tiro che sarà argomento della funzione*/
tiro_del_computer(&cpu_tiro); /* chiamata alla funzione */
int destinazione_palla= cpu_tiro.destinazione; /* inizializzo un intero con il valore della destinazione che mi arriva dalla funzione*/
int potenza = cpu_tiro.potenza ; /* stesso qui ma a potenza */
if (destinazione_palla == BLU); /* utilizzo l'intero di prima per le verifiche */
{
punteggio_cpu=punteggio_cpu+1;
}
if (destinazione_palla == GIALLO);
{
if (potenza>3)
punteggio_cpu=punteggio_cpu+1;
else
punteggio_giocatore=punteggio_giocatore+1;
}
if (destinazione_palla == ARANCIO);
{
punteggio_giocatore=punteggio_giocatore+1;
}
printf("i punteggi sono %d vs %d", punteggio_cpu, punteggio_giocatore);
system("PAUSE");
return 0;


void tiro_del_computer(Tiro *cpu_tiro) /* questo è quanto fa la funzione */
{
cpu_tiro.destinazione = rand()%3; // cpu_tiro è una struct da due valori qui assegno a destinazione un valore casuale da 0 a 2 */ cpu_tiro.potenza = rand()%11; // valore casuale da 1 a 10 */
}

bobbytre
23-02-2010, 17:01
Ta-daaa !


#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define BLU 0
#define GIALLO 1
#define ARANCIO 2

typedef struct _tiro_ {
int destinazione;
int potenza;
} Tiro;

int random(int max)
{
static int init = 0;
if (!init)
{
init = 1;
srand(time(0));
}
return rand() % max;
}

void tiro_del_computer(Tiro *cpu_tiro, int dim_area_gioco, int dim_potenza_tiro)
{
cpu_tiro->destinazione = random(dim_area_gioco);
cpu_tiro->potenza = random(dim_potenza_tiro);
}

int main(void)
{
int area_gioco[3] = { 0, 1, 2 };
int dim_area_gioco = 3;
int potenza_tiro[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int dim_potenza_tiro = 10;
int punteggio_cpu = 0;
int punteggio_giocatore = 0;
Tiro cpu_tiro;


for (int i = 0; i < 15; i++)
{
tiro_del_computer(&cpu_tiro, dim_area_gioco, dim_potenza_tiro);

int destinazione_palla = cpu_tiro.destinazione;
int potenza = cpu_tiro.potenza;

if (area_gioco[destinazione_palla] == BLU)
{
punteggio_cpu++;
}

if (area_gioco[destinazione_palla] == GIALLO)
{
if (potenza > 3)
punteggio_cpu++;
else
punteggio_giocatore++;
}

if (area_gioco[destinazione_palla] == ARANCIO)
{
punteggio_giocatore++;
}

}

if (punteggio_cpu >= punteggio_giocatore)
{
if (punteggio_cpu > punteggio_giocatore)
{
printf("Ha vinto il computer\n");
}
else
{
printf("Pareggio !\n");
}
}
else
{
printf("Ha vinto il giocatore\n");
}

printf("\nRisultati:\n CPU = %d \n PLAYER = %d\n\n", punteggio_cpu, punteggio_giocatore);
system("PAUSE");
return 0;

}

Ryuzaki_Eru
23-02-2010, 17:11
Programmazione I e vi fanno fare questo? Bella fortuna.

Vincenzoflaminio
23-02-2010, 19:46
Bobbytre come dici tu funziona finalmente ... il mio errore era non assegnare alla function gli altri due parametri cioè dim_area e dim_potenza..

Gli ultimi accorgimenti che devo seguire sono questi ecco perhcè io usavo il comando rand()%dim_area_gioco che dovrebbe corrispondere al tuo random(dim_area_gioco) :

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

Ho risolto tutto a parte una cosa io nel ciclo for metto
for (i=0;i<500;i++)

ma quando parte il programma il punteggio sommato tra cpu e giovatore è 1500..:confused:
ma se io metto 500 com'è possibile?

bobbytre
24-02-2010, 01:15
Bobbytre come dici tu funziona finalmente ... il mio errore era non assegnare alla function gli altri due parametri cioè dim_area e dim_potenza..

Gli ultimi accorgimenti che devo seguire sono questi ecco perhcè io usavo il comando rand()%dim_area_gioco che dovrebbe corrispondere al tuo random(dim_area_gioco) :

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

Ho risolto tutto a parte una cosa io nel ciclo for metto
for (i=0;i<500;i++)

ma quando parte il programma il punteggio sommato tra cpu e giovatore è 1500..:confused:
ma se io metto 500 com'è possibile?

ti fa 1500 perche sicuramente avrai messo dei punti e virgola in modo errato dopo gli IF e quindi fai eseguire il blocco nelle parentesi graffe a prescindere dalla condizione.

posta il tuo codice e ti posso dare una conferma.