Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione
OPPO ha portato in Italia, dal 1° luglio 2026, Reno16 Pro: display AMOLED da 6,32 pollici a 144Hz, tripla fotocamera con sensore principale da 200 megapixel, chip Dimensity 8550 Super e batteria da 6000mAh, al prezzo di lancio di 899 euro. Lo abbiamo provato per due settimane insieme al nuovo accessorio Bubble, per capire se la formula compatta della serie regge ancora di fronte a un listino da 1099 euro
 Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco
Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco
MiniLED di fascia media con local dimming a 192 zone, 144 Hz nativi e audio firmato Devialet. La prova strumentale riscontra colori affidabili e gaming reattivo, per un prodotto molto accessibile e convincente. Ma la soundbar aggiuntiva è quasi d'obbligo
Kindle Scribe Colorsoft: riduce le cornici e diventa a colori, ma il prezzo è alto
Kindle Scribe Colorsoft: riduce le cornici e diventa a colori, ma il prezzo è alto
Amazon porta i colori sul suo Kindle da scrittura più grande: schermo Colorsoft a 11 pollici, processore quad-core, penna premium più reattiva e strumenti IA per le note, sono le note salienti. Il salto di prezzo rispetto al modello in bianco e nero si fa sentire, anche se la percezione è quella di trovarsi di fronte a un prodotto di fascia altissima, per veri appassionati
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 28-06-2004, 18:02   #1
Alhazred
Senior Member
 
L'Avatar di Alhazred
 
Iscritto dal: Dec 2003
Messaggi: 1774
[C] Battaglia Navale

Sto provando a sviluppare una specifica per la realizzazione della Battaglia Navale in C per Windows.
La specifica è la seguente:

Battaglia Navale (versione peer-to-peer per piattaforma NT)

Realizzazione di una versione elettronica del famoso gioco "Battaglia Navale". In questa versione due processi (ognuno dei quali funge da interfaccia con uno dei due giocatori) cooperano tra loro. Per prima cosa decidono la posizione delle navi e quale dei due processi deve iniziare (i meccanismi di decisione su quale sia il prio processo ad effettuare una mossa sono lasciati alla discrezione dello studente), poi il processo iniziale accetta come input una mossa, la trasmette al secondo processo, aspetta che il secondo processo comunichi l'esito della mossa, e si pone in attesa di una mossa da parte del secondo processo. Entrambi i processi ogni volta che ricevono una mossa o l'esito di una mossa dal processo avversario, valutano se l'avversario ha colpito, valutano se qualcuno ha vinto e lo riferiscono al loro giocatore. Il canale di comunicazione tra i due processi deve essere implementato tramite l'uso di memoria condivisa.


Per giocare bisogna lanciare due volte il programma (una volta per ogni giocatore).

Stavo pensando alle strutture dati da usare, come tipo composto credo sia sufficiente quello riguardante la mossa da fare, giusto? Ho pensato a una cosa di questo tipo:
Codice:
typedef struct {
    char colonna;
    int riga;
} mossa;
Poi dovrà essere fatta una conversione da carattere a intero per indicare la colonna quando si scandisce la matrice che rappresenterà il campo di gioco.
Alhazred è offline   Rispondi citando il messaggio o parte di esso
Old 28-06-2004, 19:31   #2
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Sì...per ora direi che vada bene...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2004, 10:15   #3
Alhazred
Senior Member
 
L'Avatar di Alhazred
 
Iscritto dal: Dec 2003
Messaggi: 1774
Codice:
...

#define numeroNavi 5
char *mArray[numeroNavi];

...

