Data de publicació: Jan 31, 2012 6:23:44 PM
#include <stdio.h>
/*********************************/
/* Constants globals */
/*********************************/
#define TABF 15
#define TABC 10
#define msg_TOC 0
#define msg_AIG 1
#define msg_ENF 2
/*Número màxim de vaixells*/
#define NVA 4
/*Identificació al taulell de Mar o de Tocat*/
#define MAR 100
#define TOC 200
/* Símbols representació*/
#define smb_BLO 'V'
#define smb_MAR '-'
#define smb_TOC '*'
/*********************************/
/* Variables globals */
/*********************************/
int T[TABF][TABC];
int msg_ESTAT;
/*Num blocs de cada vaixell*/
int NBV[NVA];
/*Nombre de vaixells. Sempre per sota de NVA*/
int num_vaixells;
/*********************************/
/* Funcions globals */
/*********************************/
int ini_taullell();
int ubi_vaixell();
int imp_taulell();
int imp_estat(int estat);
int _es_vaixell(int);
/*Deprecated*/
int imp_taulell_low_level();
/*********************************/
/* Programa principal */
/*********************************/
int main(){
int i,j, fil, col;
int ok;
ini_taulell();
ubi_vaixell();
imp_taulell();
/*Jugar*/
while (1){
ok = 0;
while (!ok) {printf("Dona'm fil: [0,%d]",TABF-1); scanf("%d",&fil); ok = ((fil >= 0) && ( fil < TABF));};
ok = 0;
while (!ok) {printf("Dona'm col: [0,%d]",TABC-1); scanf("%d",&col); ok = ((col >= 0) && ( col < TABC));};
if ( _es_vaixell( T[fil][col] ) ){
/*Decrementar en 1 el nombre de blocs del vaixell*/
NBV[ T[fil][col] ] = NBV[ T[fil][col] ] - 1;
/*Determinar si el vaixell està tocat o enfonsat*/
if ( NBV[ T[fil][col] ] <= 0 ) {msg_ESTAT = msg_ENF; num_vaixells--;} else msg_ESTAT = msg_TOC;
/*Marcar la posició com tocada*/
T[fil][col] = TOC;
}
/*Si no és vaixell, és aigua...*/
else msg_ESTAT = msg_AIG;
/*Imprimim el nou taulell*/
imp_taulell();
/*Mostrem missatge amb el que ha passat*/
imp_estat(msg_ESTAT);
if (num_vaixells <= 0) {printf("\n\n FINAL PARTIDA: TOTS ELS VAIXELLS ENFONSATS!!!\n\n");return(0);}
}
}
/*********************************/
/* Implementació de funcions */
/*********************************/
int ubi_vaixell(){
/*Ubica vaixell 00*/
T[1][1] = 0;
T[1][2] = 0;
T[1][3] = 0;
NBV[0] = 3;
/*Ubica vaixell 01*/
T[2][1] = 1;
T[2][2] = 1;
T[2][3] = 1;
NBV[1] = 3;
num_vaixells = 2;
return(0);
}
int ini_taulell(){
int i, j;
/*Inicialitza taulell.Tot el taulell marcat com aigua amb MAR.*/
for (i=0;i<TABF;i++) for (j=0;j<TABC;j++) T[i][j]= MAR;
return(0);
}
int imp_taulell(){
int i, j;
system("clear");
printf("\n\n");
for (i=0;i<TABF;i++) {
/*Imprimeix el número de fila modul 10*/
printf("\t%d ",i%10);
/*Imprimeix totes les columnes de la fila*/
for (j=0;j<TABC;j++)
switch ( T[i][j] ){
case MAR: printf("\t%c ", smb_MAR);
break;
case TOC: printf("\t%c ", smb_TOC);
break;
default: if ( _es_vaixell( T[i][j] ) ) printf("\t%c ", smb_BLO);
break;
}
printf("\n");
}
printf("\n\t");
/*Imprimeix el número de cada columna modul 10*/
for (j=0;j<TABC;j++) printf("\t%d ",j);
printf("\n\n");
return(0);
}
int imp_estat(int estat){
switch(estat){
case msg_TOC: printf("TOCAT!!!\n");
break;
case msg_AIG: printf("AIGUA!!!\n");
break;
case msg_ENF: printf("ENFONSAT!!!\n");
break;
default: break;
}
return(0);
}
int _es_vaixell(int block){
/*Retorna un 1 (true) si a la cel·la hi ha un bloc de vaixell*/
return (( block >= 0 ) && ( block < NVA ));
}
int imp_taulell_low_level(){
/*Funció que mostra els valor reals del taulell. Es pot esborrar.
Resta aquí per fer proves, si voleu*/
int i, j;
system("clear");
for (i=0;i<TABF;i++) {
for (j=0;j<TABC;j++) printf("\t%d ",T[i][j]);
printf("\n");
}
}