Telefonino.net network
 
| 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 » |

Torna indietro   WinTricks Forum > Software > Programmazione

Notices

Rispondi
 
Strumenti discussione
Vecchio 26-06-2004, 17.33.54   #1
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
[C/C++] Battaglia Navale in C

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).

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?
Alhazred non è collegato   Rispondi citando
Vecchio 27-06-2004, 21.23.35   #2
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
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?
Alhazred non è collegato   Rispondi citando
Vecchio 28-06-2004, 09.40.22   #3
P8257 WebMaster
Gold Member
 
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
P8257 WebMaster promette bene
... 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
P8257 WebMaster non è collegato   Rispondi citando
Vecchio 28-06-2004, 11.04.34   #4
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
Ti ringrazio per la risposta , tutto chiaro (Y)
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.
Alhazred non è collegato   Rispondi citando
Vecchio 28-06-2004, 11.32.13   #5
LoryOne
Gold Member
WT Expert
 
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.503
LoryOne è un gioiello raroLoryOne è un gioiello raroLoryOne è un gioiello raro
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.
LoryOne non è collegato   Rispondi citando
Vecchio 28-06-2004, 11.34.04   #6
LoryOne
Gold Member
WT Expert
 
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.503
LoryOne è un gioiello raroLoryOne è un gioiello raroLoryOne è un gioiello raro
Dal mio punto di vista, s'intende.
E' chairo che ti basta una griglia e per le navi bastano dei quadrati riempiti.
LoryOne non è collegato   Rispondi citando
Vecchio 28-06-2004, 11.36.06   #7
LoryOne
Gold Member
WT Expert
 
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.503
LoryOne è un gioiello raroLoryOne è un gioiello raroLoryOne è un gioiello raro
Ah, un'utlima cosa.
Ricordati che Windows ha nella dll GDI32 tutto ciò che gli serve per gestire la grafica
LoryOne non è collegato   Rispondi citando
Vecchio 28-06-2004, 11.39.02   #8
P8257 WebMaster
Gold Member
 
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
P8257 WebMaster promette bene
Quota:
LoryOne ha scritto:
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.
Si concordo,
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
P8257 WebMaster non è collegato   Rispondi citando
Vecchio 28-06-2004, 18.51.44   #9
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
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 non è collegato   Rispondi citando
Vecchio 28-06-2004, 19.12.00   #10
P8257 WebMaster
Gold Member
 
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
P8257 WebMaster promette bene
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;
Visione personale della cosa
Bye
P8257 WebMaster non è collegato   Rispondi citando
Vecchio 28-06-2004, 19.14.52   #11
Dav82
Gold Member
Top Poster
 
Registrato: 18-07-2002
Messaggi: 6.399
Dav82 promette bene
Quota:
Originariamente inviato da P8257 WebMaster
Visione personale della cosa
Bye
Un po' OOP (Y)

Dav82 non è collegato   Rispondi citando
Vecchio 28-06-2004, 19.15.55   #12
P8257 WebMaster
Gold Member
 
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
P8257 WebMaster promette bene
OOPs..

Bye
P8257 WebMaster non è collegato   Rispondi citando
Vecchio 28-06-2004, 19.22.08   #13
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
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?
Alhazred non è collegato   Rispondi citando
Vecchio 28-06-2004, 19.34.12   #14
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
Quota:
Originariamente inviato da P8257 WebMaster
La conversione carattere-intero come sai non richiede neanche il casting in C...
Bye
Ti riferisci alla funzione atoi()?
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.
Alhazred non è collegato   Rispondi citando
Vecchio 28-06-2004, 20.20.45   #15
P8257 WebMaster
Gold Member
 
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
P8257 WebMaster promette bene
Quota:
Alhazred ha scritto:

Ti riferisci alla funzione atoi()?
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.
Ma guarda, l'idea dei caratteri è fattibilissima e più coerente rispetto all'idea numeri numeri secondo me...

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);
}
Bye

Ultima modifica di P8257 WebMaster : 28-06-2004 alle ore 20.26.01
P8257 WebMaster non è collegato   Rispondi citando
Rispondi


Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 ospiti)
 
Strumenti discussione

Regole di scrittura
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is ON
Gli smilies sono ON
[IMG] è ON
Il codice HTML è OFF

Vai al forum

Discussioni simili
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

Orario GMT +2. Ora sono le: 22.20.22.


E' vietata la riproduzione, anche solo in parte, di contenuti e grafica.
Copyright © 1999-2017 Edizioni Master S.p.A. p.iva: 02105820787 • Tutti i diritti sono riservati
L'editore NON si assume nessuna responsabilità dei contenuti pubblicati sul forum in quanto redatti direttamente dagli utenti.
Questi ultimi sono responsabili dei contenuti da loro riportati nelle discussioni del forum
Powered by vBulletin - 2010 Copyright © Jelsoft Enterprises Limited.