void PosizionaNavi(){
   int num = 1; //decrementa l'output per il numero di navi da posizionare
   int raw = 0; //indice di riga
   int colo = 1; // indice di colonna
   char ccolo = ' ';
   char craw = ' ';
   char *coor = "";

   ClearScreen();
   printf("Inserire le coordinate per %u navi.\n",numeroNavi);
   printf("\n");
   for(num=1;num<numeroNavi+1;num++){
	printf("Navi da posizionare: %u\n", numeroNavi+1-num);
	printf("Inserisci le coordinate per la nave %u: ",num);
	printf("Ha acquisito la coordinata\n");
	gets(coor);
	printf("Ha fatto il gets\n");
	ccolo = *coor;
	printf("Ha assegnato ccolo\n");
	colo = ccolo - 64;
	printf("Ha convertito ccolo in int\n");
	craw = *(coor + 1);
	printf("Ha assegnato craw\n");
	raw = craw - 48;
	printf("Ha convertito craw in int\n");
	printf("\n");

	mArray[num] = coor;
	cArray[colo][raw] = 'x'; //da togliere quando funziona 
   }
}
Questo codice va eseguito ad inizio partita per salvare in un array di caratteri le coordinate delle navi, ma in esecuzione mi dice "... la memoria non poteva essere READ", dov'è l'errore?
Ho messo una printf dopo ogni istruzione in modo da vedere a che punto si blocca.

In output accade questo
Inserisci le coordinate per la nave 1: Ha acquisito la coordinata

in pratica prende un ritorno a capo precedente e lo considera come coordinata, poi si blocca.
Come si può ovviare a questo problema?
Alhazred è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2004, 10:26   #4
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
char *coor = "";

Qui sopra non hai allocato la memoria per contenere la stringa...

Comunque evita di usare la gets... Se devi leggere la coordinata, che sarà qualcosa come B5 leggi due caratteri o usa scanf...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2004, 10:38   #5
Alhazred
Senior Member
 
L'Avatar di Alhazred
 
Iscritto dal: Dec 2003
Messaggi: 1774
Quote:
Originariamente inviato da cionci
char *coor = "";

Qui sopra non hai allocato la memoria per contenere la stringa...

Comunque evita di usare la gets... Se devi leggere la coordinata, che sarà qualcosa come B5 leggi due caratteri o usa scanf...
Mi spiegheresti esattamente come fare?
Alhazred è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2004, 11:17   #6
Alhazred
Senior Member
 
L'Avatar di Alhazred
 
Iscritto dal: Dec 2003
Messaggi: 1774
Ho risolto, grazie
Alhazred è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2004, 12:02   #7
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Come ? Fammi vedere
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2004, 12:09   #8
Alhazred
Senior Member
 
L'Avatar di Alhazred
 
Iscritto dal: Dec 2003
Messaggi: 1774
Codice:
void PosizionaNavi(){
   int num = 1; //decrementa l'output per il numero di navi da posizionare
   int i_raw = 0; //indice di riga
   int i_colo = 1; // indice di colonna
   int in_col = 0; //incrementa la posizione di *coor per leggere la colonna
   int in_raw = 0; //incrementa la posizione di *coor per leggere la riga
   char c_colo = ' ';
   char c_raw = ' ';
   char coor[40]; //dimensione provvisoria
	
   ClearScreen();
   printf("Inserire le coordinate per %u navi.\n",numeroNavi);
	printf("\n");
   for(num=1;num<numeroNavi+1;num++){
	printf("Navi da posizionare: %u\n", numeroNavi+1-num);
	printf("Inserisci le coordinate per la nave %u: ",num);
	gets(coor);
	c_colo = *coor;
	while(c_colo == ' '){ //cerca il primo carattere diverso da blank
		c_colo = *coor+in_col;
		in_col++;
	}
	i_colo = c_colo - 64;
	in_raw=in_col;
	c_raw = *(coor+in_raw + 1);
	while(c_raw == ' '){ //cerca il secondo carattere diverso da blank
		in_raw++;
	                c_raw = *coor+in_raw;
	}
	i_raw = c_raw - 48;
	printf("\n");

	mArray[num] = coor;
	cArray[i_raw][i_colo] = 'x';
   }
}
C'è del codice in più perché sto cercando di fare in modo che non ci siano errori di lettura nel caso in cui venissero messi degli spazi (es. B 5 invece di B5), anche se per ora non fa quello che vorrei.
Alhazred è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2004, 15:44   #9
Alhazred
Senior Member
 
