/* * Questo programma realizza una versione semplificata del gioco della battaglia navale * L'utente puo' scegliere dimensioni della griglia e numero di navi. * Le navi sono grandi una sola casella della griglia e sono posizionate in maniera random sia per utente che cpu * Una griglia e rappresentata come una matrice di caratteri * - il carattere o rappresenta una nave * - il carattere n rappresenta una casella vuota * - il carattere y rappresenta una nave colpita * - il carattere x rappresenta una casella vuota colpita * * Se l'utente chiede di colpire una casella al di fuori della griglia il programma salva lo stato della partita e termina. * Se alla partenza il programma trova una partita salvata carica le matrici e continua la partita precedente, * altrimenti chiede all'utente le dimensioni e il numero di navi per iniziare una nuova partita. */ #include <stdio.h> #include <stdlib.h> #include <time.h> #define NMAX 50 void inzializza(char m[NMAX][NMAX], int r,int c, int navi ); void stampa(char mu[NMAX][NMAX], char cpu[NMAX][NMAX], int r, int c); void salvapartita(char mu[NMAX][NMAX], char cpu[NMAX][NMAX], int r, int c); int caricapartita(char mu[NMAX][NMAX], char cpu[NMAX][NMAX], int *r, int *c); int playutente(char m[NMAX][NMAX], int r, int c); void playcpu(char m[NMAX][NMAX], int r, int c); //controlla il numero di navi non affondate int check(char m[NMAX][NMAX], int r, int c); int main(int argc, char **argv) { int r,c, navi; char mu[NMAX][NMAX], cpu[NMAX][NMAX]; srand(time(NULL)); if(!caricapartita(mu,cpu,&r,&c)) { printf("inserisci le dimenstione delle matrici:\n"); scanf("%d %d",&r,&c); printf("inserisci il numero di navi:\n"); scanf("%d",&navi); inzializza(mu,r,c,navi); inzializza(cpu,r,c,navi); } int continua =1; do{ if(playutente(cpu,r,c)){ //fa giocare l'utente //se playutente ritorna 1 (ovvero l'utente ha inserito una posizione valida) // controlla se ci sono navi da affondare per l'utente if(check(cpu,r,c)>0) { //se ci sono navi da affondare fa giocare la cpu playcpu(mu,r,c); stampa(mu,cpu,r,c); printf("\n"); //controlla che ci sono navi da affondare per la cpu if(check(mu,r,c)==0){ continua=0; printf("ha vinto la cpu\n"); } } else //non ci sono navi da affondare per l'utente { printf("hai vinto!!!\n"); continua=0; } } else{ //playutente ritorna 0 perchè l'utente non ha inserito una posiziona valida salvapartita(mu,cpu,r,c); continua=0; } }while(continua); } int check(char m[NMAX][NMAX], int r, int c) { int navi=0; for(int i=0;i<r;i++) for(int j=0;j<c;j++) if(m[i][j]=='o') navi++; return navi; } int playutente(char m[NMAX][NMAX], int r, int c) { int i,j; printf("inserisci coordinate(x<%d e y< %d):\n",r,c); scanf("%d %d",&i,&j); if((i<r) && (j<c)){ if(m[i][j]=='o') m[i][j]='y'; else if(m[i][j]=='n'){ m[i][j]='x'; } return 1; } return 0; } void playcpu(char m[NMAX][NMAX], int r, int c) { int i,j; do{ i=rand()%r; j=rand()%c; }while(m[i][j]=='x' || m[i][j]=='y' ); printf("cpu sceglie %d,%d\n",i,j); if(m[i][j]=='o') m[i][j]='y'; else if(m[i][j]=='n') m[i][j]='x'; } int caricapartita(char mu[NMAX][NMAX], char cpu[NMAX][NMAX], int *r, int *c) { FILE *fp=fopen("partita","r"); if(fp!=NULL) { fread(r,sizeof(int),1,fp); fread(c,sizeof(int),1,fp); fread(mu,sizeof(char),NMAX*NMAX,fp); fread(cpu,sizeof(char),NMAX*NMAX,fp); fclose(fp); remove("partita"); return 1; } else return 0; } void salvapartita(char mu[NMAX][NMAX], char cpu[NMAX][NMAX], int r, int c) { FILE *fp=fopen("partita","w"); if(fp!=NULL) { fwrite(&r,sizeof(int),1,fp); fwrite(&c,sizeof(int),1,fp); fwrite(mu,sizeof(char),NMAX*NMAX,fp); fwrite(cpu,sizeof(char),NMAX*NMAX,fp); fclose(fp); } } void inzializza(char m[NMAX][NMAX], int r,int c, int navi ) { for(int i=0;i<r;i++) for(int j=0;j<c;j++) m[i][j]='n'; for(int i=0; i<navi;i++) { //generazione navi utente int x,y; do{ x=rand()%r; y=rand()%c; }while(m[x][y]=='o'); m[x][y]='o'; } } void stampa(char mu[NMAX][NMAX], char cpu[NMAX][NMAX], int r, int c) { printf("Griglia Utente:\n"); for(int i=0;i<r;i++) { printf("\n"); for(int j=0;j<c;j++) printf("%c\t",mu[i][j]); } printf("\n"); printf("Griglia CPU:\n") for(int i=0;i<r;i++) { printf("\n"); for(int j=0;j<c;j++) if(cpu[i][j]!='o') printf("%c\t",cpu[i][j]); else printf("n\t"); } }