RISOLTO Movimento C

Pubblicità
Stato
Discussione chiusa ad ulteriori risposte.
Ho aggiornato il programma con una nuova funzione che aggiorna la posizione del player con le cordinate nuove *pos_x e *pos_y la funzione si chiama void new_pos e l'ho richiamata nel main prima della funzione visualizza_campo. Purtroppo la traccia vuole che ad ogni movimento il campo venga ristampato se no avrei fatto come consigliavi te DispatchCode. Ora dopo l'aggiunta della funzione nuova mi crasha dopo aver inserito la direzione desiderata.
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void genera_campo(char campo[10][10],int pos_x,int pos_y);
void visualizza_campo(char campo[10][10]);
void movimento_player(char campo[10][10],int *pos_x,int *pos_y,int direzione);
void new_pos(char campo[10][10],int *pos_x, int *pos_y);

int main()
{

    char campo[10][10];
    int pos_x;
    int pos_y;
    int direzione;

    srand(time(NULL));



genera_campo(campo,pos_x,pos_y);
visualizza_campo(campo);
movimento_player(campo,&pos_x,&pos_y,direzione);
new_pos(campo,&pos_x,&pos_y);
visualizza_campo(campo);



    return 0;
}

void genera_campo(char campo[10][10],int pos_x, int pos_y)
{

    int i,j,k=0;

    for(i=0;i<10;i++)
    {
        for(j=0;j<10;j++)
        {
            campo[i][j]='*';
        }
    }


    {

        i=rand()%10;
        j=rand()%10;
        pos_x=i;
        pos_y=j;
        if(campo[i][j]=='*')
           {
              campo[i][j]='o';
                k++;
           }

}
}

void visualizza_campo(char campo[10][10])
{
    int i,j;

    for(i=0;i<10;i++)
    {
        for(j=0;j<10;j++)
        {
            printf("%c ",campo[i][j]);
        }
        printf("\n");
    }
}

void movimento_player(char campo[10][10],int *pos_x,int *pos_y,int direzione)
{

    printf("\nIn che direzione vorresti muoverti: ?\n");
    printf("\npremi 1 per andare su, 2 per andare giu', 3 per andare a destra e 4 per andare a sinistra: \n");
    scanf("%d",&direzione);


    if(direzione<1 || direzione>4)
    {
        printf("\nErrore digita un numero compreso tra 1 e 4\n");
        return;
    }


    switch (direzione)
    {
    case 1:
        pos_x--;
        break;
    case 2:
        pos_x++;
        break;
    case 3:
        pos_y++;
        break;
    case 4:
        pos_y--;
        break;
    }
}

void new_pos(char campo[10][10],int *pos_x,int *pos_y)
{
    int i,j,k=0;

    for(i=0;i<10;i++)
    {
        for(j=0;j<10;j++)
        {
            campo[i][j]='*';
        }
    }
        i=*pos_x;
        j=*pos_y;

        if(campo[i][j]=='*')
        {
            campo[i][j]='o';
        }

}

[\CODE]
 
Non capisco perchè continui a ripetere quel ciclo che assegna '*'... così facendo perderesti tutti le "mosse".
Ci sono un sacco di cose che non vanno. genera_campo non altera il valore di pos_x e pos_y, vale sempre lo stesso discorso.
Hai già creato "movimento_player", che dal nome farebbe intuire il suo compito. Puoi usare quella direttamente, senza fare passaggi inutili. Quindi non ti serve nemmeno passare le variabili per riferimento.

Te l'ho corretto:

C:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void genera_campo(char campo[10][10],int *pos_x,int *pos_y);
void visualizza_campo(char campo[10][10]);
void movimento_player(char campo[10][10],int pos_x,int pos_y,int direzione);


int main()
{

    char campo[10][10];
    int pos_x;
    int pos_y;
    int direzione;

    srand(time(NULL));

    genera_campo(campo,&pos_x,&pos_y);
    visualizza_campo(campo);
    movimento_player(campo,pos_x,pos_y,direzione);
    visualizza_campo(campo);



    return 0;
}

void genera_campo(char campo[10][10],int *pos_x, int *pos_y)
{
    int i,j;

    for(i=0;i<10;i++)
    {
        for(j=0;j<10;j++)
        {
            campo[i][j]='*';
        }
    }

    *pos_x = rand()%10;
    *pos_y = rand()%10;

    if(campo[ *pos_x][ *pos_y]=='*')
    {
        campo[ *pos_x][ *pos_y]='o';
    }
  
}

void visualizza_campo(char campo[10][10])
{
    int i,j;

    for(i=0;i<10;i++)
    {
        for(j=0;j<10;j++)
        {
            printf("%c ",campo[i][j]);
        }
        printf("\n");
    }
}

void movimento_player(char campo[10][10],int pos_x,int pos_y,int direzione)
{

    printf("\nIn che direzione vorresti muoverti: ?\n");
    printf("\npremi 1 per andare su, 2 per andare giu', 3 per andare a destra e 4 per andare a sinistra: \n");
    scanf("%d",&direzione);


    if(direzione<1 || direzione>4)
    {
        printf("\nErrore digita un numero compreso tra 1 e 4\n");
        return;
    }


    switch (direzione)
    {
    case 1:
        pos_x--;
        break;
    case 2:
        pos_x++;
        break;
    case 3:
        pos_y++;
        break;
    case 4:
        pos_y--;
        break;
    }
  
    campo[pos_x][pos_y] = 'o';
  
}
 
Si ora vedendo mi e' tutto chiaro. Ora devo solo capire come cancellare il vecchio "o" perché ora con la tua modifica si sposta ma rimane anche il vecchio player sul campo. Forse dovrei usare system("cls") ?
 
