Una cosa, anzi due (se se ne era già discusso nell'altro 3D linkato da Sergio chiedo scusa).
Parlando della matrice delle navi e dei colpi lato client, a cosa ti serve sapere se c'è una nave in una casella vicina, oppure differenziare se la casella fa parte di una nave posta in orizzontale o in verticale?
A mio modo di vedere una codifica necessaria e sufficiente potrebbe essere:
0 -> niente navi, nessun colpo avversario
1 -> nave presente, nessun colpo avversario
2 -> nave presente, colpita dall'avversario
3 -> niente navi, colpo avversario (ergo in acqua)
Se il discorso della nave adiacente era per capire se una nave è affondata o semplicemente colpita... beh, io lo farei proprio in un altro modo; ho in mente due soluzioni, una gestita solo lato server, l'altra sia lato client che lato server, ma prima vediamo che cosa proponi tu
NB: sempre che serva differenziare lato client fra una nave affondata e una colpita solo parzialmente
O la tua codifica aveva una motivazione che mi sfugge?
Sul server cosa tieni?
Da quello che hai scritto sembra solo due array (a occhio e croce di struct, ma in C non sono una lince) con il posizionamento delle navi dei due client; ma come dici poi, se vuoi evitare "colpi doppi", devi tenere memoria anche della storia dei colpi dei due client.
Il resto non l'ho guardato in maniera decente da poter commentare, è troppo tardi
Ciao