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