Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 25
  1. #1

    [C] - Battaglia navale n-dimensionale (solo per esperti)

    Salve a tutti, dovrei realizzare un progetto per l'esame di laboratorio di sistemi operativi.

    Il progetto consiste nel realizzare un'applicazione client/server in linguaggio C che implementi la battaglia navale n-dimensionale.

    Io mi sono fermato alla terza dimensione, oltre non ci arrivo proprio....

    Ho bisogno di un piccolo aiuto per cominciare.

    Il prof nella specifica ha scritto che il client inzia una nuova partita comunicando al server

    il nome del campo di battaglia, un intero N che indica la dimensione, un intero M che indica il numero di navi della flotta e N interi che indicano il numero di elementi su ogni singola dimensione.

    Esempio: Mediterraneo 3 7 4 5 6
    Crea un nuovo campo di battaglia chiamato Mediterraneo, 3-dimensionale con 7 navi. La prima dimensione ha 4 componenti, la seconda 5, la terza 6. (e così via...).

    Ma io non capisco proprio come realizzare il campo... come tenere traccia delle posizioni delle navi...
    E come evitare che queste si sovrappongano nello spazio che occupano...

    Chi mi aiuta, almeno a pensare da dove partire?

    Ho bisogno solo di idee di implementazione, non necessariamente di codice.

    Quale struttura dati è più adatta al mio caso secondo voi? Io non faccio che pensare alle amate matrici, ma non riesco a capire come utilizzarle per dimensioni diverse da 2...

    Mi rimetto alla vostra esperienza.

  2. #2
    Per un gioco come battaglia navale credo che vadano benissimo gli array multidimensionali, utilizzando come tipo di base una struttura che definirai in base alle tue esigenze.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Originariamente inviato da MItaly
    Per un gioco come battaglia navale credo che vadano benissimo gli array multidimensionali, utilizzando come tipo di base una struttura che definirai in base alle tue esigenze.
    Il problema è che non so come gestire le coordinate delle navi nelle varie dimensioni, chi mi aiuta?

    Se la dimensione N è uguale a 2, allora è la classica battaglia navale, con la matrice 100x100 e le navi occuperanno delle locazioni della matrice, ma quando N>=3, il gioco si complica, perchè come faccio a tenere traccia delle posizioni delle navi?

    In poche parole diventa difficile verificare dove effetivamente si trovi una nave. Se per esempio inserisco la prima nave, in 2d basta fare accesso alla matrice e so di sicuro se posso aggiungere una nuova nave alle coordinate assegnate, ma se non riesco a rappresentare il campo di battaglia, come faccio a verificare ciò per dimensioni pari 3,4,..., N?

    Chissà se sono stato chiaro... spero che qualche anima pia, mi aiuti, almeno a raggionare!

    Buona giornata!

  4. #4
    Allora, in pratica vuoi realizzare una applicazione console ma con più di due dimensioni, se ho capito bene... Il mio consiglio è quello di rapperesentare ogni volta diversi campi di battaglia, visti da diverse dimensioni.
    Ad esempio se hai un campo tridimensionale visualizzi, prima un campo con la prima e la seconda dimensione, poi uno con la prima e la terza....
    Per ora è questo il consiglio che tido, comunque mi sembra una cosa parecchio comlicata... Ci lavorerò...

  5. #5
    Grazie per il suggerimento. Ho solo paura che sia troppo dispendioso... Immagina per 10 dimensioni, posso mai visualizzare 100 matrici per ogni mossa?

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Esiste la possibilita' che tu abbia equivocato i termini del compito che ti e' stato dato dal professore?

    Perche' così come l'hai descritto, mi sembra un compito impossibile.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Originariamente inviato da oregon
    Esiste la possibilita' che tu abbia equivocato i termini del compito che ti e' stato dato dal professore?

    Perche' così come l'hai descritto, mi sembra un compito impossibile.
    Oregon, io spero davvero di aver equivocato... perchè sto uscendo pazzo! Ho chiesto un appuntamento con il prof. Ti farò sapere, nel frattempo posto la traccia del progetto:

    Progetto Battaglia Navale n-dimensionale
    Descrizione sintetica:
    Realizzare un’applicazione client/server che implementi la “battaglia navale n-dimensionale”. La
    battaglia navale e’ classicamente giocata da 2 giocatori ed e’ implementata su due dimensioni. Il
    progetto consiste nella sua estensione a n dimensioni.
    L'applicazione deve essere scritta utilizzando il linguaggio C. I processi comunicano attraverso
    socket TCP. L'elaborato deve essere corredato da una opportuna documentazione.
    Descrizione dettagliata:
    Processo server:
    Il processo server riceve su linea di comando il numero massimo di partite che deve gestire
    contemporaneamente e la durata massima di una partita. Ogni partita e’ giocata da due giocatori ed
    e’ identificata da una stringa “combat-field” che viene inviata al server dal primo client che si
    connette. Il server fornisce i seguenti servizi:
    • Stats: Il server invia al client
    o Numero massimo di partite che puo’ gestire;
    o Durata massima della partita;
    o Numero di partite attualmente in svolgimento
    o Numero di partite per cui un giocatore e’ in attesa di un avversario
    o Numero totale di partite concluse dall’ultimo avvio del server
    • List: Elenca tutte le partite “attive” sul server. Per ogni partita il server invia al client:
    o La stringa che identifica la partita (“combat-field”)
    o L’identificativo del/i giocatore/i (“combat-name”). Un partita in “svolgimento” ha
    sempre due giocatori; Una partita “in attesa” ha sempre un unico giocatore.
    o Il tempo rimasto per la partita
    o I parametri del gioco (numero di dimensioni e dimensioni del campo di battaglia,
    numero di unita’ navali costituenti la flotta.)
    • New: Riceve come parametro una stringa, un intero N, un intero M seguiti da N interi. La
    stringa identifica la partita (il “combat-field”), l’intero N identifica la dimensione del campo
    di battaglia, l’intero M identifica il numero di unita’ navali costituenti la flotta e gli N interi
    identificano il numero di elementi su ogni singola dimensione.
    o Es. “New mediterraneo 3 7 4 5 6”. Crea un nuovo campo di battaglia 3-dimensionale
    denominato “mediterraneo”. La flotta di ogni giocatore consiste di 7 unita’ navali. La
    prima dimensione ha 4 componenti, la seconda dimensione ha 5 componenti e la terza
    dimensione ha 6 dimensioni.
    • Join: Riceve come parametro una stringa “combat-field”.
    o Se la NON esiste nessuna partita identificata da “combat-field” ritorna errore;
    o Se “combat-field” identifica una partita in svolgimento (i.e., con due giocatori) ritorna
    errore;
    o Se “combat-field” identifica una partita in “attesa” (i.e., con un solo giocatore), riceve
    i parametri del campo di battaglia dal server ed il nuovo client diventa il secondo
    giocatore.
    Quando un nuovo giocatore si collega, (i.e., quando il primo giocatore esegue l’operazione “New” e
    quando il secondo giocatore effettua la “Join”), il client invia al server il posizionamento della flotta.
    Si assuma che:
    • ogni unita’ navale identificata da una sola N-pla;
    • due unita’ di giocatori diversi possono essere poste nella stessa posizione nello spazio
    • due unita’ dello STESSO giocatore NON possono condividere la stessa posizione nello
    spazio.
    Processo client:
    Il processo client riceve sulla linea di comando l’indirizzo IP ed il numero di porta del server. Il
    client legge da standard input i comandi che invia al server e visualizza i messaggi da esso ricevuti.
    I comandi che il client accetta sono:
    • Stats, List. Non ricevono parametri e corrispondono ai relativi comandi del server.
    • New: prende come parametri l’identificativo ed i parametri del campo di battaglia ed il nome
    di un file. Il file contiene, per ogni riga la posizione nello spazio di una unita’ navale. Il server
    verifica che le informazioni contenute nel file siano consistenti con i parametri del gioco
    (numero di unita’ navali corretto, coordinate di ogni unita’ navale interne al campo di
    battaglia) e le invia al server.
    • Join: prende come parametri l’identificativo del campo di battaglia ed il nome del file
    contentente il deployment della flotta. Verifica che le informazioni contenute nel file siano
    consistenti con i parametri del gioco e le invia al server.
    Dopo l’esecuzione di New o Join, i giocatori, a turno, inviano coordinate al server che risponde
    opportunamente (“Acqua” o “Colpito” seguito dal numero di unita’ nemiche ancora attive).
    Il client puo’ anche ricevere:
    • Remaining: Visualizza il numero di unita’ navali dell’avversario non ancora coplite.
    • Surrender: Messaggio di resa.
    Una partita termina quando un giocatore colpisce tutte le unita’ nemiche, nel qual caso, i client dei
    due giocatori terminano, o quando uno dei due si arrende.
    Regole generali.
    Il server ed il client vanno realizzati in linguaggio C su piattaforma UNIX/Linux. Le comunicazioni
    tra client e server si svolgono tramite socket TCP. Oltre alle system call UNIX, i programmi
    possono utilizzare solo la libreria standard del C. Sarà valutato negativamente l'uso di primitive non
    coperte dal corso (ad es., code di messaggi) al posto di quelle studiate.

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Mah ... mi sembra che il problema ... sia il tuo professore ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    41
    Ciao, spero di poterti essere utile,
    Il compito sembra assai complesso nella sua totalità, per curiosità quanti crediti ti vale. 5?

    passando all implementazione penso che potresti provare un approcio del genere:

    considerre il tuo campo di battaglia come un array monodimensionale ed accederci con l'aritmetica dei puntatori.

    A quanto sembra dall'assegniamento per fotuna le navi sono punti nello spazio ndimensionale il che semplifica un po' le cose.

    per quanto riguarda il campo di battaglia prova così:
    codice:
    struct cella{  /* */ }  
    struct cella *campoDiBattaglia; 
     
    /* 
    per accedere al posizione coordinata specifica es in 4 dim se tu spari in campoDiBAttaglia[x][y][z][t]; 
    e campo di battaglie è definito come un cubo in 4 dim di lato 4 accedi alla cella specifica in questo modo
      */
    
     valoreCella = *(campoDiBattaglia +4*x*sizeof (cella) + 4*y*sizeof (cella) + 4*z*sizeof cella + t  *sizeof (cella)); 
    
     /*ovviamente al posto al posto di 4 avrai DIMX, DIMY, DIMZ, DIMT*/
    il secondo problema è generalizzare questa struttura a seconda del diverso numero di dimensioni

    Il mio consiglio è attribire un numero massimo di dimensioni e poi riscrivere la stringa di cui sopra che per ogni componate vine moltiplicata per 1 o per 0 a seconda del fatto che quela dimensione sia contemplata.

  10. #10
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Da un punto di vista fisico, ovviamente non ha senso parlare di spazio a quattro dimensioni, quindi si può tentare immaginare una situazione reale fino alla terza dimensione.

    Per quanto riguarda la quarta dimensione, in sostanza un array quadridimensionale non è nient'altro che un array di array tridimensionali, dove ciascun array tridimensionale rappresenta la posizione nello spazio della nave, che a questo punto si può considerare variabile nel tempo, dove gli istanti di tempo sono appunto gli indici dell'array quadridimensionale. Il tutto significherebbe in sostanza... giocare alla battaglia navale con le navi in movimento e non ferme come al solito!

    In generale, comunque, in C sarebbe possibile riuscire a lavorare con array multidimensionali, con n (numero di dimensioni) > 3. Il punto è: come generalizzare (proprio a livello di linguaggio!) ? Cioè io posso anche realizzare un programma che consideri queste navi in una sorta di iperspazio a 10 dimensioni (con ogni dimensione lunga proprio 10...), ma appunto il numero di queste dimensioni è da decidersi a priori... non vedo come questo possa variare a seconda della decisione dell'utente, cioè la cosa non richiederebbe modifiche a livello di codice? Come è possibile farlo runtime?

    Inoltre, stampare un campo di battaglia del genere è teoricamente possibile, ma in pratica per stamparlo su terminale bisognerebbe stamparlo matrice per matrice... e la cosa è terrificante: se avete modo di lavorare con matlab qualche volta, provate a lanciare l'ambiente di lavoro e a dare questa istruzione:

    rand(10, 10, 10, 10, 10, 10, 10, 10, 10, 10) // senza punto e virgola altrimenti non c'è sfizio!

    il buon matlab comincerà a sfornare matrici su matrici generate in maniera casuale, ma quando si fermerà? Quando avrà generato 10^9 matrici di dimensione 10x10... c'è bisogno di aggiungere altro?

    E vogliamo parlare dello spazio in memoria? Una follia come questa appena descritta richiederebbe (se le matrici fossero di caratteri) 100 byte per ogni matrice... e se le matrici sono 10^9, stiamo parlando di 100 miliardi di byte, cioè di circa 100 GB...

    Diavolo... è vero che ho un hardware un po' datato, ma sul mio computer non ci sono 100 GB di spazio, nemmeno se il sistema operativo si prendesse tutto l'HD per la paginazione della memoria virtuale!

    Conclusione: meglio se chiedi al professore notevoli chiarimenti.

    EDIT: comunque ti sarei davvero grato se tenessi aggiornato questo post con gli sviluppi della cosa, comunque vada a finire. A mio contestabilissimo parere, comunque, questa misteriosa dimensione "n" dell'array è da scegliersi a monte, cioè io decido ad esempio di generalizzare il gioco della battaglia navale con un campo di battaglia a 5 dimensioni... e la cosa finisce lì.
    every day above ground is a good one

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.