Ara pràcticament funciona... com a mínim no dóna problemes de compilació i s'executa... hi hha algún error en la distribució dels barcos crec, però ara ja és lo de menys... el problema que donava, com no, era per una idiotesa, que jo encara no entenc :| (posar els parametres ( --> void prova_ple(int tcom[10][10], int max); ) quan les altres no es queixen pas :|
 
Si algú em pogués explicar com funcionen els punters i com en podria posar algun, en especial amb l'struct, estaria agraït :)
O si hi ha alguna idea sobre com millorar la gestió dels barcos.
 
 
 
#include<stdio.h>
#include<time.h>
#include<windows.h>
#include<conio.h>
 int tamanys[13]={4,3,3,2,2,2,1,1,1,1,1,1,1}; //tamany dels barcos a colocar.
 int valors[13]={11,12,12,13,13,13,5,5,5,4,4,4,4}; //valor que li donarem als barcos-mines segons l'array 'tamany'
bool colocar;
 int x,y,z;
  struct varco{
  int eixx[5];
 int eixy[5];
 }posvarcos[6];
 
void genera_llavor_aleatori(){
time_t temps;
  int sem;
  temps=time( NULL );
     sem=(int) temps % 5000;
     srand(sem);
}
int genera_aleatori_0_a_9(){
int num;
  num=rand()%10;
  return num;
}
 int genera_aleatori_0_a_1(){
 int num;
  num=rand()%2;
  return num;
}
void modifica_color (int color){
  HANDLE h;
      h = GetStdHandle(STD_OUTPUT_HANDLE);
      SetConsoleTextAttribute (h,color);
}
 
void mostra_tauler ();
void comprova ();
void prova_ple(int tcom[10][10], int max);
void genera_tauler ();
void llegenda ();
void genera_barco();
void inicia_matrius();
 

void inicia_matrius(int miniciar[10][10]){
int i,j;
     for (i=0; i<=9; i++)
     { if (i<6) //6 numero barcos de més duna posició
   {posvarcos[i].eixx[4]=tamanys[i]; //eixx[4] = nombre de posicions 'no tocades' del vaixell.
          posvarcos[i].eixy[4]=tamanys[i]; //eixy[4]= nombre de posicions del vaixell.
    }  
  
    for (j=0; j<=9; j++)
       {miniciar[i][j]=0;}
     }
}
 
void genera_barco(int vgenerar[10][10], int max){
 int j=0;
 
  while (j<tamanys[max])
  {
    vgenerar[x][y]=valors[max];
    if (max<=5)                    //si màx és menor/igual a 5, serà barco de vàries posicions, pel que també donarem valors a l'Struct de les posicions emprades.
         {
       posvarcos[max].eixx[j]=x;
         posvarcos[max].eixy[j]=y;   
         }   
    if (z==0)
      {x++;}
    else {y++;}
    j++;
  }
}
 
void llegenda (int punts){
   printf("\n\n   Tens %d punts!!!\n\n ",punts);
      modifica_color(BACKGROUND_RED); printf(" ");
      modifica_color(FOREGROUND_GREEN|FOREGROUND_RED|FOREGROUND_BLUE); printf(" Aigua\n ");
   modifica_color(BACKGROUND_GREEN); printf(" ");
      modifica_color(FOREGROUND_GREEN|FOREGROUND_RED|FOREGROUND_BLUE); printf(" Tocat\n "); 
      modifica_color(BACKGROUND_GREEN|BACKGROUND_RED|BACKGROUND_BLUE); printf(" ");
      modifica_color(FOREGROUND_GREEN|FOREGROUND_RED|FOREGROUND_BLUE); printf(" Enfonsat\n ");                  
      modifica_color(BACKGROUND_BLUE); printf(" ");
      modifica_color(FOREGROUND_GREEN|FOREGROUND_RED|FOREGROUND_BLUE); printf(" Posicio no probada\n\n");
}
 
void genera_tauler(int tgenerat[10][10]){
 int i=0, lmaxim=0;
     genera_llavor_aleatori();
 
     while (lmaxim<=12)  //total barcos
       {x=genera_aleatori_0_a_9();
        y=genera_aleatori_0_a_9();
  z=genera_aleatori_0_a_1();
  i=0;
  colocar=true;
  prova_ple(tgenerat, lmaxim);
 
  if (colocar==true)
  {genera_barco(tgenerat, lmaxim);
   lmaxim++;}
   }
 
    //  printf("x= %d y= %d \n",i,j);  //mode trampes
}
 
