|
| HOMEPAGE | INDICE FORUM | REGOLAMENTO | ::. | NEI PREFERITI | .:: | RSS Forum | RSS News | NEWS web | NEWS software | |
| PUBBLICITA' | | | ARTICOLI | WIN XP | VISTA | WIN 7 | REGISTRI | SOFTWARE | MANUALI | RECENSIONI | LINUX | HUMOR | HARDWARE | DOWNLOAD | | | CERCA nel FORUM » | |
![]() |
#1 |
Made in Japan
Top Poster
Registrato: 04-07-2001
Messaggi: 4.461
![]() |
[C/C++] Battaglia Navale in C
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). La mia intenzione sarebbe di dare un aspetto grafico simile a quello del "Campo minato", ovvero due griglie, una sarebbe quella dove decidere come schierare le proprie navi e dove verrebbero riportati i colpi dell'avversario, l'altra quella su cui si fanno i vari tentativi per colpire le navi avversarie e dove verrebbero segnalati i colpi andati a buon fine. L'alternativa sarebbe fare un layout su una finestra dos, molto più semplice, ma sicuramente meno bella. Il problema è che non so come implementare l'aspetto grafico descritto per primo, mi potreste dare qualche dritta? |
![]() |
![]() |
![]() |
#2 |
Made in Japan
Top Poster
Registrato: 04-07-2001
Messaggi: 4.461
![]() |
Intanto avrei un'altra domanda:
la memoria condivisa la creerò con "CreateFileMapping", quando verrà lanciato per la prima volta il programma non ci saranno problemi, la memoria condivisa sarà riservata, quando però si lancerà la seconda volta (il programma sarà identico al primo ovviamente) la memoria condivisa già esisterà, come si comporterà "CreateFileMapping"? Riconoscerà l'esistenza di una memoria condivisa col nome che sta cercando di creare? In tal caso ignorerà la creazione e dovrò attaccarla con "MapViewOfFile"? Posso fare un controllo preventivo per vedere se già esiste la memoria condivisa? Come? |
![]() |
![]() |
![]() |
#3 |
Gold Member
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
![]() |
... La seconda domanda mi chiarisce ciò che ti avrei chiesto .. ti stavo infatti per domandare se avessi già realizzato la parte code behind della specifica...
L'utilizzo di CreateFileMapping è atto allo scopo di mappare un oggetto in un'area di memoria, fai attenzione in quanto la paginazione della memoria fisica cambia a seconda del sistema operativo con cui hai a che fare.. (9x o NT). Ti consiglio di creare una pagina contigua (una sola CreateFileMapping) con clausola: PAGE_READWRITE per mappare un oggetto creato in precedenza con GENERIC_WRITE. Come clausola di allocazione ti consiglio di tenere SEC_COMMIT, credo che tu non abbia esigenza di creare una regione contenente codice eseguibile, se intendi farlo, sappi che Win9x non supporta questa estensione del comando in quanto richiede una policy di sicurezza che non era presente in questi sistemi. Ora vengo al punto della domanda: una volta eseguita la mappatura viene referenziata con uno specifico HANDLE che punta alla dimensione della mappatura stessa. L'area di memoria viene creata, alle successive chiamate (anche da parte di un altro processo), la funzione "scoprirà" che una precedente area condivisa è già stata creata e ritornerà a sua volta un HANDLE che punta a quest'area condivisa .. Il valore di quest'ultimo ha la dimensione dell'area condivisa esistente (creata dalla prima chiamata) e NON della nuova eventuale dimensione che specifichi. Quindi, nessun problema nelle chiamate ricorsive, la funzione è in grado di intercettare un suo precedente intervento, al limite puoi utilizzare GetLastError per monitorare l'evento, in ogni caso qualsiasi problema nella creazione o nelle successive chimate dà NULL. Spero di esserti stato d'aiuto, guarderò più tardi la prima domanda. Bye ![]() |
![]() |
![]() |
![]() |
#4 |
Made in Japan
Top Poster
Registrato: 04-07-2001
Messaggi: 4.461
![]() |
Ti ringrazio per la risposta
![]() Il programma dovrà girare su piattaforma NT, quindi niente win9x. Per quanto riguarda la domanda sulla grafica non diventarci pazzo, se è una cosa semplice ok, altrimenti credo che mi accontenterò di una finestra dos. |
![]() |
![]() |
![]() |
#5 |
Gold Member
WT Expert
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
![]() ![]() ![]() |
La cosa non è poi tanto semplice.
Falla in DOS che ti conviene. ![]() Ricordati che l'aspetto grafico è l'ultima delle preoccupazioni. In questo esercizio si deve poter giocare a Battaglia Navale, non importa se il gioco è esteticamente gradevole o no. |
![]() |
![]() |
![]() |
#6 |
Gold Member
WT Expert
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
![]() ![]() ![]() |
Dal mio punto di vista, s'intende.
E' chairo che ti basta una griglia e per le navi bastano dei quadrati riempiti. |
![]() |
![]() |
![]() |
#7 |
Gold Member
WT Expert
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
![]() ![]() ![]() |
Ah, un'utlima cosa.
Ricordati che Windows ha nella dll GDI32 tutto ciò che gli serve per gestire la grafica ![]() |
![]() |
![]() |
![]() |
#8 | |
Gold Member
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
![]() |
Quota:
tieni la GUI come aspetto secondario .. a parte il fatto che non mi sembra male dare quest'aria quasi old style .. poi pian piano, una volta che hai verificato la funzionalità del programma, creerai le risorse visuali. Bye ![]() |
|
![]() |
![]() |
![]() |
#9 |
Made in Japan
Top Poster
Registrato: 04-07-2001
Messaggi: 4.461
![]() |
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; |
![]() |
![]() |
![]() |
#10 |
Gold Member
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
![]() |
La conversione carattere-intero come sai non richiede neanche il casting in C, comunque nella struttura un booleano per indicare lo stato della mossa secondo me non ci sta male.. oppure un flag di diverso genere (magari un altro INT a 3 stati) non andrebbe male .. poi dipende come hai pensato tu la cosa.
Codice:
#define A_NULLO 0 #define A_AFFONDATO 1 #define A_COLPITO 2 typedef struct { char Colonna; int Riga; int Stato; } t_Mossa; ![]() Bye ![]() |
![]() |
![]() |
![]() |
#11 | |
Gold Member
Top Poster
Registrato: 18-07-2002
Messaggi: 6.399
![]() |
Quota:
![]() ![]() |
|
![]() |
![]() |
![]() |
#12 |
Gold Member
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
![]() |
OOPs..
![]() Bye ![]() |
![]() |
![]() |
![]() |
#13 |
Made in Japan
Top Poster
Registrato: 04-07-2001
Messaggi: 4.461
![]() |
Dimenticavo, per far in modo che dopo ogni mossa il campo venga aggiornato dovrebbe essere sufficiente una matrice (delle stesse dimensioni del campo di battaglia) da scandire dopo ogni tentativo, va bene o c'è qualche altra possibilità migliore?
|
![]() |
![]() |
![]() |
#14 | |
Made in Japan
Top Poster
Registrato: 04-07-2001
Messaggi: 4.461
![]() |
Quota:
Questa però non dovrebbe convertire un numero scritto come stringa in intero? Quello che avevo in mente io era convertire a in 1, b in 2... con un opportuno codice. Però in fin dei conti posso anche più semplicemente chiedere direttamente un intero per la riga e poi un altro per la colonna. |
|
![]() |
![]() |
![]() |
#15 | |
Gold Member
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
![]() |
Quota:
in C non c'é bisogno di nulla per convertire il tuo carattere in intero dato che i caratteri vengono già visti come interi .. tu sai che la 'A' è il 65, quindi puoi fare tutto senza scomodare atoi & company. Guarda questa funzione che chiamo "chartoi": Codice:
int ChartoI(char c) { int ToReturn = (int) c; return (ToReturn - 64); } ![]() Ultima modifica di P8257 WebMaster : 28-06-2004 alle ore 20.26.01 |
|
![]() |
![]() |
![]() |
Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 ospiti) | |
Strumenti discussione | |
|
|
![]() |
||||
Discussione | Autore discussione | Forum | Risposte | Ultimo messaggio |
La grande battaglia dei super eroi! | Sbavi | Chiacchiere in libertà | 83 | 27-02-2009 10.43.39 |
battaglia navale in c# | Joy&Lu | Programmazione | 3 | 01-09-2008 15.08.58 |
Il Signore degli Anelli - La Battaglia per la terra di mezzo | Darth Maul | Masterizzazione Giochi Games | 0 | 01-09-2006 18.16.18 |
[C] Battaglia Navale (versione client server) in Linux | Nanri | Programmazione | 11 | 06-08-2005 14.50.27 |