L'Avatar di Alhazred
 
Iscritto dal: Dec 2003
Messaggi: 1774
Altra cosa, c'è anche quest'altro problema, così come è scritto se inserisco ad esempio E10 viene interpretato come E1, come devo modificare il codice per farlo riconoscere correttamente?
Alhazred è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2004, 16:24   #10
Alhazred
Senior Member
 
L'Avatar di Alhazred
 
Iscritto dal: Dec 2003
Messaggi: 1774
Spiego quali sono le mie intenzioni.
mArray è un array di numeroNavi posizioni, ogni posizione conterrà una coordinata nel formato C3, I6... e questo dovrà essere fatto da posizionaNavi().
posizionaNavi() dovrà anche fare controlli sulla validità dell'input e quindi leggere la lettera per la colonna, il numero per la riga e assicurarsi che siano all'interno della griglia.
Dovrà prendere quindi il primo carattere valido (una lettera compresa tra A e J) e poi altri 2 caratteri validi adiacenti (perché c'è anche il 10).
Come mi conviene acquisire l'input al fine di rendere più semplice tutta questa storia?
Alhazred è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2004, 16:29   #11
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Visto che stai facendo tutti questi controlli...eccone altri...

La ricerca del carattere diverso da spazio la puoi fare in questo modo (più immediato):
while(coor[in_col] == ' ') ++in_col;
if(coor[in_col] == '\0') //la stringa è terminata, stampa un errore e chiedi nuovamente un input

Dopo averlo trovato devi verificare che sia un carattere (per il primo) o un numero (per il secondo): isalpha e isdigit (libreria ctype.h)... Se i tipi non corrispondono allora esci...

Per il primo carettere: potrebbero averlo inserito minuscolo (e quindi non funzionerebbe toglierci 64, sostituisci 64 con 'A', è molto più leggibile) e quindi usa la funzione toupper per renderlo maiuscolo:

Dopo aver cercato il secondo carattere diverso da blank: devi convertire la stringa a partire da quel punto (che a questo punto può essere anche 10, o se vuoi fare il campo pià grande anche di più) in intero...
Devi usare atoi...

Ricapitolando:
Codice:
while(coor[in_col] == ' ') ++in_col;
if(!isalpha(coor[in_col])) //errore, gestiscilo un po' come ti pare

i_colo = toupper(coor[in_col]) - 'A';

while(coor[in_col] == ' ') ++in_col;
if(!isdigit(coor[in_col])) //errore, gestiscilo un po' come ti pare

i_row = atoi(coor + in_col);
Attenzione riga è row

Ultima modifica di cionci : 10-07-2004 alle 16:50.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 28-07-2004, 17:07   #12
Alhazred
Senior Member
 
L'Avatar di Alhazred
 
Iscritto dal: Dec 2003
Messaggi: 1774
Rieccomi, credo di essere a buon punto, devo risolvere questo problema: quando un processo accetta una mossa e la scrive in memoria condivisa, ad esempio C5, l'altro processo (o forse il processo stesso che la comunica) la vede come B5, oppure I8 viene vista come H8, in pratica la colonna risulta sempre decrementata di 1, ma non riesco a capire dove avviene questo errore.

Qui c'è il codice che ho scritto fin'ora, non è completo, devo mettere all'interno di un ciclo le istruzioni che vengono eseguite dai processi quando iniziano gli scambi dei colpi e i controlli degli stessi, inoltre devo mettere dei controlli per l'accesso alla memoria condivisa.
Per ora vorrei però risolvere questo di problema.

Ultima modifica di Alhazred : 29-07-2004 alle 12:08.
Alhazred è offline   Rispondi citando il messaggio o parte di esso
Old 29-07-2004, 10:06   #13
Alhazred
Senior Member
 
L'Avatar di Alhazred
 
Iscritto dal: Dec 2003
Messaggi: 1774
Ho rivisto il codice a mente fredda ed ho trovato l'errore.
Alhazred è offline   Rispondi citando il messaggio o parte di esso
Old 31-07-2004, 10:08   #14
alderighi
Senior Member
 
L'Avatar di alderighi
 
Iscritto dal: Sep 2002
Città: vinci-spicchio
Messaggi: 530
Anche io a scuola (4° anno di ITI informatica) ho sviluppato una battaglia navale, però la mia gira sotto dos con le librerie grafiche borland c++, gui sviluppata da me, ragionamento di puntatori megagalattico (ovvero una matrice di puntatori ad oggetti navi), ora ve la posto, la modalità due giocatori funziona con un cavo null-modem collegato alla porta com1, attenzione se avete la com1 occupata o non la avete per un bug c@--@ta che non ho voglia di risolvere il gioco non parte e da un errore.
Comunque abbiamo preso 9 e siamo stati gli unici a finire il progetto.

se la volete scaricare andate su http://file.webalice.it e quando richiesto dovete inserire:
- Username: massimo.alderighi
- Password: bn

Ciao
__________________
Intel Pentium DualCore E2140 1,60 GHz , Asus P5LD2 R2.0,Sapphire x600xt 128Mb,hauppauge winTV,2x256Mb Ddr2 Vitesta 533Mhz,western digital caviar 160gb, seagate 20gb 5400giri, maxtor 40gb 7200giri, dvd+-rw gigabyte(BTC) 4x,Samsung writemaster dvd duallayer 18x , edimax wireless<-->router D-link G604T.
alderighi è offline   Rispondi citando il messaggio o parte di esso
Old 15-10-2006, 16:14   #15
.:Eymerich:.
Junior Member
 
Iscritto dal: Oct 2006
Messaggi: 4
Quote:
Originariamente inviato da Alhazred
Per giocare bisogna lanciare due volte il programma (una volta per ogni giocatore).
Ciao Alhazred, anche io sono alle prese con lo stesso programmino.. Mi diresti come sei riuscito a realizzare questo?? Se io lancio due volte il programma mi fa partire sempre il giocatore 1. Non so come fare...
.:Eymerich:. è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione Reno16 Pro: il compatto di OPPO punta su fotocam...
 Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco Hisense 55U7SE: tuttofare e accessibile, il Min...
Kindle Scribe Colorsoft: riduce le cornici e diventa a colori, ma il prezzo è alto Kindle Scribe Colorsoft: riduce le cornici e div...
L'IA cambia tutte le regole della sicurezza tra vulnerabilità e sorveglianza. Intervista al CEO di Proofpoint L'IA cambia tutte le regole della sicurezza tra ...
L'Europa conta nella tecnologia e può essere autonoma. Cosa si è detto al Nextcloud Summit 2026 L'Europa conta nella tecnologia e può ess...
Anche T-Mobile abbandona VMware e migra ...
In Italia crescono gli investimenti nell...
Samsung combina IA e quantum computing p...
Anthropic ammette: Claude Code usa un ap...
L'IA costa sempre di più: AWS aum...
Google prepara il blocco delle app non v...
Amazfit aggiorna il Cheetah 2 Ultra: ric...
L'FAA apre ai voli commerciali supersoni...
Amazon ha già abbastanza satelliti per a...
A2A ed Equinix uniscono le forze per rec...
Apple ha creato la crisi delle memorie? ...
GPU subito in cambio di una quota dei ri...
Firefly Aerospace potrà lanciare ...
Intesa Sanpaolo sposta i sistemi IT core...
Visa, Mastercard e Coinbase lanciano Ope...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 20:16.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v