PDA

View Full Version : Algoritmo in C Pallavolo


ninuzz
21-01-2011, 18:15
Si vuole sviluppare un programma per la simulazione del gioco della pallavolo. Si suppone di avere due squadre di 4 giocatori ognuna. Il campo da gioco viene considerato come una mappa regolare di dimensioni 6 x 6. Ogni giocatore, per ogni squadra, possiede una regione (cella) identificata casualmente.
Il gioco procede in questo modo:
· In modo casuale si sceglie la squadra che batte la palla.
· La palla viene lanciata nel campo avversario e cade in una cella scelta
casualmente,
se la palla cade in una cella vuota il punteggio viene dato alla
squadra attaccante. La squadra ricevente provvede a battere la palla.
Se la palla cade in una cella con un giocatore la palla viene lanciata
nel campo avversario
· La palla lanciata ha il 40% di cadere sulla rete e il 20% di andare fuori. In
questo caso il punto va alla squadra avversaria a quella che batte.
Vince la squadra che per prima arriva a 20.
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.

io ho cominciato a dichiarare una matrice 6x6 :muro:

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

void main()
{int i,j,nx,ny;
char squadra1;
char squadra2;
squadra1='x'; *\sarebbero i giocatori cn le maglie x
squadra2='o'; *\sarebbero i giocatori cn le maglie o
char campo [][6]= {{' ',' ',' ',' ',' ',' ',},
{' ',' ',' ',' ',' ',' ',},
{' ',' ',' ',' ',' ',' ',},
{' ',' ',' ',' ',' ',' ',},
{' ',' ',' ',' ',' ',' ',},
{' ',' ',' ',' ',' ',' ',}};
è mi sn fermato qui, :O perchè non sò se dividere il campo in modo da far entrare una squadra nel campo 3x3 e viceversa l'altra...???

dp x generare una posizione dei giocatori e posizionarli sul campo potrei fare:

for(i=1;i<=4; i++)
{nx=rand()%6;
ny=rand()%6;
campo[nx][ny]= squadra1;
}
for(i=1;i<=4; i++)
{nx=rand()%6;
ny=rand()%6;
campo[nx][ny]= squadra2;
}
:help:
se
avete altre idee in merito...sarei lieto di visionarle insieme a voi...:cool:

ninuzz
24-01-2011, 12:55
Si vuole sviluppare un programma per la simulazione del gioco della pallavolo. Si suppone di avere due squadre di 4 giocatori ognuna. Il campo da gioco viene considerato come una mappa regolare di dimensioni 6 x 6. Ogni giocatore, per ogni squadra, possiede una regione (cella) identificata casualmente.
Il gioco procede in questo modo:
· In modo casuale si sceglie la squadra che batte la palla.
· La palla viene lanciata nel campo avversario e cade in una cella scelta
casualmente,
se la palla cade in una cella vuota il punteggio viene dato alla
squadra attaccante. La squadra ricevente provvede a battere la palla.
Se la palla cade in una cella con un giocatore la palla viene lanciata
nel campo avversario
· La palla lanciata ha il 40% di cadere sulla rete e il 20% di andare fuori. In
questo caso il punto va alla squadra avversaria a quella che batte.
Vince la squadra che per prima arriva a 20.
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.

io ho cominciato a dichiarare una matrice 6x6 :muro:

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

void main()
{int i,j,nx,ny;
char squadra1;
char squadra2;
squadra1='x'; *\sarebbero i giocatori cn le maglie x
squadra2='o'; *\sarebbero i giocatori cn le maglie o
char campo [][6]= {{' ',' ',' ',' ',' ',' ',},
{' ',' ',' ',' ',' ',' ',},
{' ',' ',' ',' ',' ',' ',},
{' ',' ',' ',' ',' ',' ',},
{' ',' ',' ',' ',' ',' ',},
{' ',' ',' ',' ',' ',' ',}};
è mi sn fermato qui, :O perchè non sò se dividere il campo in modo da far entrare una squadra nel campo 3x3 e viceversa l'altra...???

dp x generare una posizione dei giocatori e posizionarli sul campo potrei fare:

for(i=1;i<=4; i++)
{nx=rand()%6;
ny=rand()%6;
campo[nx][ny]= squadra1;
}
for(i=1;i<=4; i++)
{nx=rand()%6;
ny=rand()%6;
campo[nx][ny]= squadra2;
}
:help:
se
avete altre idee in merito...sarei lieto di visionarle insieme a voi...:cool:
il mio problema è ke quando posiziono i giocatori sul campo mi vengo mischiati...e delle volte cn la funzione rand invece di crearmi 4 giocatori per ogni squadra me ne crea...3...

shinya
24-01-2011, 15:03
il mio problema è ke quando posiziono i giocatori sul campo mi vengo mischiati...e delle volte cn la funzione rand invece di crearmi 4 giocatori per ogni squadra me ne crea...3...

Beh che vengano mischiati mi pare normale, dato che inizializzi sempre nx e ny con rand()%6 per entrambe le squadre. La squadra A deve stare nelle prime 3 colonne e la B nelle ultime 3.
Sul fatto che ogni tanto vengano generati 3 giocatori invece di 4, mi viene da dire che semplicemente i giocatori vengono "sovrascritti" da un altro giocatore che viene posizionato nella stessa cella, dato che non c'è nessun controllo su celle già occupate da altri giocatori.

ninuzz
24-01-2011, 18:37
Beh che vengano mischiati mi pare normale, dato che inizializzi sempre nx e ny con rand()%6 per entrambe le squadre. La squadra A deve stare nelle prime 3 colonne e la B nelle ultime 3.
Sul fatto che ogni tanto vengano generati 3 giocatori invece di 4, mi viene da dire che semplicemente i giocatori vengono "sovrascritti" da un altro giocatore che viene posizionato nella stessa cella, dato che non c'è nessun controllo su celle già occupate da altri giocatori.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void main()
{
int i,j,nx,ny;
char squadra1='x';
char squadra2='o';
char campo[][6]={{' ',' ',' ',' ',' ',' ',},
{' ',' ',' ',' ',' ',' ',},
{' ',' ',' ',' ',' ',' ',},
{' ',' ',' ',' ',' ',' ',},
{' ',' ',' ',' ',' ',' ',},
{' ',' ',' ',' ',' ',' ',}};
srand(time(NULL));
for(i=1; i<=4; i++)
{
nx=rand()%3;
ny=rand()%3;
campo[nx][ny]=squadra1;
}
for(i=1; i<=4; i++)
{
nx=3+rand()%6;
ny=3+rand()%6;
campo[nx][ny]=squadra2;
}
for(i=0; i<6; i++)
{for(j=0; j<6; j++)
printf("%c",campo[i][j]);
printf("\n");

facendo così mi crea sempre lo stesso problema... alcuni giocatori non me li posiziona...ma in merito si allineano...

ninuzz
24-01-2011, 19:30
come faccio a fare un controllo sulle celle...in modo che non vengano "sovrascritte"

shinya
25-01-2011, 10:56
come faccio a fare un controllo sulle celle...in modo che non vengano "sovrascritte"

if (campo[nx][ny] == ',') ...

... la cella è libera.

ps. ti prego, indenta il codice mettendolo in un tag [code] altrimenti c'è da morire.

ninuzz
25-01-2011, 16:26
if (campo[nx][ny] == ',') ...

... la cella è libera.

ps. ti prego, indenta il codice mettendolo in un tag [code] altrimenti c'è da morire.


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{int j,i,nx,ny;
char giocator1='x'; /*giocatori maglia x*/
char giocator2='o'; /*giocatori maglia o*/
char campo [][6]= {{' ',' ',' ',' ',' ',' ',},
{' ',' ',' ',' ',' ',' ',},
{' ',' ',' ',' ',' ',' ',},
{' ',' ',' ',' ',' ',' ',},
{' ',' ',' ',' ',' ',' ',},
{' ',' ',' ',' ',' ',' ',}};

srand(time(NULL));
for(i=1;i<=4; i++)
{
nx=rand()%3;
ny=rand()%3;
campo[nx][ny]=giocator1;
if(campo[nx][ny]==' ')
nx=3+rand()%6;
ny=3+rand()%6;
campo[nx][ny]=giocator2;
}
for(i=0; i<6; i++)
{for(j=0; j<6; j++)
printf("%c",campo[i][j]);
printf("\n");
}

ho provato anke ad eseguirlo così ma il dev-c mi produce smpr lo stesso problema cioè giocatori mischiati e mancanti... anke se provo a generarli lontani dagl'altri cioè facendo nx=3+rand()%6 nell intervallo (3,4,5,6)( per i giocatori con le 'o') mentre nx=rand()%3 nell intervallo(0,1,2,3)(per i giocatori cn le 'x')...facendo così non si dovrebbe sovrascrivere??:mbe: ...se non ti dà troppo fastidio può eseguirlo anke te lo stesso codice...in modo che riesci a capirmi cosa voglio esprimere..:)
ah..scusa...per il mancato tag di prima;)

ninuzz
25-01-2011, 18:34
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{int j,i,nx,ny;
char giocator1='x'; /*giocatori maglia x*/
char giocator2='o'; /*giocatori maglia o*/
char campo [][6]= {{' ',' ',' ',' ',' ',' ',},
{' ',' ',' ',' ',' ',' ',},
{' ',' ',' ',' ',' ',' ',},
{' ',' ',' ',' ',' ',' ',},
{' ',' ',' ',' ',' ',' ',},
{' ',' ',' ',' ',' ',' ',}};

srand(time(NULL));
for(i=1;i<=4; i++)
{
nx=rand()%3;
ny=rand()%3;
campo[nx][ny]=giocator1;
if(campo[nx][ny]==' ')
nx=3+rand()%6;
ny=3+rand()%6;
campo[nx][ny]=giocator2;
}
for(i=0; i<6; i++)
{for(j=0; j<6; j++)
printf("%c",campo[i][j]);
printf("\n");
}

ho provato anke ad eseguirlo così ma il dev-c mi produce smpr lo stesso problema cioè giocatori mischiati e mancanti... anke se provo a generarli lontani dagl'altri cioè facendo nx=3+rand()%6 nell intervallo (3,4,5,6)( per i giocatori con le 'o') mentre nx=rand()%3 nell intervallo(0,1,2,3)(per i giocatori cn le 'x')...facendo così non si dovrebbe sovrascrivere??:mbe: ...se non ti dà troppo fastidio può eseguirlo anke te lo stesso codice...in modo che riesci a capirmi cosa voglio esprimere..:)
ah..scusa...per il mancato tag di prima;)



un lampo di genio:cincin: :ronf:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{int j,i,nx,ny;
char giocator1='x'; /*giocatori maglia x*/
char giocator2='o'; /*giocatori maglia o*/
char campo [][6]= {{' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' '}};
srand(time(NULL));
for(i=1;i<=4; i++) /*genera 4 posizioni a caso sul campo*/
{
nx=rand()%6;
ny=3+rand()%3-6; /*sposto sulle ultime 3 colonne*/
campo[nx][ny]=giocator1;
if (campo[nx][ny]==' ') /*controllo cella libera*/
nx=rand()%6;
ny=rand()%3; /*sposto sulle prime 3 colonne*/
campo[nx][ny]=giocator2;
}
for(i=0; i<6; i++)
{for(j=0; j<6; j++)
printf("%c",campo[i][j]);
printf("\n");
}
}


facendo così riesco a non farle mischiare...:sofico: ....ma adesso rimane il problema maggiore cioè i giocatori mancanti?? xkè succede ciò??cmq provando ad eseguirlo svariate volte circa il 60% delle volte mi escano 4 giocatori per squadra mentre il rimanente 30% me ne escono a volte 3,2,1 ecc...:doh:

shinya
26-01-2011, 10:14
Quel "if (campo[nx][ny]==' ')" buttato lì in mezzo non ha nessun senso. Cerca di ragionare: finché non trovo una cella vuota, genero una coppia di nx, ny; quando la trovo, posiziono il giocatore.

ninuzz
26-01-2011, 16:45
Quel "if (campo[nx][ny]==' ')" buttato lì in mezzo non ha nessun senso. Cerca di ragionare: finché non trovo una cella vuota, genero una coppia di nx, ny; quando la trovo, posiziono il giocatore.
....
infatti è inutile quel if....lo metto o non lo metto mi genera sempre un numero a caso di giocatori.....da come mi hai spiegato...ho presunto ke dovrei spostare l'if sopra al ciclo for(i=1;i<=4;i++) ...così finke trovo una cella vuota genero un giocatori...??:rolleyes:


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{int j,i,nx,ny;
char giocator1='x'; /*giocatori maglia x*/
char giocator2='o'; /*giocatori maglia o*/
char campo [][6]= {{' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' '}};
srand(time(NULL));
char rete='I';
for(i=0;i<6;i++){
campo[i][2]=rete;
}
for(i=1;i<=4; i++) /*genera 4 posizioni a caso sul campo*/

{
nx=rand()%6;
ny=3+rand()%3-6; /*sposto sulle ultime 3 celle*/
campo[nx][ny]=giocator1;
nx=rand()%6;
ny=rand()%2; /*sposto sulle prime 3 celle*/
campo[nx][ny]=giocator2;
}
for(i=0; i<6; i++)
{for(j=0; j<6; j++)
printf("%c",campo[i][j]);
printf("\n");
}
system("PAUSE");
return 0;
}

cmq per il momento ho messo la rete:)

Ziosilvio
27-01-2011, 13:01
Attenzione a come si usa rand: dovendo scegliere un numero a caso fra 1 e 6, rand()%6 dà dei risultati molto più prevedibili che non 1 + (int)(6*rand()/(RAND_MAX+1.0))
http://www.hwupgrade.it/forum/showthread.php?t=1196677 che forse dovrei aggiornare con una sezione sulle permutazioni random... perché qui bisogna scegliere a caso quattro numeri su sei senza ripetizioni...

ninuzz
27-01-2011, 15:59
Non è un problema di controllo di celle, perchè alla fine le posizioni di entrambe le squadre sono lontane l'une dall'altre e quindi non possono essere sovrascritte, quindi è nella funzione rand() che decide lei quando farmi uscire 4 giocatori per ogni squadra, non esiste un modo per fissare il rand? :confused: :D

ninuzz
27-01-2011, 16:25
Attenzione a come si usa rand: dovendo scegliere un numero a caso fra 1 e 6, rand()%6 dà dei risultati molto più prevedibili che non 1 + (int)(6*rand()/(RAND_MAX+1.0))
http://www.hwupgrade.it/forum/showthread.php?t=1196677 che forse dovrei aggiornare con una sezione sulle permutazioni random... perché qui bisogna scegliere a caso quattro numeri su sei senza ripetizioni...

Come faccio a far si...che non si ripetono le stesse pseudoposizioni :stordita:

ninuzz
27-01-2011, 16:38
Anke facendo una prova con nx=1+(6*rand()/(RAND_MAX+1)) mi dà sempre delle posizioni mancanti...anche se uniformemente più distribuiti:cry: :muro:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{int j,i,nx,ny;
char giocator1='x'; /*giocatori maglia x*/
char giocator2='o'; /*giocatori maglia o*/
char campo [][6]= {{' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' '}};
srand(time(NULL));
char rete='I';
for(i=0;i<6;i++){
campo[i][2]=rete;
}
for(i=4;i>=1; i--) /*genera 4 posizioni a caso sul campo*/
{
nx=1+(int)(6*rand()/(RAND_MAX+1.0));
ny=3+rand()%3-6; /*sposto sulle ultime 3 celle*/
campo[nx][ny]=giocator1;
nx=1+(int)(6*rand()/(RAND_MAX+1.0));
ny=rand()%2; /*sposto sulle prime 3 celle*/
campo[nx][ny]=giocator2;
}
for(i=0; i<6; i++)
{for(j=0; j<6; j++)
printf("%c",campo[i][j]);
printf("\n");
}
system("PAUSE");
return 0;
}

ninuzz
27-01-2011, 18:05
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{int j,i,nx,ny;
char giocator1='x'; /*giocatori maglia x*/
char giocator2='o'; /*giocatori maglia o*/
char campo [][6]= {{' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' '}};
srand(time(NULL));
char rete='I';
for(i=0;i<6;i++){
campo[i][2]=rete;
}
i=1;
while(i<=4) /*genera 4 posizioni a caso sul campo*/
{
nx=1+(int)(6*rand()/(RAND_MAX+1.0));
ny=3+rand()%3-6; /*sposto sulle ultime 3 celle*/
if(campo[nx][ny]!='x')
i++;
campo[nx][ny]=giocator1;
}
j=1;
while(j<=4)
{
nx=rand()%6;
ny=rand()%2;
if(campo[nx][ny]!='o') /*sposto sulle prime 3 celle*/
j++;
campo[nx][ny]=giocator2;
}
for(i=0; i<6; i++)
{for(j=0; j<6; j++)
printf("%c",campo[i][j]);
printf("\n");
}
system("PAUSE");
return 0;
}

con svariati test... sono riuscito a mantenere 4 giocatori per ogni squadra:fagiano:

ninuzz
28-01-2011, 17:11
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{int j,i,nx,ny;
char giocator1='x'; /*giocatori maglia x*/
char giocator2='o'; /*giocatori maglia o*/
char campo [][6]= {{' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' '}};
srand(time(NULL));
char rete='I';
for(i=0;i<6;i++){
campo[i][2]=rete;
}
i=1;
while(i<=4) /*genera 4 posizioni a caso sul campo*/
{
nx=1+(int)(6*rand()/(RAND_MAX+1.0));
ny=3+rand()%3-6; /*sposto sulle ultime 3 celle*/
if(campo[nx][ny]!='x')
i++;
campo[nx][ny]=giocator1;
}
j=1;
while(j<=4)
{
nx=rand()%6;
ny=rand()%2;
if(campo[nx][ny]!='o') /*sposto sulle prime 3 celle*/
j++;
campo[nx][ny]=giocator2;
}
for(i=0; i<6; i++)
{for(j=0; j<6; j++)
printf("%c",campo[i][j]);
printf("\n");
}
system("PAUSE");
return 0;
}

con svariati test... sono riuscito a mantenere 4 giocatori per ogni squadra:fagiano:

potete darmi un aiuto o un indizio su come scegliere la squadra che batte la palla:confused: