Salvataggio partita battaglia navale su file (?)

di il
17 risposte

Salvataggio partita battaglia navale su file (?)

Ciao ragazzi praticamente sto preparando un esame per università, il gioco in questione è battaglia navale, dopo aver sviluppato tutte le funzioni principali del gioco come per esempio il posizionamento delle navi e la parte relativa agli attacchi, sto cercando un modo per salvare tutte quelle informazioni salvate nella struttura player per riprendere la partita caso mai utente abbandonasse il gioco.
Per questo programma ho utilizzato come struttura dati la seguente:
typedef struct player {
int playTableTurn[righe][colonne]; //tabella del giocatore
int playTableTurn_Attack[righe][colonne];
char name[20]; //nome del giocatore
int bigshot; // tentativi bigshot rimasti
int bombing; //tentattivi bombardamento rimasti

}player;
con rispettivamente player p1, p
Per effettuare il salvataggio pensavo di utilizzare i file binari, ho chiesto a alcuni miei compagni e mi hanno detto che per gestire questo problema lo hanno utilizzato un altra struct del tipo partita collegata a quella player.
Io non ho capito bene cosa volessero intendere, potreste darmi una mano proponendo nuovi soluzioni oppure riprendendo quella detta dai miei compagni?
Allegati:
32192_6d628d04e9c7d025fd352eed5c843a8e.png
32192_6d628d04e9c7d025fd352eed5c843a8e.png

17 Risposte

  • Re: Salvataggio partita battaglia navale su file (?)

    Dai, ma sei all'università: inizia tu e poi eventualmente ti diamo una mano...

    Ci sono miliardi di modi di salvare i dati: scegline uno e ti seguiamo. Ad occhio dovrebbero bastare i dati dei due player più un'informazione su chi debba attaccare (se non la puoi derivare implicitamente)
  • Re: Salvataggio partita battaglia navale su file (?)

    Io consiglierei un file di testo

    Una cosa del tipo
    [CODE] [DATI] Larghezza campo=10 Lunghezza campo=10 NomeGiocatore1=Nome NomeGiocatore2=Nome [SCHEMA 1] Linea1=0000011100 Linea2=0011100000 . . . . . [SCHEMA 2 Linea1=0111000000 Linea2=0011100000 . . .
  • Re: Salvataggio partita battaglia navale su file (?)

    Puoi benissimo salvare su file le due strutture di p1 e p2 in binario. Cosa non ti è chiaro?
  • Re: Salvataggio partita battaglia navale su file (?)

    Ciao, praticamente non mi è chiaro come dopo aver salvato le due strutture p1 e p2 in binario, come riprendere quei dati specifici,per esempio i dati di p1 per poi utilizzarli in una funzione
  • Re: Salvataggio partita battaglia navale su file (?)

    Sai come scriverli ma non come leggerli?
  • Re: Salvataggio partita battaglia navale su file (?)

    Ciao praticamente ho scritto questa bozza di codice, il file si riempie di caratteri strani nonostante non utilizzo i file binari,

    /* * nuova_partita.h
    *
    * Created on: 2 giu 2022
    * Author: aless
    */

    #ifndef SALVARE_PARTITA_H_
    #define SALVARE_PARTITA_H_
    #include <stdio.h>
    #include <stdlib.h>

    void SalvarePartita(player p,player p2);

    void SalvarePartita(player p,player p2)
    {
    FILE *file;

    file=fopen("Salvataggio.txt","w");

    if(file==NULL)
    {
    printf("ERRORE NELL'APERTURA DEL FILE \n");
    }

    else
    {
    fwrite(&p,sizeof(player),1,file);
    }

    fclose(file);


    //SALVA STRUTTURA PLAYER 2

    file=fopen("Salvataggio.txt","w");

    if(file==NULL)
    {
    printf("ERRORE NELL'APERTURA DEL FILE \n");
    }

    else
    {
    fwrite(&p2,sizeof(player),1,file);
    }

    fclose(file);


    return;
    }



    #endif /* SALVARE_PARTITA_H_ */
  • Re: Salvataggio partita battaglia navale su file (?)

    In realtà usando la ferite stai du fatto salvando in binario, anche se dovresti usare anche "wb" nella fornitura. Ed è corretto che non si possano interpretare i dati binari semplicemente o un editor di testo.

    Quindi usa la fopen wb e la rb con fwrite e fread e tutto funziona.

    P. S. Utilizza i tagli code per il codice leggi il regolamento
  • Re: Salvataggio partita battaglia navale su file (?)

    Okok scusami cosa sono le ferite? inoltre ti volevo chiedere una cosa praticamente se io salvo su file una struttura dati player con i relativi player 1 e player 2 quando faccio

    fwrite(&p,sizeof(player),1,file);

    fwrite(&p2,sizeof(player),1,file);

    i dati si sovrascrivono oppure no?
  • Re: Salvataggio partita battaglia navale su file (?)

    Era fwrite....

    Se esegui le fwrite una dopo l'altra dopo la fopen, i dati saranno in sequenza.
  • Re: Salvataggio partita battaglia navale su file (?)

    Ok quindi se apro il file, faccio fwrite su player 1 e poi chiudo il file e nuovamente lo apro e faccio la fwrite su player 2 mi sovrascrive i dati giusto?

    Quindi dovrei aprire il file fare due fwrite rispettivamente su player 1 e player 2 e poi chiudere il file.

    infine lei ha detto che prima era fwrite, ora al posti di fwrite devo scrivere tutto attaccato fwritewb?
  • Re: Salvataggio partita battaglia navale su file (?)

    Ha solo sbagliato a scrivere perché probabilmente era con il cellulare. Devi mettere l'opzione "wb" invece di "w" nel secondo argomento di fopen().

    https://www.cplusplus.com/reference/cstdio/fopen
    https://www.cplusplus.com/reference/cstdio/fwrite
    https://www.cplusplus.com/reference/cstdio/fclose

    Se vuoi vedere quello che succede al file, devi usare un Hex Editor, ma poi verrebbero fuori considerazioni su come il compilatore organizza una struttura e mi sembra un po' prematuro.
  • Re: Salvataggio partita battaglia navale su file (?)

    byluca02 ha scritto:


    Ok quindi se apro il file, faccio fwrite su player 1 e poi chiudo il file e nuovamente lo apro e faccio la fwrite su player 2 mi sovrascrive i dati giusto?
    Giusto
  • Re: Salvataggio partita battaglia navale su file (?)

    Ok grazie mille, pero ragazzi nonostante faccio in modo sequenziale le due fwrite mi salva solamente le informazioni di un player. vi allego il codice di salvarepartita:

    void SalvarePartita(player p,player p2)
    {
    FILE *file;
    file=fopen("Salvataggio.txt","wb");

    if(file==NULL)
    {
    printf("ERRORE SALVATAGGIO FILE\n");
    }

    else
    {
    system("cls");
    fwrite(&p,sizeof(player),1,file);
    fwrite(&p2,sizeof(player),1,file);
    printf("SALVATAGGIO FILE AVVENUTO\n");

    }

    fclose(file);
    }

    mentre la funzione caricapartita è la seguente:


    void CaricaPartita(player p,player p2)
    {
    FILE *file;
    file=fopen("Salvataggio.txt","rb");
    if(file==NULL)
    {
    printf("ERRORE APERTURA FILE");
    }

    else
    {
    fread(&p,sizeof(player),1,file);
    fread(&p2,sizeof(player),1,file);
    GiocaPartita(p, p2);
    }

    fclose(file);

    }

    dovrebbero essere giusto, non capisco perche mi salva le informazioni di un solo player
  • Re: Salvataggio partita battaglia navale su file (?)

    Ragazzi scusate era tutto giusto, avevo fatto un errore nella funzione giocapartita richiamata in carica partita, funziona tutto perfettamente, ultimo problemino è che non so come salvare la variabile globale turno che salva i turni dei giocatori, inizialmente pensavo di creare un altra struttura dati partita del tipo

    typedef struct partita
    {
    player p1
    player p2
    int turn
    };
    partita match;
    ma cosi dovrei modificare tutte le funzioni giusto? se utilizzo questa tecnica invece di passare solo la struttura dati player p1 dovrei passare anche quella partita quindi per esempio ora ho

    GiocaPartita(player p1 player p2)

    diventerà

    GiocaPartita (partita match)
    per poi richiamare la struttura dati p1 in questo modo: match.p1

    Secondo voi c'è un altro metodo piu semplice per salvare una variabile globale su file anzichè creare un altra struttura dati partita con all'interno le due strutture dati p1 e p2 e il turno?
Devi accedere o registrarti per scrivere nel forum
17 risposte