Visualizzazione dei risultati da 1 a 6 su 6

Discussione: [C/C++]: Liste e file

  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    36

    [C++] Liste e File

    Ciao a tutti, ho un bel problemino con un programma che devo fare x la scuola... in pratica devo programmare una parte del Monopoli. In pratica mi trovo con 2 file così strutturati:

    ---> giocatori.txt <---

    Mario 30.23
    Parco_della_Vittoria 10.23
    Viale_dei_giardini 8.32
    #
    Gustavo 27.65
    vicolo_Stretto 5.32
    corso_Magellano 7.26
    piazza_Giulio_Cesare
    #
    Roberta 32.43
    corso_Raffaello 9.32
    piazza_Dante 8.00




    ---> tabellone.txt <---

    Partenza
    Parco_della_Vittoria
    corso_Magellano
    piazza_Giulio_Cesare
    viale_dei_Giardini
    .....


    Nel primo file sono presenti i nomi dei giocatori con a fianco i loro soldi, e di seguito tutti i terreni posseduti con relativo valore, mentre nel secondo file c'è l'elenco ordinato di tutte le vie del tabellone.
    In pratica il gioco consiste "solo" nel far tirare 2 dadi (generendo un numero tra 1 e 12) e vedere in che casella finisce il giocatore. a questo punto se la casella è posseduta da un giocatore avversario si dovrà pagare il valore indicato. Ogni giocatore perde quando finisce i soldi. Il gioco termina quando resta un solo giocatore.
    La fregatura è che devo per forza usare le liste.. su cui nn sono molto preparato... cmq ecco quello che sono riuscito a fare:





    #include <iostream.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <conio.h>

    #define MAXGIOC 10

    int dadi; /* Valore dei dadi */
    int posizione[MAXGIOC]; /* Vettore posizione giocatori */
    int n_caselle; /* Contatore caselle */
    int n_giocatori; /* Contatore giocatori */
    int i; /* Contatore for */
    int ingioco[MAXGIOC]; /* Vettore stato dei giocatori */
    int gioc_ingioco; /* Numero dei giocatori in gioco */
    int gioc; /* Contatore for fioco */
    int stato; /* Variabile statto fscanf */

    float valore; /* Variabile valore dei terreni */

    char via[20]; /* Stringa nomi vie */
    char stringa[20]; /* Stringa nomi vie */
    char nome_pro[20]; /* Stringa nome proprietario casella */


    /* Lista tabellone */
    struct casella_s
    {
    char via[20];
    char nome[20];
    float soldi;
    struct casella_s*prossimo;
    }casella;

    casella *punttesta, *puntcorr; /* Puntatori */
    casella recaux;

    /* Lista giocatori */
    struct giocatori_s
    {
    char nome[20];
    float soldi;
    struct giocatori_s*prossimo;
    }giocatori;

    giocatori *punttesta2, *puntcorr2, *giocatore; /* Puntatori */



    main()
    {
    FILE*inp_file;

    /* Caricamento Lista Tabellone */

    fopen("tabellone.txt","r");
    punttesta=NULL; /* Inizializza la lista */
    for(stato=fscanf(inp_file, "%s", &recaux.via); stato!= EOF; fscanf(inp_file, "%s", &recaux.via))
    {
    /* Alloco spazio x un record */
    puntcorr=(casella*) malloc (sizeof (casella));
    (*puntcorr).via = recaux.via;
    (*puntcorr).prossimo=punttesta;
    punttesta=puntcorr;
    n_caselle ++;
    }
    fclose(inp_file);


    // Caricamento lista Giocatori
    fopen("giocatori.txt","r");
    punttesta2=NULL;

    while (fscanf(inp_file, "%s", &stringa) != EOF)
    {
    /* Alloco spazio x record */
    puntcorr2=(giocatori*) malloc (sizeof(giocatori));

    /* Carico nella lista il nome e i soldi del giocatore */
    (*puntcorr2).nome=fscanf(inp_file, "%s");
    (*puntcorr2).soldi=fscanf(inp_file, "%f");

    /* Finche non trovo # leggo le caselle possedute */
    while (fscanf(inp_file, "%s") != '#')
    {
    /* Carico in 2 variabili il nome della casella e il suo valore */
    fscanf(inp_file, "%s", &via);
    fscanf(inp_file, "%f", &valore);
    /* Cerco nella lista Tabellone la casella e scrivo nella lista nome del giocatore che */
    /* la possiede e il relativo valore */
    while(puntcorr!=NULL) && ((*puntcorr).via != via)
    puntcorr=(*puntcorr).prossimo;
    *puntcorr.nome = *puntcorr2.nome;
    *puntcorr.soldi = valore;
    }
    (*puntcorr2).prossimo=punttesta2;
    punttesta2=puntcorr2;
    n_giocatori ++;
    }

    fclose(inp_file);
    /* Mando all'inizio della lista anche il puntatore giocatre */
    /* che serve per lavorare sui soldi del proprietario del terreno */
    giocatore = puntcorr2;


    /* ------------------------------------------------------------------------------------------------------------ */

    /* Inizializzo il numero dei giocatori in gioco */
    gioc_ingioco = n_giocatori;

    /* Inizializzo lo stato dei giocatori */
    for (i=1; i<= n_giocatori; i++)
    {
    ingioco[i] = 1;
    }

    /* Inizializzo la posizione dei giocatori */
    for (i=1; i<= n_giocatori; i++)
    {
    posizione[i] = 0;
    }

    /* Inizio Gioco che termina se rimane solo un giocatore */
    printf("\n\n INIZIO GIOCO");
    while(gioc_ingioco != 1)
    {
    /* Mando all'inizio l'indice della lista dei giocatori */
    puntcorr2 = punttesta2;

    /* Ciclo turno di gioco */
    for (gioc=1; gioc<=n_giocatori; gioc++)
    {
    if (ingioco[gioc] == 1)
    {
    /* Mando all'inizio il puntatore x il giocatore proprietario */
    giocatore = punttesta2;
    printf("\n\n Tocca a %s", (*puntcorr2).nome);
    /* Tiro i dadi e incremento la posizione del giocatore */
    dadi=rand(11)+1;
    posizione[gioc] = posizione[gioc] + dadi;
    /* Se arriva al fondo torna all'inizio */
    if (posizione[gioc] >= n_caselle) posizione[gioc] = posizione[gioc] - n_caselle;

    /* Vado all'inizio del Tabellone e scorro la lista fino alla casella voluta */
    puntcorr = punttesta;
    for (i=1; i<=dadi; i++)
    {
    puntcorr=(*puntcorr).prossimo;
    }

    printf("\n Tira i dadi e ottiene %d finendo in %s", dadi, (*puntcorr).via);
    /* Guardo di chi è la casella e pago */
    if ( (*puntcorr).nome == (*puntorr2).nome )
    {
    printf("\n La casella è sua, quindi non paga. Tocca al giocatore successivo");
    printf("\n Soldi rimanenti: € %f", (*puntcorr2).soldi);
    }
    else if ( (*puntcorr).nome == '' )
    {
    printf("\n La casella non è di nessuno, quindi non paga. Tocca al giocatore successivo");
    printf("\n Soldi rimanenti: € %f", (*puntcorr2).soldi);
    }
    else
    {
    nome_pro=(*puntcorr).nome;
    /* Cerco il nome del proprietario della casella nella lista Giocatori */
    giocatore = punttesta2;
    while (giocatore != NULL) && ((*giocatore).nome != nome_pro)
    giocatore=(*giocatore).prossimo;

    /* Pago */
    (*giocatore).soldi = (*giocatore).soldi + (*puntcorr).soldi;
    (*puntcorr2).soldi = (*puntcorr2).soldi - (*puntcorr).soldi;
    printf("\n Il giocatore paga € %f a %s. Tocca al giocatore successivo", (*puntcorr).soldi, (*giocatore).nome);
    printf("\n Soldi rimanenti: € $f", (*puntcorr2).soldi);

    /* Guardo se va in bancarotta */
    if ((*puntcorr2).soldi <= 0 )
    {
    ingioco[gioc] = 0;
    gioc_ingioco --;
    printf("\n Il giocatore è in bancarotta, quindi è fuori");
    }
    }

    } // Chiudo If
    } //Chiudo for turno di gioco
    } // Chiudo While, resta un solo giocatore

    printf("\n\n FINE PARTITA! ");
    printf("\n\n Vince %s con € %f", (*puntcorr2).nome,(*puntcorr2).soldi);

    system("PAUSE");
    return 0;
    }



    -- Scarica il file: www.bak86.altervista.org/mon.cpp --
    Il problema è che mi da un pacco di errori senza senso... e non so xkè.... riuscite a darmi una mano???



    Grazie a tutti... ciao ciao!

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301

    Moderazione

    Originariamente inviato da Bak86
    Il problema è che mi da un pacco di errori senza senso...
    Forse dovresti elencarli, senza costringere chi risponde a "copiare e incollare" il tuo codice o scaricarsi e compilare il sorgente.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    36
    sorry....

    b:\bak\scuola\tlp\mon.cpp: In function `int main()':
    b:\bak\scuola\tlp\mon.cpp:79: incompatible types in assignment of `int' to `char[20]'
    b:\bak\scuola\tlp\mon.cpp:90: parse error before `('
    b:\bak\scuola\tlp\mon.cpp:92: request for member `nome' in `puntcorr', which is of non-aggregate type `casella *'
    b:\bak\scuola\tlp\mon.cpp:92: request for member `nome' in `puntcorr2', which is of non-aggregate type `giocatori *'
    b:\bak\scuola\tlp\mon.cpp:93: request for member `soldi' in `puntcorr', which is of non-aggregate type `casella *'
    b:\bak\scuola\tlp\mon.cpp:153: `puntorr2' undeclared (first use this function)
    b:\bak\scuola\tlp\mon.cpp:153: (Each undeclared identifier is reported only once
    b:\bak\scuola\tlp\mon.cpp:153: for each function it appears in.)
    b:\bak\scuola\tlp\mon.cpp:158: empty character constant
    b:\bak\scuola\tlp\mon.cpp:168: parse error before `('
    b:\bak\scuola\tlp\mon.cpp:195: confused by earlier errors, bailing out

    ...dico solo che l'ultima volta che l'ho compilato c'erano il doppio degli errori.. e nn ho toccato niente....

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    36
    Ho fatto qualche modifica.....

    #include <iostream.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <conio.h>

    #define MAXGIOC 10

    int dadi; /* Valore dei dadi */
    int posizione[MAXGIOC]; /* Vettore posizione giocatori */
    int n_caselle; /* Contatore caselle */
    int n_giocatori; /* Contatore giocatori */
    int i; /* Contatore for */
    int ingioco[MAXGIOC]; /* Vettore stato dei giocatori */
    int gioc_ingioco; /* Numero dei giocatori in gioco */
    int gioc; /* Contatore for fioco */
    int stato; /* Variabile statto fscanf */

    float valore; /* Variabile valore dei terreni */

    char via[20]; /* Stringa nomi vie */
    char stringa[20]; /* Stringa nomi vie */
    char nome_pro[20]; /* Stringa nome proprietario casella */


    /* Lista tabellone */
    typedef struct casella_s
    {
    char via[20];
    char nome[20];
    float soldi;
    struct casella_s*prossimo;
    }casella;

    casella *punttesta, *puntcorr; /* Puntatori */
    casella recaux;

    /* Lista giocatori */
    typedef struct giocatori_s
    {
    char nome[20];
    float soldi;
    struct giocatori_s*prossimo;
    }giocatori;

    giocatori *punttesta2, *puntcorr2, *giocatore; /* Puntatori */



    main()
    {
    randomize();
    FILE*inp_file;

    /* Caricamento Lista Tabellone */

    fopen("tabellone.txt","r");
    punttesta=NULL; /* Inizializza la lista */
    for(stato=fscanf(inp_file, "%s", &recaux.via); stato!= EOF; fscanf(inp_file, "%s", &recaux.via))
    {
    /* Alloco spazio x un record */
    puntcorr=(casella*) malloc (sizeof (casella));
    (*puntcorr).via = recaux.via;
    (*puntcorr).prossimo=punttesta;
    punttesta=puntcorr;
    n_caselle ++;
    }
    fclose(inp_file);


    // Caricamento lista Giocatori
    fopen("giocatori.txt","r");
    punttesta2=NULL;

    while (fscanf(inp_file, "%s", &stringa) != EOF)
    {
    /* Alloco spazio x record */
    puntcorr2=(giocatori*) malloc (sizeof(giocatori));

    /* Carico nella lista il nome e i soldi del giocatore */
    (*puntcorr2).nome=stringa;
    (*puntcorr2).soldi=fscanf(inp_file, "%f");

    /* Finche non trovo # leggo le caselle possedute */
    while (fscanf(inp_file, "%s") != '#')
    {
    /* Carico in 2 variabili il nome della casella e il suo valore */
    fscanf(inp_file, "%s", &via);
    fscanf(inp_file, "%f", &valore);
    /* Cerco nella lista Tabellone la casella e scrivo nella lista nome del giocatore che */
    /* la possiede e il relativo valore */
    puntcorr = punttesta;
    while(puntcorr!=NULL) && ((*puntcorr).via != via)
    puntcorr=(*puntcorr).prossimo;
    *puntcorr.nome = *puntcorr2.nome;
    *puntcorr.soldi = valore;
    }
    (*puntcorr2).prossimo=punttesta2;
    punttesta2=puntcorr2;
    n_giocatori ++;
    }

    fclose(inp_file);
    /* Mando all'inizio della lista anche il puntatore giocatre */
    /* che serve per lavorare sui soldi del proprietario del terreno */
    giocatore = puntcorr2;


    /* ------------------------------------------------------------------------------------------------------------ */

    /* Inizializzo il numero dei giocatori in gioco */
    gioc_ingioco = n_giocatori;

    /* Inizializzo lo stato dei giocatori e la loro posizione */
    for (i=1; i<= n_giocatori; i++)
    {
    ingioco[i] = 1;
    posizione[i] = 0;
    }

    /* Inizio Gioco che termina se rimane solo un giocatore */
    printf("\n\n INIZIO GIOCO");
    while(gioc_ingioco != 1)
    {
    /* Mando all'inizio l'indice della lista dei giocatori */
    puntcorr2 = punttesta2;

    /* Ciclo turno di gioco */
    for (gioc=1; gioc<=n_giocatori; gioc++)
    {
    if (ingioco[gioc] == 1)
    {
    /* Mando all'inizio il puntatore x il giocatore proprietario */
    giocatore = punttesta2;
    printf("\n\n Tocca a %s", (*puntcorr2).nome);
    /* Tiro i dadi e incremento la posizione del giocatore */
    dadi=rand(11)+1;
    posizione[gioc] = posizione[gioc] + dadi;
    /* Se arriva al fondo torna all'inizio */
    if (posizione[gioc] >= n_caselle) posizione[gioc] = posizione[gioc] - n_caselle;

    /* Vado all'inizio del Tabellone e scorro la lista fino alla casella voluta */
    puntcorr = punttesta;
    for (i=1; i<=posizione[gioc]; i++)
    {
    puntcorr=(*puntcorr).prossimo;
    }

    printf("\n Tira i dadi e ottiene %d finendo in %s", dadi, (*puntcorr).via);
    /* Guardo di chi è la casella e pago */
    if ( (*puntcorr).nome == (*puntorr2).nome )
    {
    printf("\n La casella è sua, quindi non paga. Tocca al giocatore successivo");
    printf("\n Soldi rimanenti: € %f", (*puntcorr2).soldi);
    }
    else if ( (*puntcorr).nome == '' )
    {
    printf("\n La casella non è di nessuno, quindi non paga. Tocca al giocatore successivo");
    printf("\n Soldi rimanenti: € %f", (*puntcorr2).soldi);
    }
    else
    {
    nome_pro=(*puntcorr).nome;
    /* Cerco il nome del proprietario della casella nella lista Giocatori */
    giocatore = punttesta2;
    while (giocatore != NULL) && ((*giocatore).nome != nome_pro)
    giocatore=(*giocatore).prossimo;

    /* Pago */
    (*giocatore).soldi = (*giocatore).soldi + (*puntcorr).soldi;
    (*puntcorr2).soldi = (*puntcorr2).soldi - (*puntcorr).soldi;
    printf("\n Il giocatore paga € %f a %s. Tocca al giocatore successivo", (*puntcorr).soldi, (*giocatore).nome);
    printf("\n Soldi rimanenti: € $f", (*puntcorr2).soldi);

    /* Guardo se va in bancarotta */
    if ((*puntcorr2).soldi <= 0 )
    {
    ingioco[gioc] = 0;
    gioc_ingioco --;
    printf("\n Il giocatore è in bancarotta, quindi è fuori");
    }
    }

    } // Chiudo If
    } //Chiudo for turno di gioco
    } // Chiudo While, resta un solo giocatore

    printf("\n\n FINE PARTITA! ");
    printf("\n\n Vince %s con € %f", (*puntcorr2).nome,(*puntcorr2).soldi);

    system("PAUSE");
    return 0;
    }



    Gli errori che mi da sono abbastanza incerti... ho compitato 3 volte di fila senza fare niente... da 17 sono passato a 14 e poi a 11 errori...

    b:\bak\scuola\tlp\mon.cpp: In function `int main()':
    b:\bak\scuola\tlp\mon.cpp:51: implicit declaration of function `int randomize(...)'
    b:\bak\scuola\tlp\mon.cpp:92: parse error before `('
    b:\bak\scuola\tlp\mon.cpp:94: request for member `nome' in `puntcorr', which is of non-aggregate type `casella *'
    b:\bak\scuola\tlp\mon.cpp:94: request for member `nome' in `puntcorr2', which is of non-aggregate type `giocatori *'
    b:\bak\scuola\tlp\mon.cpp:95: request for member `soldi' in `puntcorr', which is of non-aggregate type `casella *'
    b:\bak\scuola\tlp\mon.cpp:150: `puntorr2' undeclared (first use this function)
    b:\bak\scuola\tlp\mon.cpp:150: (Each undeclared identifier is reported only once
    b:\bak\scuola\tlp\mon.cpp:150: for each function it appears in.)
    b:\bak\scuola\tlp\mon.cpp:155: empty character constant
    b:\bak\scuola\tlp\mon.cpp:165: parse error before `('
    b:\bak\scuola\tlp\mon.cpp:192: confused by earlier errors, bailing out



    il link è sempre lo stesso.... www.bak86.altervista.org/mon.cpp

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    36
    lasciate perdere il listato.. scaricate il file... sono sceso a 3 errori

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    36
    Risolto tutto!! almeno credo.... non da nessun errore...

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.