Ultimo problema Monopoly in C

di il
3 risposte

Ultimo problema Monopoly in C

Buon pomeriggio ragazzi, alcuni giorni fa scrissi per il problema del loop del monopoly..ho risolto quasi tutto, ma ho un ultimo problema. Nell'esecuzione, quando un giocatore va una casella non sua, paga a sè stesso. un aiutino? vi posto il codice:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <conio.h>

typedef struct giocatore{
    char nome[10];
    int soldi;
    int terr_pos[3];
    int pos;
    int bk;

}Giocatore;

void gioco(int scacchiera[7][5], Giocatore player[]);
int ricerca(Giocatore player[], int dado);
int ricerca_Winner(Giocatore player[]);

Giocatore player[6];
    void main(){
    srand(time(NULL));
    int i,j,ro=0,end=0;
    int scacchiera[7][5]={{1,2,3,4,5},       //via,     arancione, arancione, arancione, rosso,
                         {20,0,0,0,6},       //azzurro, N/A,      N/A,        N/A,       verde,
                         {19,0,0,0,7},       //azzurro, N/A,      N/A,        N/A,       verde,
                         {18,0,0,0,8},       //nero,    N/A,      N/A,        N/A,       nero,
                         {17,0,0,0,9},       //verde,   N/A,      N/A,        N/A,       azzurro,
                         {16,0,0,0,10},      //verde,   N/A,      N/A,        N/A,       azzurro,
                         {15,14,13,12,11}};  //rosso,   viola,    viola,      viola,     rosso.
    int terreni[19]={2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
        for(int i=0; i<7; i++){
            for(int j=0; j<5; j++){
                printf("| %d |", scacchiera[i][j]);
        }
        printf("\n");
        }
        for(int i=0;i<6;i++) {
            printf("Mettere il nome del giocatore %i : ", i+1);
            gets(player[i].nome);
            player[i].soldi=100;
            player[i].pos=1;
        }
            for(i=0;i<6;i++){
                for(j=0;j<3;j++){
                    do{
                        ro=rand()%19;
                        if(terreni[ro]==0){
                            end=1;
                        }else{
                            player[i].terr_pos[j]=terreni[ro];
                            terreni[ro]=0;
                            end=0;
                        }
                    }while(end==1);
                }
            }

     for(i=0;i<6;i++){
        printf("%s ha come terreni :", player[i].nome);
        for(j=0;j<3;j++){
        printf(" %d", player[i].terr_pos[j]);
        }
        printf("\n");
    }
    gioco(scacchiera,player);
       }

void gioco(int scacchiera[7][5], Giocatore player[]){
 int inizio,i,dadou,dadod,dado,bk,win=0,z,t;
  inizio=rand()%6;
 i=inizio;

 printf("Inizia %s\n", player[i].nome);

 do {
  if (i>5) {
    i=0;
  }
  if(player[i].bk!=1 && win<5){
  printf("Tocca a %s\n", player[i].nome);
  dado=0;
  dadou=1+rand()%6;
  dadod=1+rand()%6;
  dado=dadou+dadod;
    player[i].pos=player[i].pos+dado;
  if (player[i].pos>20){
    player[i].pos=player[i].pos-20;
  }

  if (player[i].pos>=2 && player[i].pos<=4){
            for (int j=0; j<3; j++){
            if (player[i].terr_pos[j]>=2 && player[i].terr_pos[j]<=4) {
                printf("La Casella in cui %s e' finito  e' sua. \n", player[i].nome);
                j=3;
                }
                else
                if (player[i].terr_pos[j]!=2 || player[i].terr_pos[j]!=3 || player[i].terr_pos[j]!=4) {
                    z=ricerca(player,dado);
                    if(player[z].bk==1){
                        j=3;
                    }
             if(player[z].soldi<=0){
             j=3;
             }else
                 if(player[z].soldi>0){
                 printf("Mi dispiace %s, sei caduto su una casella non tua.. \n", player[i].nome);
                 printf("Sei caduto sulla casella arancione quindi paghi 2 euro a %s \n", player[z].nome);
                 player[i].soldi=player[i].soldi-2;
                 player[z].soldi=player[z].soldi+2;
                 printf("%s ha %d soldi.\n", player[i].nome, player[i].soldi);
                 j=3;
                }
                }
             }

    }

    if (player[i].pos==5 || player[i].pos==11 || player[i].pos==15){
            for (int j=0; j<3; j++){
            if (player[i].terr_pos[j]==5 || player[i].terr_pos[j]==11 || player[i].terr_pos[j]==15) {
                printf("La Casella in cui %s e' finito  e' sua.\n", player[i].nome);
                j=3;
             }
             else
             if (player[i].terr_pos[j]!=5 || player[i].terr_pos[j]!=11 || player[i].terr_pos[j]!=15) {
                    z=ricerca(player,dado);
                    if(player[z].bk==1){
                        j=3;
                    }
             if(player[z].soldi<=0){
             j=3;
             }else
             if(player[z].soldi>0){
             printf("Mi dispiace %s, sei caduto su una casella non tua.. \n", player[i].nome);
             printf("Sei caduto sulla casella rossa quindi paghi 5 euro a %s \n", player[z].nome);
             player[i].soldi=player[i].soldi-5;
             player[z].soldi=player[z].soldi+5;
             printf("%s ha %d soldi.\n", player[i].nome, player[i].soldi);
             j=3;
             }
             }
             }

    }

    if (player[i].pos==6 || player[i].pos==7 || player[i].pos==16 || player[i].pos==17){
            for (int j=0; j<3; j++){
            if (player[i].terr_pos[j]==6 || player[i].terr_pos[j]==7 || player[i].terr_pos[j]==16 || player[i].terr_pos[j]==17) {
                printf("La Casella in cui %s e' finito  e' sua.\n", player[i].nome);
                j=3;
            }
            else
            if (player[i].terr_pos[j]!=6 || player[i].terr_pos[j]!=7 || player[i].terr_pos[j]!=16 || player[i].terr_pos[j]!=17) {
                    z=ricerca(player,dado);
                    if(player[z].bk==1){
                        j=3;
                    }
             if(player[z].soldi<=0){
             j=3;
             }else
             if(player[z].soldi>0){
             printf("Mi dispiace %s, sei caduto su una casella non tua.. \n", player[i].nome);
             printf("Sei caduto sulla casella verde quindi paghi 4 euro a %s \n", player[z].nome);
             player[i].soldi=player[i].soldi-4;
             player[z].soldi=player[z].soldi+4;
             printf("%s ha %d soldi.\n", player[i].nome, player[i].soldi);
            j=3;
            }
            }
            }

  }
    if (player[i].pos==8 || player[i].pos==18){
            for (int j=0; j<3; j++){
            if (player[i].terr_pos[j]==8 || player[i].terr_pos[j]==18) {
                printf("La Casella in cui %s e' finito  e' sua.\n", player[i].nome);
                j=3;
            }
            else
            if (player[i].terr_pos[j]!=8 || player[i].terr_pos[j]!=18) {
                    z=ricerca(player,dado);
                    if(player[z].bk==1){
                        j=3;
                    }
             if(player[z].soldi<=0){
             j=3;
             }else
             if(player[z].soldi>0){
             printf("Mi dispiace %s, sei caduto su una casella non tua.. \n", player[i].nome);
             printf("Sei caduto sulla casella nera quindi paghi 3 euro a %s \n", player[z].nome);
             player[i].soldi=player[i].soldi-3;
             player[z].soldi=player[z].soldi+3;
             printf("%s ha %d soldi.\n", player[i].nome, player[i].soldi);
             j=3;
            }
            }
            }

  }

    if (player[i].pos==9 || player[i].pos==10 || player[i].pos==19 || player[i].pos==20){
            for (int j=0; j<3; j++){
            if (player[i].terr_pos[j]==9 || player[i].terr_pos[j]==10 || player[i].terr_pos[j]==19 || player[i].terr_pos[j]==20) {
                printf("La Casella in cui %s e' finito  e' sua.\n", player[i].nome);
                j=3;
            }
            else
            if (player[i].pos!=9 || player[i].pos!=10 || player[i].pos!=19 || player[i].pos!=20) {
                    z=ricerca(player,dado);
                    if(player[z].bk==1){
                        j=3;
                    }
             if(player[z].soldi<=0){
             j=3;
             }else
             if(player[z].soldi>0){
             printf("Mi dispiace %s, sei caduto su una casella non tua.. \n", player[i].nome);
             printf("Sei caduto sulla casella azzurra quindi paghi 1 euro a %s \n", player[z].nome);
             player[i].soldi=player[i].soldi-1;
             player[z].soldi=player[z].soldi+1;
             printf("%s ha %d soldi.\n", player[i].nome, player[i].soldi);
             j=3;
             }
             }
             }

  }
    if (player[i].pos>=12 && player[i].pos<=14){
            for (int j=0; j<3; j++){
            if (player[i].terr_pos[j]>=12 && player[i].terr_pos[j]<=14) {
                printf("La Casella in cui %s e' finito  e' sua.\n", player[i].nome);
                j=3;
            }
            else
            if (player[i].terr_pos[j]!=12 || player[i].terr_pos[j]!=13 || player[i].terr_pos[j]!=14) {
                    z=ricerca(player,dado);
                    if(player[z].bk==1){
                        j=3;
                    }
             if(player[z].soldi<=0){
             j=3;
             }else
             if(player[z].soldi>0){
             printf("Mi dispiace %s, sei caduto su una casella non tua.. \n", player[i].nome);
             printf("Sei caduto sulla casella viola quindi paghi 6 euro a %s \n", player[z].nome);
             player[i].soldi=player[i].soldi-6;
             player[z].soldi=player[z].soldi+6;
             printf("%s ha %d soldi.\n", player[i].nome, player[i].soldi);
             j=3;
            }
            }
            }
   }
   win=0;
   for (int i=0; i<6; i++) {
    if (player[i].soldi<=0) {
        player[i].bk=1;
        win++;
   }
   }
  }
  i++;
  }while(win<5);
  if (win=4) {
    int t=ricerca_Winner(player);
    printf("Ha vinto il Giocatore %s con %d soldi.\n", player[t].nome, player[t].soldi);
   }
  }
  int ricerca(Giocatore player[], int dado) {
            for(int i=0; i<6; i++){
                for(int j=0; j<3; j++){
                  if (player[i].terr_pos[j]==player[i].pos){
                    return i;
                  }else
                  if (player[i].soldi<=0){
                  player[i].bk=1;
                  return 0;
                  }
                }
}
}

int ricerca_Winner(Giocatore player[]) {
int vincitore;
vincitore=0;
for (int i=0; i<6; i++) {
    if( player[i].bk!=1)
    vincitore=i;
}
return vincitore;
}
In esecuzione mostra così invece

Tocca a A
Mi dispiace A, sei caduto su una casella non tua..
Sei caduto sulla casella viola quindi paghi 6 euro a A
A ha 575 soldi.
Tocca a B
Mi dispiace B, sei caduto su una casella non tua..
Sei caduto sulla casella nera quindi paghi 3 euro a A


In pratica A si paga da sola.
grazie in anticipo!

3 Risposte

  • Re: Ultimo problema Monopoly in C

    Mi pare ovvio che devi confrontare i con z ed eseguire il pagamento solo se i != z
    
    if(i != z) {
      ...
    }
    
  • Re: Ultimo problema Monopoly in C

    Come patch potresti fare un else con messaggio personalizzato quando i == z; i calcoli li puoi anche lasciare dato che i soldi vanno allo stesso player.

    Comunque sembrerebbe un sintomo di debolezza architetturale del programma. Possibile che non sia stato previsto a monte che un giocatore possa cadere su una casella che gli appartiene? Anche il fatto che il codice incriminato passi sotto un "else if(player[z].soldi>0)", quando sarebbe bastato un semplice "else", è un sintomo di idee un po' confuse.

    Rivedi un po' l'impianto generale.

    EDIT: vabbè come al solito Oregon mi ha anticipato Comunque l'errore è quello
  • Re: Ultimo problema Monopoly in C

    Mi trovo, ragazzi! vi ringrazio entrambi infinitamente per l'aiuto! ??
Devi accedere o registrarti per scrivere nel forum
3 risposte