Codice PHP:
else if(strcmp(buffer,"new")==0)
{
pthread_mutex_lock(&m_pos);
pos = trovaPartitaLibera(battagliaNavale, statistiche.partiteMax);
if(pos == -1)
{
write_socket(fd, "partiteMax\0");
pthread_mutex_unlock(&m_pos);
}
else
{
battagliaNavale[pos].opzioni.statoPartita = ATTESA;
write_socket(fd, "postoOK\0");
pthread_mutex_unlock(&m_pos);
// Legge il nome del campo di Battaglia dal client
read_socket(fd, buffer);
// Controllo se il client si è disconnesso mentre inseriva il combatField
if(strcmp(buffer, "int")==0)
{
pthread_mutex_lock(&m_coda);
eliminaNodo(&coda, fd);
nConnessioni--;
pthread_mutex_unlock(&m_coda);
initGioco(&(battagliaNavale[pos]));
}
else
{
flag = verificaNomePartita(battagliaNavale, statistiche.partiteMax, buffer);
if(flag==0)
{
initGioco(&(battagliaNavale[pos]));
write_socket(fd, "partitaEsistente\0");
}
else
{
write_socket(fd, "partitaNonPresente\0");
while(1)
{
// Controllo se il client si è disconnesso mentre inseriva le opzioni della partita
read_socket(fd, buffer);
if(strcmp(buffer, "int")==0)
{
pthread_mutex_lock(&m_coda);
eliminaNodo(&coda, fd);
nConnessioni--;
pthread_mutex_unlock(&m_coda);
initGioco(&(battagliaNavale[pos]));
}
else
{
write(fd, &(statistiche.durataMax), sizeof(int));
read_socket(fd, buffer);
if(strcmp(buffer, "datiConfermati")==0)
break;
}
}
read(fd, &(battagliaNavale[pos]), sizeof(PARTITA));
dimCampo[pos].componenti = (int*)malloc(battagliaNavale[pos].opzioni.dimensione*sizeof(int));
for(i=0; i<battagliaNavale[pos].opzioni.dimensione; i++)
read(fd, &(dimCampo[pos].componenti[i]), sizeof(int));
dimCampo[pos].dimensioneCampo = (char*)malloc(256*sizeof(char));
calcolaDimensioneCampo(dimCampo[pos].componenti, battagliaNavale[pos].opzioni.dimensione, dimCampo[pos].dimensioneCampo);
read(fd, &(battagliaNavale[pos].players[0]), sizeof(GIOCATORE));
battagliaNavale[pos].players[0].fd = fd;
pthread_mutex_lock(&m_stats);
// Aggiorna il numero di partite in attesa
statistiche.partiteInAttesa++;
pthread_mutex_unlock(&m_stats);
battagliaNavale[pos].opzioni.statoPartita = ATTIVO;
// Aspetta che un avversario entri in partita
while(1)
{
write(fd, &(battagliaNavale[pos].opzioni.statoPartita), sizeof(int));
read_socket(fd, buffer);
if(strcmp(buffer, "int")==0)
{
pthread_mutex_lock(&m_coda);
eliminaNodo(&coda, fd);
nConnessioni--;
pthread_mutex_unlock(&m_coda);
pthread_mutex_lock(&m_stats);
statistiche.partiteInAttesa--;
pthread_mutex_unlock(&m_stats);
initGioco(&(battagliaNavale[pos]));
break;
}
else if(strcmp(buffer, "OK")==0)
break;
}
return 0;
}
}
}
}
Client.c
Codice PHP:
int nuovaPartita(char *combatName)
{
int flag = 0, i;
PARTITA nuova;
initGioco(&nuova);
flag = impostaOpzioni(&nuova, combatName);
if(flag==1)
{
write(sock_fd, &nuova, sizeof(PARTITA));
for(i=0; i<nuova.opzioni.dimensione; i++)
write(sock_fd, &componenti[i], sizeof(int));
write(sock_fd, &nuova.players[0], sizeof(GIOCATORE));
}
return flag;
}
int impostaOpzioni(PARTITA *new, char *combatName)
{
char buffer[4096], combatField[128], fileName[32], *dimensioneCampo = NULL;
int i, flag, durata;
do
{
azzeraStringa(buffer, strlen(buffer));
intestazione(buffer);
printf("%s\n ", buffer);
printf("Creazione Nuova Partita\n ");
printf(" Inserisci il nome del campo di battaglia -> ");
azzeraStringa(combatField, 16);
GetString(combatField, 15);
strcat(combatField, "\0");
printf("\n\n Il campo di battaglia è stato chiamato -> %s", combatField);
flag = chiediConferma();
}while(flag==0);
// Comunica il combatField al server
write_socket(sock_fd, combatField);
azzeraStringa(buffer, strlen(buffer));
// Legge se combatField è una partita valida
read_socket(sock_fd, buffer);
if(strcmp(buffer, "partitaEsistente") == 0)
return 0;
flag = 0;
do
{
azzeraStringa(buffer, strlen(buffer));
intestazione(buffer);
printf("%s\n ", buffer);
printf("Creazione Nuova Partita\n ");
printf(" Inserisci il nome del campo di battaglia -> %s\n\n", combatField);
do
{
azzeraStringa(buffer, strlen(buffer));
printf(" Inserisci il numero di dimensioni del campo di battaglia (MAX 99)-> ");
GetString(buffer, 2);
}
while(atoi(buffer) <= 0);
new->opzioni.dimensione = atoi(buffer);
componenti = (int*)malloc(new->opzioni.dimensione*sizeof(int));
for(i=0; i<new->opzioni.dimensione; i++)
{
do
{
azzeraStringa(buffer, strlen(buffer));
printf("\tOra inserisci il numero di componenti sulla dimensione %d (MAX 10) -> ", i+1);
GetString(buffer, 2);
if(atoi(buffer)<=0 || atoi(buffer)>10)
printf("\n\n\tErrore: il numero di componenti deve essere un intero positivo minore di 10\n\n");
}
while(atoi(buffer)<=0 || atoi(buffer)>10);
componenti[i] = atoi(buffer);
}
do
{
azzeraStringa(buffer, strlen(buffer));
printf(" Bene! Adesso inserisci il numero di navi della flotta -> ");
GetString(buffer, 3);
if(atoi(buffer)<=0)
printf("\n\n\tErrore: il numero di navi delle flotta deve essere un intero positivo\n\n");
}
while(verificaPosto(componenti, new->opzioni.dimensione, atoi(buffer))==0);
new->opzioni.numeroNavi = atoi(buffer);
new->opzioni.naviG1 = new->opzioni.numeroNavi;
dimensioneCampo = (char*)malloc(256*sizeof(char));
dimCampo = calcolaDimensioneCampo(componenti, new->opzioni.dimensione, dimensioneCampo);
campo = (int*)malloc(dimCampo*sizeof(int));
creaCampo(campo, dimCampo);
// Chiede all'utente se creare una flotta "pseudo-casuale" o caricarla da un file esistente
do
{
sprintf(fileName, "flotta%s", combatName);
azzeraStringa(buffer, strlen(buffer));
intestazione(buffer);
printf("%s\n ", buffer);
printf("Creazione Nuova Flotta\n ");
printf(" Vuoi che il programma crei una nuova flotta random e la salvi nel file %s ? [S]ì / [N]o -> ", fileName);
GetString(buffer, 1);
if(buffer[0] == 's' || buffer[0] == 'S')
{
flag = 1;
azzeraStringa(buffer, strlen(buffer));
intestazione(buffer);
printf("%s\n ", buffer);
printf("Creazione Nuova Flotta\n ");
printf(" Sto costruendo la flotta...\n");
creaFlottaRandom(campo, new->opzioni.dimensione, componenti, new->opzioni.numeroNavi, fileName);
azzeraStringa(buffer, strlen(buffer));
intestazione(buffer);
printf("%s\n ", buffer);
printf("Creazione Nuova Flotta\n ");
printf(" La flotta è stata salvata correttamente nel file %s\n", fileName);
}
else if(buffer[0] == 'n' || buffer[0] == 'N')
flag = 2;
if(flag==2)
{
do
{
azzeraStringa(buffer, strlen(buffer));
intestazione(buffer);
printf("%s\n ", buffer);
printf("Creazione Nuova Flotta\n ");
printf(" Inserisci il nome del file contenente la tua flotta -> ");
azzeraStringa(buffer, 16);
GetString(buffer, 15);
strcat(buffer, "\0");
printf("\n\n Il nome del file è questo -> %s", buffer);
flag = chiediConferma();
if(flag==1)
strcpy(fileName, buffer);
}while(flag==0);
flag = acquisisciFlotta(campo, new->opzioni, componenti, fileName);
if(flag == -1)
{
printf("\n Il file \"%s\" non esiste!\n\t-> Premere un tasto per inserire un nuovo nome file\n", fileName);
GetString(buffer, 1);
}
else if(flag == -2)
{
printf("\n Il file \"%s\" non è conforme alle opzioni della partita!\n", fileName);
printf("\t-> Assicurati che il file abbia %d righe, ognuna con %d coordinate, separate da uno \"spazio\"\n", new->opzioni.numeroNavi, new->opzioni.dimensione);
printf("\t-> Correggere la flotta \"%s\" e premere un tasto per inserire nuovamente il nome file\n\n", fileName);
GetString(buffer, 1);
}
else if(flag > 0)
{
printf("\n Le coordinate della nave in riga %d non rispettano le opzioni della partita!\n\t-> Correggere le coordinate e premere un tasto per reinserire il nome file\n", flag);
GetString(buffer, 1);
}
}
}while(flag!=1 && flag!=0);
strcpy(new->players[0].combatName, combatName);
new->players[0].naviRestanti = new->opzioni.numeroNavi;
strcpy(new->opzioni.combatField, combatField);
strcpy(new->opzioni.combatNameG1, new->players[0].combatName);
strcpy(new->opzioni.combatNameG2, "Nessuno\0");
write_socket(sock_fd, "datiMemorizzati\0");
read(sock_fd, &durata, sizeof(int));
new->opzioni.tempoRestante = durata;
stampaOpzioni(new->opzioni, dimensioneCampo, buffer, 0);
printf("\n\n%s\n\n", buffer);
flag = chiediConferma();
if(flag==0)
{
free(campo);
free(componenti);
free(dimensioneCampo);
write_socket(sock_fd, "datiNonConfermati\0");
}
else
write_socket(sock_fd, "datiConfermati\0");
}while(flag==0);
opzioni = new->opzioni;
return 1;
}
Aspetto nuove...