Problema con il movimento dei giocatori nella matrice

di il
1 risposte

Problema con il movimento dei giocatori nella matrice

Salve a tutti , ho un problema con il movimento dei giocatori quando lanciano i dadi al secondo turno. Praticamente ho :

Matrice del terreno comune:
B //9 A //10  A //11 A R 
Z //8                              V 
Z //7                             
N //6                            
V  //5                             Z 
V  //4                             
R //3  P// 2 P //1   (P //giocatore 1 si trova qui al primo round effettuando somma 11 si dovrebbe poi trovare a A // 11  ) R

Al primo round mi trovo con tutte le posizioni però poi succede questo:

Second Round - Turno di Giocatore 1:
Parti dalla posizione (6, 3)
Hai tirato: 6 e 5. Totale: 11
Ti trovi ora alla posizione (6, 2) - Casella: P // in questo caso il giocatore 1 si trova a (6,3) ma dopo il lancio dei dadi del secondo turno si trova a (6,2) com'è possibile ?  // commento nella matrice quello che dovrebbe succedere (allego anche codice sotto)

Second Round - Turno di Giocatore 2:
Parti dalla posizione (4, 4)
Hai tirato: 5 e 6. Totale: 11
Ti trovi ora alla posizione (5, 0) - Casella: V

Second Round - Turno di Giocatore 3:
Parti dalla posizione (4, 4)
Hai tirato: 4 e 1. Totale: 5
Ti trovi ora alla posizione (5, 4) - Casella: Z

Second Round - Turno di Giocatore 4:
Parti dalla posizione (2, 4)
Hai tirato: 4 e 2. Totale: 6
Ti trovi ora alla posizione (4, 4) - Casella: Z

Second Round - Turno di Giocatore 5:
Parti dalla posizione (1, 4)
Hai tirato: 3 e 3. Totale: 6
Ti trovi ora alla posizione (3, 4) - Casella: N

Second Round - Turno di Giocatore 6:
Parti dalla posizione (0, 4)
Hai tirato: 6 e 2. Totale: 8
Ti trovi ora alla posizione (4, 4) - Casella: Z  

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define NUM_GIOCATORI 6
#define SOLDI_INIZIALI 100

#define HEIGHT 7
#define WIDTH 5

struct Giocatore {
    char nome[50];
    int soldi;
    char terreni[2][7];
    int posX; // Aggiungi la coordinata X
    int posY; // Aggiungi la coordinata Y
};


int calcolaValoreTerreno(char colore) {
    int valore = 0;
    switch (colore) {
        case 'A': valore = 2; break;
        case 'V': valore = 4; break;
        case 'R': valore = 5; break;
        case 'N': valore = 3; break;
        case 'Z': valore = 1; break;
        case 'P': valore = 6; break;
        default: break;
    }
    return valore;
}

void printColoredChar(char c) {
    switch (c) {
        case 'A':
            printf("\033[38;5;208m%c\033[0m ", c); // Orange (A)
            break;
        case 'V':
            printf("\033[38;5;45m%c\033[0m ", c); // Violet (V)
            break;
        case 'R':
            printf("\033[38;5;160m%c\033[0m ", c); // Red (R)
            break;
        case 'N':
            printf("\033[38;5;0m%c\033[0m ", c); // Black (N)
            break;
        case 'Z':
            printf("\033[38;5;39m%c\033[0m ", c); // Azzurro (Azure) (Z)
            break;
        case 'P':
            printf("\033[38;5;165m%c\033[0m ", c); // Purple (P)
            break;
        case 'B':
            printf("\033[38;5;15m%c\033[0m ", c); // White (B)
            break;
        default:
            printf("%c ", c); // Default color
            break;
    }
}

void muoviGiocatore(int *posX, int *posY, int sommaDadi) {
    int start = *posX + *posY * WIDTH;
    
    int M = (HEIGHT + WIDTH) * 2 - 4;
   
    int k = (start + sommaDadi) % M;
    
    int pos = -1;
    if (k < WIDTH) pos = k;
    else if (k < (HEIGHT + WIDTH - 2)) pos = k * WIDTH - (WIDTH - 1) * (WIDTH - 1);
    else if (k < (HEIGHT + WIDTH * 2 - 3)) pos =  (M - k) + (HEIGHT - 1) * (WIDTH - 1);
    else if (k < M) pos = (M - k) * WIDTH;
    
    *posX = pos / WIDTH;
    *posY = pos % WIDTH;
}



