Pagina 3 di 3 primaprima 1 2 3
Visualizzazione dei risultati da 21 a 25 su 25
  1. #21
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    33
    Originariamente inviato da MegaAlchimista
    Buh prova a sostituire quello con
    codice:
    for (i=0;i<20 || navi_distrutte>=12;i++) 	{
    Magari per qualche motivo ne salti una, ne aggiungi una in più... Meglio mettere >=Così sei sicuro
    Risolto, ora il progetto è quasi completato, mancano alcuni bug, ad esempio, se l'utente immette caratteri minuscoli e non maiuscoli, come dovrebbe.
    Quando spawna le navi, va a capo, se una nave è a fine bordo, il carattere, per non uscire fuori, va a capo..
    opzioni?

  2. #22
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    33
    Header:
    codice:
    //Librerie
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <Windows.h>
    //Define
    #define LatoGriglia 10 //Righe e colonne della griglia
    #define navi3 3 //navi3 celle
    #define navi4 4 //navi4 celle
    #define navi5 5 //navi5 celle
    //Struct
    struct mosse {
    	char mossaRiga;
    	int mossaColonna;
    };
    /*PROTOTIPI*/
    void grid_printer(int[][LatoGriglia],char[]); //stampa a video la griglia
    void spawn_navi(int[][LatoGriglia]); //genera numeri casuali per le coordinate delle navi e le dispone sulla griglia
    int RandInt(int,int); //numeri random
    void legge_attacco(char *,int *); //legge coordinate del punto di attacco
    void controllo_griglia(char,int,int[][LatoGriglia],int *); //controllo spazi della griglia
    void stato_prec(char,int,int[][LatoGriglia]); //print stato precedente
    Main:
    codice:
    #include "Header.h" //Libreria
    void main()
    {
    	/*INIZIALIZZAZIONE*/
    	//inizializzazione campo da gioco griglia 10x10
    	char attRiga;
    	char lettere[10]={'A','B','C','D','E','F','G','H','I','L'}; //vettore di char per l'indice di riga della griglia
    	//int nave3[3]={3,3,3},nave4[4]={4,4,4,4},nave5[5]={5,5,5,5,5}; //vettori per le varie celle delle navi
    	int navi_distrutte=0,tentativi=0,attColonna;
    	//mosse *m[20];
    	int grid[LatoGriglia][LatoGriglia]={{0,0,0,0,0,0,0,0,0,0},
    										{0,0,0,0,0,0,0,0,0,0},
    										{0,0,0,0,0,0,0,0,0,0},
    								   	    {0,0,0,0,0,0,0,0,0,0},
    								        {0,0,0,0,0,0,0,0,0,0},
    										{0,0,0,0,0,0,0,0,0,0},
    										{0,0,0,0,0,0,0,0,0,0},
    										{0,0,0,0,0,0,0,0,0,0},
    										{0,0,0,0,0,0,0,0,0,0},
    										{0,0,0,0,0,0,0,0,0,0}
    										};
    	srand((unsigned int)time(NULL)); //set del seed
    	printf("**********************************\n");
    	printf("***      BATTAGLIA NAVALE      ***\n");
    	printf("**          Created By          **\n");
    	printf("**        Davide Santoro        **\n");
    	printf("**********************************\n\n\n\n");
    	_sleep(500);
    	printf("*****      Game Started      *****\n\n");
    	printf("***         Obiettivo:        ***\n");
    	printf("** Distruggere le navi nemiche. **\n");
    	printf("** 20 Tentativi a disposizione. **\n\n");
    	spawn_navi(grid); //disporre casualmente le navi
    	printf("   ** Navi nemiche apparse. **\n");
    	do {
    		tentativi++;
    		printf("\t * Tentativo %d *\n       * Navi distrutte: %d *\n\n",tentativi,navi_distrutte);
    		grid_printer(grid,lettere);
    		legge_attacco(&attRiga,&attColonna); //chiamata alla scanf per le coordinate di attacco
    		controllo_griglia(attRiga,attColonna,grid,&navi_distrutte); //controlla la griglia, e incrementa il contatore(navi_distrutte) se si è colpita una cella con una nave
    		grid_printer(grid,lettere);
    		system("Pause");
    		printf("\n\n\n\n\n\n\n");
    		stato_prec(attRiga,attColonna,grid);
    	} while (!(tentativi >= 20 || navi_distrutte >= 12));
    	if (navi_distrutte==12) printf("\n\n*** Complimenti: You Win. ***\n\n");
    	else if (tentativi==20) printf("\n\n* Game Over: Hai Perso. *\n\n");
    	else printf("\n\nErrore\n\n");
    	system("Pause");
    }
    Risorse:
    codice:
    #include "Header.h"
    //Procedura per stampare la griglia
    void grid_printer(int grid[][LatoGriglia],char lettere[])
    {
    	int i,j;
    	for (i=0;i<LatoGriglia;i++)
    		printf("%3d",i+1);
    	for (i=0;i<=LatoGriglia;i++)
    	{
    	  if (i<10)
    		{
    			printf("\n%-1c",lettere[i]);
    		}
          for (j=0;j<LatoGriglia;j++)
    	  {
    		  if (grid[i][j]==0)
    		  {
    			  printf(" _ "); //vuoto
              }
    		  else if(grid[i][j]==1)
    		  {
    			  printf(" X "); //colpito nave A
    		  }
    		  else if(grid[i][j]==2)
    		  {
    			   printf(" O "); //acqua
    		  }
    		  else if(grid[i][j]==3)
    		  {
    			  printf(" A "); //nave 1
    		  }
    		  else if(grid[i][j]==4)
    		  {
    			  printf(" B "); //nave 2
    		  }
    		  else if(grid[i][j]==5)
    		  {
    			  printf(" C "); //nave 3
    		  }
    		  else break;
    	  }
    	  if (i<10)
    		printf("|");
    	}
    	printf("\n\n");
    }
    //Procedura per disporre le navi sulla griglia
    void spawn_navi(int grid[][LatoGriglia])
    {
    	int direzione=0,tmpRiga,tmpColonna,cella,i=0;
    	//Ciclo per 3 navi
    	for (i=navi3;i<=navi5;i++)
    	{
    		direzione=RandInt(0,1); //spawn della direzione
    		switch (direzione) //controllo direzione
    		{
    		case 0:  //nave in verticale
    			tmpRiga=RandInt(0,LatoGriglia-1); //spawn riga normalmente
    			tmpColonna=RandInt(0,LatoGriglia-i-1); //spawn colonna meno celle grandezza della nave per non uscire fuori dalla griglia
    			for (cella=0;cella<i;cella++) //mettere le coordinate nella griglia
    			{
    				if (grid[tmpRiga][tmpColonna]==i) //se la cella è occupata da un'altra nave(identifacata dall'indice esterno del FOR(3,4,5)
    				{
    					grid[tmpRiga+1][tmpColonna]=i; //spostarsi di una colonna
    					tmpColonna++;
    				}
    				else
    				{
    					grid[tmpRiga][tmpColonna]=i;
    					tmpColonna++;
    				}
    			}
    			break;
    		case 1: //nave in orizzontale
    			tmpRiga=RandInt(0,LatoGriglia-i-1); //spawn righe meno celle della grandezza nave
    			tmpColonna=RandInt(0,LatoGriglia-1); //spawn colonne regolarmente
    			for (cella=0;cella<i;cella++) //mettere le coordinate nella griglia
    			{
    				if (grid[tmpRiga][tmpColonna]==i) //se la cella è occupata da un'altra nave(identifacata dall'indice esterno del FOR(3,4,5)
    				{
    					grid[tmpRiga][tmpColonna+1]=i; //spostarsi di una riga
    					tmpColonna++;
    				}
    				else
    				{
    					grid[tmpRiga][tmpColonna]=i;
    					tmpColonna++;
    				}
    			}
    			break;
    		}
    	}
    }
    //Numeri Random
    int RandInt(int a,int b)
    {
    	return a + rand() % (b - a + 1);
    }
    //Procedura per leggere le coordiante del punto di attacco
    void legge_attacco(char *attRiga, int *attColonna)
    {
    	fflush(stdin); //Pulisce immissione di tastiera
    	printf("Inserire le coordinate (Riga,A..L)(Colonna,1..10): ");
    	scanf("%c%d",attRiga,attColonna);
    	printf("\n");
    }
    void controllo_griglia(char attRiga,int attColonna,int grid[][LatoGriglia],int *navi_distrutte)
    {
    	int ind = (int)attRiga - 65; //controlla l'ASCII di attRiga, e confrontalo con il l'ASCII di 'A' = 65
    	attColonna-=1;
    	switch (grid[ind][attColonna])
    	{
    	case 3:
    		grid[ind][attColonna]=1; //Colpito
    		printf("\n** Attacco in %c:%d **\n* Prima Nave distrutta *\n\n",attRiga,attColonna+1);
    		*navi_distrutte++;
    		break;
    	case 4:
    		grid[ind][attColonna]=1; //Colpito
    		printf("\n** Attacco in %c:%d **\n* Seconda Nave distrutta *\n\n",attRiga,attColonna+1);
    		*navi_distrutte++;
    		break;
    	case 5:
    		grid[ind][attColonna]=1; //Colpito
    		printf("\n** Attacco in %c:%d **\n* Terza Nave distrutta *\n\n",attRiga,attColonna+1);
    		*navi_distrutte++;
    		break;
    	case 0:
    		grid[ind][attColonna]=2; //Acqua
    		printf("\n** Attacco in %c:%d **\n*** Acqua ***\n\n",attRiga,attColonna+1);
    		break;
    	case 1:
    		grid[ind][attColonna]=1; //Colpito già
    		printf("\n** Attacco in %c:%d **\n*** Nave gia' distrutta ***\n\n",attRiga,attColonna+1);
    		break;
    	case 2:
    		grid[ind][attColonna]=2; //Acqua già
    		printf("\n** Attacco in %c:%d **\n*** Acqua: Punto gia' colpito ***\n\n",attRiga,attColonna+1);
    		break;
    	}
    }
    void stato_prec(char attRiga,int attColonna,int grid[][LatoGriglia])
    {
    	int ind = (int)attRiga - 65;
    	attColonna-=1;
    	switch (grid[ind][attColonna])
    	{
    	case 1: //Colpo centrato: Nave distrutta
    		printf("\n** Mossa precedente: Attacco in %c:%d **\n*** Nave Distrutta ***\n\n",attRiga,attColonna+1);
    		break;
    	case 2: //Colpo precedente: Acqua
    		printf("\n** Mossa precedente: Attacco in %c:%d **\n*** In Acqua ***\n\n",attRiga,attColonna+1);
    		break;
    	default: //Già effettuato
    		printf("\n** Mossa precedente: Attacco in %c:%d **\n*** Attacco precedente gia' effettuato. ***\n\n",attRiga,attColonna+1);
    	}
    }

  3. #23
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    33
    risolto il problema delle maiuscole e minuscole,
    ora c'è solo quello che ogni tanto va a capo, quando spawna la nave, una cella va a capo, pur avendo messo, che quando randomizza i numeri, escono fino ad un massimo (per riga o colonna) della lunghezza griglia-1-le cifre della nave..
    c'è un modo???
    poi avrei un'altro problema, ho messo un contatore, navi_distrutte, dichiarato nel main, inizializzato a 0, e passato come parametro alla void function controllo_griglia, tramite puntatore, perchè ne cambia il valore, e richiamato poi nel main con &, per l'indirizzo di memoria, però quando io vado ad incrementare se una nave viene distrutta, il valore non si incrementa, ma esce un valore strano...
    secondo il debug
    è l'indirizzo di memoria: 0x0088f714{0}
    quando viene incrementato per la nave distrutta esce: 0x0088f714{-858993460}
    Prototipo dichiarato in header:
    codice:
    void controllo_griglia(char,int,int[][LatoGriglia],int *);
    Chiamata nella function:
    codice:
    void controllo_griglia(char attRiga,int attColonna,int grid[][LatoGriglia],int *navi_distrutte)
    {
    	int ind = (int)attRiga - 65; //controlla l'ASCII di attRiga, e confrontalo con il l'ASCII di 'A' = 65
    	attColonna-=1;
    	switch (grid[ind][attColonna])
    	{
    	case 3:
    		grid[ind][attColonna]=1; //Colpito
    		printf("\n** Attacco in %c:%d **\n* Prima Nave distrutta *\n\n",attRiga,attColonna+1);
    		*navi_distrutte++;
    		break;
    //...continua con gli altri casi
    Main:
    codice:
    	int navi_distrutte=0,tentativi=0,attColonna;
    //continua...
    	do {
    		tentativi++;
    		printf("\t * Tentativo %d *\n       * Navi distrutte: %d *\n\n",tentativi,navi_distrutte);
    		grid_printer(grid,lettere);
    		legge_attacco(&attRiga,&attColonna); //chiamata alla scanf per le coordinate di attacco
    		controllo_griglia(attRiga,attColonna,grid,&navi_distrutte); //controlla la griglia, e incrementa il contatore(navi_distrutte) se si è colpita una cella con una nave
    		grid_printer(grid,lettere);
    		system("Pause");
    		printf("\n\n\n\n\n\n\n");
    		stato_prec(attRiga,attColonna,grid);
    	} while (!(tentativi >= 20 || navi_distrutte >= 12));
    	if (navi_distrutte==12) printf("\n\n*** Complimenti: You Win. ***\n\n");
    	else if (tentativi==20) printf("\n\n* Game Over: Hai Perso. *\n\n");
    	else printf("\n\nErrore\n\n");

  4. #24
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    33
    risolto

  5. #25
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    33
    risolto quasi, manca solo un piccolo problema, nello spawn delle navi. A volte una delle 3 navi, o esce con una cella in più, o in meno, o non esce proprio. Ho anche risolto i problema delle navi, adesso sono 3 da distruggere, e ognuna ha varie celle, solo che se per caso ad una simulazione non spawn tutte le navi, poi non può nemmeno finire vincendo la partita.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.