Se suposa que hi ha 5 tipus de barco:
4 -d'una posició
3- de dos posicions
2- de tres posicions
1- de quatre posicions
a més, 3 mines d'una posició (que fan sortir del joc).
 
Llavors, el tauler és de color:
blau - no disparat
vermell - aigua
verd - tocat
blanc - enfonsat (no sé si el blanc és com l'he posat, però això és el de menys.
 
El meu nivell és tant alt que ni sé ben bé com funcionen els punters (i teòricament els hauria d'usar aquí xD bé, n'uso un, però ni sé si funcionarà jeje).
 
També s'accepten idees de com millorar-ho :D
 
 
#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,4,4,4,4,5,5,5}; //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();
void genera_tauler ();
void llegenda ();
void genera_barco();
void inicia_matrius();
 

void inicia_matrius(int miniciar[10][10]){
varco *siniciar;
int i,j;
     for (i=0; i<=9; i++)
     { if (i<6) //6 numero barcos de més duna posició
   {(siniciar+i)->eixx[4]=tamanys[i]; //eixx[4] = nombre de posicions 'no tocades' del vaixell.
          (siniciar+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]<=4 || x>9 || y>9)
   {j=20; colocar=false;}
    if (z==0)
      {x++;}
    else {y++;}
    j++;
  }
}
 
void comprova(int taula[10][10], int n){
 int i;
 n=n-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[x][y]=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=barco una posició; 5=mina;
//6=barco 4 posicios
//7=8=barco 3 posicions
//9=10=11=barco 2 posicions
 
inicia_matrius(taulell);
 /*
 fer eixos a 5/5?
 
 en cada eix una posició de la matriu on hi ha el baixell.
 s'hauria de deixar constància del numero de posicions de cada vaixell
 s'hauria de deixar constància del número de posicions encertades.
 
 comprovar si està a zero després d'haver-se restat l'encert.
 
 */
 
 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]==5){
           printf("\n\nHas enfonsat %d vaixell/s i has tingut %d punts\n\n Prem qualsevol tecla per a sortir.\n",compro,marcador);
           compro=20;}
 //resposta
      else {
          
            if (taulell[i][j]==1){ //aigua
                taulell[i][j]=3;
                marcador=marcador+10;
             printf("\nAigua\n");}
            else if (taulell[i][j]==0){ //encert
                taulell[i][j]=2;
                compro++;
                printf("\nEnfonsat!!\n");}
            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");     
    }
}
_______________________________________________
llista de correu de l'Internauta
[email protected]
http://zeus.internauta.net/mailman/listinfo/internauta

Respondre per correu electrònic a