int main() {
    srand(time(NULL));
    char nomi_giocatori[NUM_GIOCATORI][50] = {
        "Giocatore 1", "Giocatore 2", "Giocatore 3",
        "Giocatore 4", "Giocatore 5", "Giocatore 6"
    };

    struct Giocatore giocatori[NUM_GIOCATORI]; // Definizione dell'array giocatori

    for (int i = 0; i < NUM_GIOCATORI; ++i) {
        strcpy(giocatori[i].nome, nomi_giocatori[i]);
        giocatori[i].soldi = SOLDI_INIZIALI;
        giocatori[i].posX = 0; // Inizializza posX a 0
        giocatori[i].posY = 0; // Inizializza posY a 0
    }


    char terreno_comune[7][5] = {
        {'B', 'A', 'A', 'A', 'R'},
        {'Z', ' ', ' ', ' ', 'V'},
        {'Z', ' ', ' ', ' ', 'V'},
        {'N', ' ', ' ', ' ', 'N'},
        {'V', ' ', ' ', ' ', 'Z'},
        {'V', ' ', ' ', ' ', 'Z'},
        {'R', 'P', 'P', 'P', 'R'}
    };

    printf("Matrice del terreno comune:\n");
    for (int i = 0; i < 7; ++i) {
        for (int j = 0; j < 5; ++j) {
            printColoredChar(terreno_comune[i][j]);
        }
        printf("\n");
    }
    printf("\n");

    struct FinalPositions {
        int x;
        int y;
    };

    struct FinalPositions finalPositions[NUM_GIOCATORI];

    // First round loop
    for (int i = 0; i < NUM_GIOCATORI; ++i) {
        printf("Turno di %s:\n", giocatori[i].nome);
        int posX = 0, posY = 0; // Impostazione della posizione iniziale a (0, 0)

        int dado1 = (rand() % 6) + 1;
        int dado2 = (rand() % 6) + 1;
        int sommaDadi = dado1 + dado2;

        printf("Hai tirato: %d e %d. Totale: %d\n", dado1, dado2, sommaDadi);

        muoviGiocatore(&posX, &posY, sommaDadi); // Muovi il giocatore in base alla somma dei dadi
        printf("Ti trovi ora alla posizione (%d, %d) - Casella: ", posX, posY);
        printColoredChar(terreno_comune[posX][posY]);
        printf("\n\n");

        // Aggiorna la posizione del giocatore nel tuo array di giocatori
        giocatori[i].posX = posX;
        giocatori[i].posY = posY;

        // Store final positions after the first round
        finalPositions[i].x = posX;
        finalPositions[i].y = posY;
    }

    // Second round loop
for (int i = 0; i < NUM_GIOCATORI; ++i) {
    printf("Second Round - Turno di %s:\n", giocatori[i].nome);

    int posX = finalPositions[i].x;
    int posY = finalPositions[i].y;

    printf("Parti dalla posizione (%d, %d)\n", posX, posY);

    int dado1 = (rand() % 6) + 1;
    int dado2 = (rand() % 6) + 1;
    int sommaDadi = dado1 + dado2;

    printf("Hai tirato: %d e %d. Totale: %d\n", dado1, dado2, sommaDadi);

    muoviGiocatore(&posX, &posY, sommaDadi); // Move the player based on the dice roll
    printf("Ti trovi ora alla posizione (%d, %d) - Casella: ", posX, posY);
    printColoredChar(terreno_comune[posX][posY]);
    printf("\n\n");

    // Update the position of the player in the array of players
    giocatori[i].posX = posX;
    giocatori[i].posY = posY;
}


    return 0;
}

1 Risposte

  • Re: Problema con il movimento dei giocatori nella matrice

    Allora vediamo se ho capito cosa vuoi fare dalla tua "descrizione".. :D 

    Mi sembra una specie di monopoly? 

    Prova a separare il codice della logica, da quello di stato e da quello di rendering vedrai che poi diventa più facile

    Il giocatore non ha bisogno di conoscere la sua posizione x,y o la mappa dato che si muove monodimensionalmente:

    struct Player {
        char name[50];
        int money;
        int pos;
    };

    Può essere utile anche definire una struttura cella e mappa, anche qui non ci interessano le 2 dimensioni.. quelle ci interessano solo nello step di rendering..:

    struct Cell {
        char name;
        int cost;
    };
    
    struct Map {
        struct Cell cells[20];
    };

    La mappa la puoi quindi inizializzare così:

    struct Map map = { .cells = {
            {'R', 5}, {'P', 6}, {'P', 6}, {'P', 6}, {'R', 5},
            {'V', 4}, {'V', 4}, {'N', 3}, {'Z', 1}, {'Z', 1},
            {'B', 1}, {'A', 2}, {'A', 2}, {'A', 2}, {'R', 5},
            {'V', 4}, {'V', 4}, {'N', 3}, {'Z', 1}, {'Z', 1}
    }};

    Anche i giocatori li puoi inizializzare in maniera bella compatta e pulita:

    struct Player players[3] = {
            {"Bob", 500, 0},
            {"Alice", 500, 0},
            {"Fausto", 500, 0}
    };

    Ora per il main un po' di pseudocodice da “riempire”:

    int main() {
    	while (true) {
    		for each player {
    			int move = throw_2D6()
    			player_move(player, move)
    		}
    
    		render_to_console();
    	}
    }

    Vedi se questa struttura ti aiuta a strutturare meglio il problema 

Devi accedere o registrarti per scrivere nel forum
1 risposte