void prova_ple(int tcom[10][10], int max){
 int j=1;
  while (j<=tamanys[max])
  {
   if (tcom[x][y]!=0 || x>9 || y>9)
   {j=20; colocar=false;}
    if (z==0)
      {x++;}
    else {y++;}
    j++;
  }
}
 
void comprova(int taula[10][10], int posa, int posb){
 int i;
 int n=taula[posa][posb]-6;
 if (posvarcos[n].eixx[4]==1)
  { for(i=0; i<=(posvarcos[n].eixy[4]-1); i++)
    {taula[posvarcos[n].eixx[i]][posvarcos[n].eixy[i]]=3;} 
  }
 else
 {  posvarcos[n].eixx[4]=posvarcos[n].eixx[4]-1;
    taula[posa][posb]=2; 
 }
}
 
void mostra_tauler(int matriu[10][10]){
   int i, j;
      printf("   0123456789 x\n");
      for (i=0; i<=9; i++)
         {modifica_color(FOREGROUND_GREEN|FOREGROUND_RED|FOREGROUND_BLUE);
         printf(" %d ",i);
          for (j=0; j<=9; j++)
          {if (matriu[i][j]==0 || matriu[i][j]<=4){ //res o barco amagat
                  modifica_color(BACKGROUND_BLUE);}
            if (matriu[i][j]==1){ //fallada/aigua
                  modifica_color(BACKGROUND_RED);}
     if (matriu[i][j]==2){ //tocat barco 1 ò més posicions
               modifica_color(BACKGROUND_GREEN);}
            if (matriu[i][j]==3){ //enfonsat barco 1 ò més posicions
                  modifica_color(BACKGROUND_GREEN|BACKGROUND_RED|BACKGROUND_BLUE);}
    printf("_");
       }
       printf("\n");
      }
      modifica_color(FOREGROUND_GREEN|FOREGROUND_RED|FOREGROUND_BLUE);
      printf(" y \n\n");
}
 
int main()
{int taulell[10][10];
 int i=0,j=0, compro=0, marcador=0;
 
//0=aigua; 1=fallat; 2=tocat; 3=enfonsat; 4=mina;  5=barco una posició;
//6=barco 4 posicios
//7=8=barco 3 posicions
//9=10=11=barco 2 posicions
 

inicia_matrius(taulell);
 
 genera_tauler(taulell);
 //inici joc
   while (compro!=20)
    {
      llegenda(marcador);
      mostra_tauler(taulell);
 //pregunta
      printf("En quina posicio vols provar sort?\n\n Eix x: ");
      scanf("%d",&j);
      printf("\n Eix y: ");
      scanf("%d",&i);
 //sortida
       if (j>9 || j<0 || i>9 || i<0 || compro==20 || taulell[i][j]==4){
           compro=20;}
 //resposta
      else {
          
            if (taulell[i][j]==0){ //aigua
                taulell[i][j]=1;
                marcador=marcador+10;
             printf("\nAigua\n");}
            else if (taulell[i][j]<4) //encert
     {
       if (taulell[i][j]!=5)
           {comprova(taulell,i,j);}
       else
           {taulell[i][j]=3;}
 
       if (taulell[i][j]==2){ //tocat
        printf("\nTocat!\n");}
       else
       {printf("\nEnfonsat!\n");}
                compro++;
     }
            else if (taulell[i][j]==2 || taulell[i][j]==3 || taulell[i][j]==4){ //re-seleccionat
             printf("\nJa hi havies disparat!\n");}
            printf("\n\n continuar...");
           }
      fflush(stdin); getch(); system("cls");     
    }
 printf("\n\nHas enfonsat %d vaixell/s i has tingut %d punts\n\n Prem qualsevol tecla per a sortir.\n",compro,marcador);
}
_______________________________________________
llista de correu de l'Internauta
llista@internauta.net
http://zeus.internauta.net/mailman/listinfo/internauta

Respondre per correu electrònic a