Ultima modifica:
Dovrebbe essere sufficiente questo in realtà:

C:
void movimento_player(char campo[10][10],int pos_x,int pos_y,int direzione)
{

    printf("\nIn che direzione vorresti muoverti: ?\n");
    printf("\npremi 1 per andare su, 2 per andare giu', 3 per andare a destra e 4 per andare a sinistra: \n");
    scanf("%d",&direzione);


    if(direzione<1 || direzione>4)
    {
        printf("\nErrore digita un numero compreso tra 1 e 4\n");
        return;
    }

    campo[pos_x][pos_y] = '*';

    switch (direzione)
    {
    case 1:
        pos_x--;
        break;
    case 2:
        pos_x++;
        break;
    case 3:
        pos_y++;
        break;
    case 4:
        pos_y--;
        break;
    }
    
    campo[pos_x][pos_y] = 'o';
    
}

hai già le posizioni del vecchio 'o', che sono quelle passate alla funzione. Quindi prima di modificarle le utilizzi per modificare la vecchia posizione.

system('cls') e funzioni di questo tipo evitale. Punto primo, la portabilità, e punto secondo - e molto importante - sono poco efficienti: https://www.tomshw.it/forum/threads/chisura-programma-c.691799/#post-6670320
Ma direcente mi sembra d'aver visto anche una risposta di Andretti in un altro topic, sempre su questo argomento.
 
MI vergogno ahahah sono imbarazzato. Ovviamente se ho la posizione precedente bastava mettergli '*' problema risolto. Non so che dire riguardando il codice mi sembra tutto cosi semplice ma sopratutto ovvio ma non c'è l'avrei fatta senza il tuo aiuto.Non so perché mi ma complicavo la vita da solo mettendo cose che non servivano ecc. E vero quando si dice che bisogna resettare completamente quando non si riesce ad andare avanti proprio perché non bisogna insistere su un concetto che magari è anche sbagliato come nel mio caso. Grazie di cuore :thanks: ora mi metto a lavoro e metto su tutto il programma.
 
Nessuna vergogna e nessun imbarazzo. Alla fine siamo tutti qui per imparare qualcosa e dare una mano, quando si può. ;)
 
L'ho inserita per il cliclo while. Il campo e 10x10 ed e' formato da '*' campo[ i ][ j ] sempre in quel campo deve creare una sola volta un 'o' che sarebbe il player e per far ciò ho bisogno della k=0 e incrementarla. In poche parole mi serve per inserire una sola volta nel campo il player. Sono un disastro a spiegare spero tu abbia capito.
Si, ho capito cosa vuoi dire, ma è un'implementazione quantomeno stravagante! K non serve.

Inviato dal mio Nexus 5 utilizzando Tapatalk
 
ci sono due grossi errori.
Il primo e' che in genera_campo, che calcola la posizione casuale del giocatore pos_x,posy, ma sono variabili che passi per valore e quindi non "ritornano" al main, in pratica lo stesso errore che hai fatto con il metodo movimento_player.
Il secondo e' nel metodo movimento_player, in cui passi il valore per indirizzo, ma poi motificgi il puntatore invece del puntato (!), devi usare il simbolo del puntatore * per cambiare il valore (ad esempio *pos_x += 1; )

Un altro errore e' che non controlli il valore della posizione, se e' gia' in uno dei valori limit (ossia 0 e 9) non la puoi cambiare in una direzione, per esempio se e' gia' zero non puoi andare a sinistra.

Passare il parametro 'direzione' non e' un errore, ma non server a nulla visto che la variabile e' usata solo internalmente al meodo movimento_player.

Un suggerimento: in genere quando si usano costanti non le si scrivono nel codice tutte le volte (con il rischio di sbagliare) ma le si definiscono una volra sola, in C usando la direttiva 'define':

Codice:
#define DIM 10
...
char campo[DIM][DIM];
...

EDIT: scusate sto arrivando tardi, ho letto il thread poi sono andato a mangiare, quando sono tornato non mi sono accorto che altri avevano risposto.
 
ci sono due grossi errori.
Il primo e' che in genera_campo, che calcola la posizione casuale del giocatore pos_x,posy, ma sono variabili che passi per valore e quindi non "ritornano" al main, in pratica lo stesso errore che hai fatto con il metodo movimento_player.
Il secondo e' nel metodo movimento_player, in cui passi il valore per indirizzo, ma poi motificgi il puntatore invece del puntato (!), devi usare il simbolo del puntatore * per cambiare il valore (ad esempio *pos_x += 1; )

Un altro errore e' che non controlli il valore della posizione, se e' gia' in uno dei valori limit (ossia 0 e 9) non la puoi cambiare in una direzione, per esempio se e' gia' zero non puoi andare a sinistra.

Passare il parametro 'direzione' non e' un errore, ma non server a nulla visto che la variabile e' usata solo internalmente al meodo movimento_player.

Un suggerimento: in genere quando si usano costanti non le si scrivono nel codice tutte le volte (con il rischio di sbagliare) ma le si definiscono una volra sola, in C usando la direttiva 'define':

Codice:
#define DIM 10
...
char campo[DIM][DIM];
...

EDIT: scusate sto arrivando tardi, ho letto il thread poi sono andato a mangiare, quando sono tornato non mi sono accorto che altri avevano risposto.
Figurati grazie lo stesso gentilissimo mi hanno spiegato la stessa cosa e vi ringrazio tutti.
 
Stato
Discussione chiusa ad ulteriori risposte.
Pubblicità
Pubblicità
Indietro
Top