Oppure

Loading
06/01/10 12:04
Alby_c84
Ciao a tutti...I need a little help...
sto programmando la battaglia navale in C come compito di fine corso all'uni ma mi sono bloccato perchè mi si incrociano le navi.
In pratica ho dichiarato una struttura struct Ship, generale per ogni nave con campi lenght, x e y (coordinate del punto di partenza della nave) e direction (0= orizz e 1= vert) e un puntatore a tale struttura. Poi ho dichiarato una struttura Player (contenente come campi struct Ship portaerei, struct Ship corazzata ecccc) e due variabili di tipo struct Player. Tutto ciò globale.
Nel main chiamo una funzione a cui passo il puntatore a Ship e l'indirizzo delle variabili Struct Player. nella funzione essendo 8 le navi in gioco alloco memoria per un vettore di struct Ship di 8 elementi e lo riempio creando a caso dei valori di direction, x e y per ogni nave e poi copio ogni elemento del vettore nella relatiova "nave" di ogni giocatore. la funzione rende un puntatore alla prima locazione di memoria allocata. Questo è preso in ingresso da un altra funzione che scorre il vettore e disegna le navi partendo dalle coordinate x y del punto di partenza e stampando verso destra se è orzzontale o verso il basso se è verticale. Sono riuscito a fare in modo che le navi abbiano tutte punti di partenza diversi (che elimina il problema delle navi a "lancette i orologio";), ma ogni tanto mi si incrociano!! la cosa più logica sarebbe un contrllo del tipo "se la casella successiva è libera stampa la lettera della nave altrimenti cambia le coordinate di partenza o la direzione...il fatto è che queste sono salvate in un vettore creato in un altra funzione mentre in quella che stampa il vettore viene solo ciclato per ricavarne i dati....scusate se sono stato lungo ma effettivamente è un po complesso il funzionamento del programma...ovviamente è vitato l'uso dei break che non siano quelli obbligatori di un costrutto switch!!!!! Se serve vi posto il codice grazie in anticipo!!!!
aaa
06/01/10 12:13
nessuno
Devi postare sicuramente il codice ed indicare (in maniera più concisa) qual e' il problema e dove pensi si possa intervenire per risolverlo.
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
06/01/10 20:26
TheKaneB
probabilmente faresti meno fatica usando una struttura più appropriata per la nave...

ad esempio potresti considerare una nave come un rettangolo, e pertanto indicarne i due estremi per individuare tutte le caselle di cui si compone (Xmin, Ymin, Xmax, Ymax).

Così facendo, per testare se 2 navi si intersecano, basta usare un banale algoritmo di intersezione tra rettangoli...

questo potrebbe essere un esempio:

typedef struct _Ship
{
  int Xmin;
  int Ymin;
  int Xmax;
  int Ymax;
} Ship;

int intersect(Ship *first, Ship *second)
{
  // sanity check
  if ((first == NULL) || (second == NULL))
    return 0; // Almeno uno dei puntatori non è valido... non si scontra nessuno
 
  if (!(first->Xmin > second->Xmax || first->Xmax < second->Xmin ||
		first->Ymin > second->Ymax || first->Ymax < second->Ymin))
  {
    return 1; // WARNING! Due navi si scontrano!
  }
  else
  {
    return 0; // nessuna intersezione
  }
}
Ultima modifica effettuata da TheKaneB 06/01/10 20:32
aaa
07/01/10 8:56
Alby_c84
cavolo non ci avevo minimamente pensato, che ideona!!!!
Grazie 1000!!!
aaa