[PROBLEMA] Movimento C

Dradkol

Nuovo Utente
62
22
Hardware Utente
CPU
i5 4670k @4.3 Mhz
Dissipatore
Artic freezer xtreme
Scheda Madre
MSI Z87-G43-GAMING
RAM
8GB DDR3
Scheda Video
Zotac gtx 1070 mini
Alimentatore
corsair 750w corsair tx750m
Case
Cooler Master full tower HAF 932 Advanced
Sistema Operativo
Windows 10
#1
Salve a tutti. Sono disperato sto lavorando a questo progetto da circa 5 mesi ed in pratica lo avrei anche finito tutto ma mi blocca un passaggio, il movimento.
Ci tengo a precisare che non sono uno di quelli che vuole che gli si facciano i programmi ecc voglio solo consigli utili e imparare.
LA traccia non vi serve in quanto non voglio che mi facciate il programma, sappiate solo che il mio problema e' muovere il "o" dentro il campo. Le ho provate tutte aiutatemi. Il programma e' il seguente. Come potete vedere il programma e' perfettamente funzionante tranne per il fatto che "o" il player rimane nella stessa posizione di prima.
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);

int main()
{

    char campo[10][10];
    int move;
    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,k=0;

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

  
    while(k<1)
    {
        i=rand()%10; // coordinate riga del player
        j=rand()%10; // coordinate colonna del player
        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++) // stampo il campo
    {
        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;
    }
}

Come potete vedere il programma e' perfettamente funzionante tranne per il fatto che "o" il player rimane nella stessa posizione di prima. AIUTO !
 
Ultima modifica:

rctimelines

Utente Attivo
2,793
704
Hardware Utente
CPU
i7 3770
Dissipatore
stock intel
Scheda Madre
Gigabyte GA-H67A-UD3H-B3
Hard Disk
SSD SAMSUNG 850EVO 250GB + HDD WD GREEN CAVIAR 2TB
RAM
16GB = Corsair XMS3 4x4GB DDR3 1600MHz CL9
Scheda Video
ATI Firepro V7900 2GB
Scheda Audio
Soundblaster X-Fi
Monitor
HP 27'' + Benq 19''
Sistema Operativo
Windows10-pro64/OpenSUSE-QL42.3/Manjaro-17.0.2-KDE
#2
A questo punto, nonostante le premesse, potevi postare tutto il codice in modo canonico (cioè dentro i tag "code") così almeno sarebbe stato più caro, magari con commenti inseriti invece che le tue riflessioni mescolate!

Inviato dal mio Nexus 5 utilizzando Tapatalk
 

Dradkol

Nuovo Utente
62
22
Hardware Utente
CPU
i5 4670k @4.3 Mhz
Dissipatore
Artic freezer xtreme
Scheda Madre
MSI Z87-G43-GAMING
RAM
8GB DDR3
Scheda Video
Zotac gtx 1070 mini
Alimentatore
corsair 750w corsair tx750m
Case
Cooler Master full tower HAF 932 Advanced
Sistema Operativo
Windows 10
#3
A questo punto, nonostante le premesse, potevi postare tutto il codice in modo canonico (cioè dentro i tag "code") così almeno sarebbe stato più caro, magari con commenti inseriti invece che le tue riflessioni mescolate!

Inviato dal mio Nexus 5 utilizzando Tapatalk
Si hai ragione, ma non hai consigli su come posso risolvere il mio problema ?
 
398
254
Hardware Utente
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
Hard Disk
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
Scheda Video
Nvidia Geforce GTX 960M, 4GB
Scheda Audio
Realtek
Sistema Operativo
Windows 10 64bit
#4
Ci lavori da 5 mesi...?
Come ti è già stato detto, usa almeno il tag CODE. :)
Inoltre quando si espone un problema si danno tutti i dettagli, mostrando le parti di codice interessate. In questo modo è necessario leggere tutto solo per comprendere il contesto, senza tuttavia capire nemmeno quale sia esattamente il problema.
Cosa non va? Sicuramente da "movimento_player", non puoi aspettarti movimenti del player dopo incrementi/decrementi, in quanto quelle variabili esistono solo localmente in quella funzione.
 

Dradkol

Nuovo Utente
62
22
Hardware Utente
CPU
i5 4670k @4.3 Mhz
Dissipatore
Artic freezer xtreme
Scheda Madre
MSI Z87-G43-GAMING
RAM
8GB DDR3
Scheda Video
Zotac gtx 1070 mini
Alimentatore
corsair 750w corsair tx750m
Case
Cooler Master full tower HAF 932 Advanced
Sistema Operativo
Windows 10
#5
Ci lavori da 5 mesi...?
Come ti è già stato detto, usa almeno il tag CODE. :)
Inoltre quando si espone un problema si danno tutti i dettagli, mostrando le parti di codice interessate. In questo modo è necessario leggere tutto solo per comprendere il contesto, senza tuttavia capire nemmeno quale sia esattamente il problema.
Cosa non va? Sicuramente da "movimento_player", non puoi aspettarti movimenti del player dopo incrementi/decrementi, in quanto quelle variabili esistono solo localmente in quella funzione.
Capisco e mi dispiace molto ma non saprei come usare il tag code. Scusate la mia ignoranza in materia :( mi piacerebbe capire come fare.
Si 5 mesi tra prendi e molla ho finito tutto il programma, ho generato le buche vincenti, le buche perdenti e le trappole nel campo. Ho fatto in modo che quando il player tocca il limite del campo viene rimesso in modo random nel campo nello stesso lato dove era uscito, ho creato il loop per i 50 tentativi e anche come da traccia ad ogni lancio del giocatore c'è un 20% di possibilità che il player invece di spostarsi nella direzione indicata si sposta in un altra delle quattro direzioni casuali ecc. Ho studiato e visto tantissime guide ma nessuna spiega come creare un gioco e quindi eccomi qui bloccato con il movimento. Penso che mi sto perdendo in un bicchiere d'acqua ma senza un piccolo aiuto penso di annegarci in quel bicchiere.
 
Ultima modifica:
398
254
Hardware Utente
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
Hard Disk
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
Scheda Video
Nvidia Geforce GTX 960M, 4GB
Scheda Audio
Realtek
Sistema Operativo
Windows 10 64bit
#6

Dradkol

Nuovo Utente
62
22
Hardware Utente
CPU
i5 4670k @4.3 Mhz
Dissipatore
Artic freezer xtreme
Scheda Madre
MSI Z87-G43-GAMING
RAM
8GB DDR3
Scheda Video
Zotac gtx 1070 mini
Alimentatore
corsair 750w corsair tx750m
Case
Cooler Master full tower HAF 932 Advanced
Sistema Operativo
Windows 10
#7
E' un normalissimo tag BBCode: https://www.tomshw.it/forum/threads...ggere-prima-di-creare-una-discussione.597452/

Tornando al problema: dici che dopo "movimento_player", il giocatore non si muove. E' più chiaro perchè non si muove? E cosa non ti torna, nel caso?
Intanto grazie mille per la spiegazione del tag code anche se mi modifica leggermente il codice mi aggiunge questo [/I][/I][/I][/I]
e che io non ho inserito.
Tornando al programma una volta avviato il programma stampa a video il campo con il player che sarebbe "o" e viene chiesto all'utente di inserire una delle quattro direzioni. Una volta inserito una direzione stampa di nuovo il campo ( come richiesto dalla traccia ) ma il player "o" rimane nella stessa posizione di prima. Ho provato a salvare le posizioni nelle variabili pos_x e pos_y ma niente.
 
398
254
Hardware Utente
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
Hard Disk
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
Scheda Video
Nvidia Geforce GTX 960M, 4GB
Scheda Audio
Realtek
Sistema Operativo
Windows 10 64bit
#8
Ricopia il sorgente originale, cancella quello attuale, ed incolla. Dovresti risolvere. Poi puoi anche specificare il linguaggio volendo, così la sintassi risulterà evidenziata.

Comunque è normale non ci siano movimenti, le variabili sono passate per valore; viene fatta una copia del contenuto, e passata alla funzione. Se ti servono i nuovi valori, hai alcune strade: ad esempio facendo tornare un tipo composto (una struttura), oppure passando quei parametri per riferimento. In questo ultimo caso viene passato l'indirizzo della variabile, e non il suo contenuto.
 
Mi Piace: Dradkol

Dradkol

Nuovo Utente
62
22
Hardware Utente
CPU
i5 4670k @4.3 Mhz
Dissipatore
Artic freezer xtreme
Scheda Madre
MSI Z87-G43-GAMING
RAM
8GB DDR3
Scheda Video
Zotac gtx 1070 mini
Alimentatore
corsair 750w corsair tx750m
Case
Cooler Master full tower HAF 932 Advanced
Sistema Operativo
Windows 10
#9
Ricopia il sorgente originale, cancella quello attuale, ed incolla. Dovresti risolvere. Poi puoi anche specificare il linguaggio volendo, così la sintassi risulterà evidenziata.

Comunque è normale non ci siano movimenti, le variabili sono passate per valore; viene fatta una copia del contenuto, e passata alla funzione. Se ti servono i nuovi valori, hai alcune strade: ad esempio facendo tornare un tipo composto (una struttura), oppure passando quei parametri per riferimento. In questo ultimo caso viene passato l'indirizzo della variabile, e non il suo contenuto.
Grazie risolto con il tag code. Nel caso della struttura ci ho provato ma avevo problemi nel usarla nella funzione. Per quanto riguarda passarli per riferimento ti riferisci ai puntatori ?
 
398
254
Hardware Utente
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
Hard Disk
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
Scheda Video
Nvidia Geforce GTX 960M, 4GB
Scheda Audio
Realtek
Sistema Operativo
Windows 10 64bit
#10
Si, esatto.
Diventerà quindi:

C:
void movimento_player(char campo[10][10],int *pos_x,int *pos_y,int direzione)
e la chiamata avverà quindi così:

C:
movimento_player(campo,&pos_x,&pos_y,direzione);
 
Mi Piace: Dradkol

Dradkol

Nuovo Utente
62
22
Hardware Utente
CPU
i5 4670k @4.3 Mhz
Dissipatore
Artic freezer xtreme
Scheda Madre
MSI Z87-G43-GAMING
RAM
8GB DDR3
Scheda Video
Zotac gtx 1070 mini
Alimentatore
corsair 750w corsair tx750m
Case
Cooler Master full tower HAF 932 Advanced
Sistema Operativo
Windows 10
#11
Si, esatto.
Diventerà quindi:

C:
void movimento_player(char campo[10][10],int *pos_x,int *pos_y,int direzione)
e la chiamata avverà quindi così:

C:
movimento_player(campo,&pos_x,&pos_y,direzione);
Perché non ci avevo pensato :cav: Intanto ti ringrazio di cuore dico sul serio sei stato gentilissimo e hai avuto molta pazienza. Grazie ora provo e faccio sapere se funziona.
 

rctimelines

Utente Attivo
2,793
704
Hardware Utente
CPU
i7 3770
Dissipatore
stock intel
Scheda Madre
Gigabyte GA-H67A-UD3H-B3
Hard Disk
SSD SAMSUNG 850EVO 250GB + HDD WD GREEN CAVIAR 2TB
RAM
16GB = Corsair XMS3 4x4GB DDR3 1600MHz CL9
Scheda Video
ATI Firepro V7900 2GB
Scheda Audio
Soundblaster X-Fi
Monitor
HP 27'' + Benq 19''
Sistema Operativo
Windows10-pro64/OpenSUSE-QL42.3/Manjaro-17.0.2-KDE
#12
Scusa l'ignoranza, ma non capisco il senso della variabile k nella procedura genera_campo()

Inviato dal mio Nexus 5 utilizzando Tapatalk
 

Dradkol

Nuovo Utente
62
22
Hardware Utente
CPU
i5 4670k @4.3 Mhz
Dissipatore
Artic freezer xtreme
Scheda Madre
MSI Z87-G43-GAMING
RAM
8GB DDR3
Scheda Video
Zotac gtx 1070 mini
Alimentatore
corsair 750w corsair tx750m
Case
Cooler Master full tower HAF 932 Advanced
Sistema Operativo
Windows 10
#13
Scusa l'ignoranza, ma non capisco il senso della variabile k nella procedura genera_campo()

Inviato dal mio Nexus 5 utilizzando Tapatalk
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.
 

Dradkol

Nuovo Utente
62
22
Hardware Utente
CPU
i5 4670k @4.3 Mhz
Dissipatore
Artic freezer xtreme
Scheda Madre
MSI Z87-G43-GAMING
RAM
8GB DDR3
Scheda Video
Zotac gtx 1070 mini
Alimentatore
corsair 750w corsair tx750m
Case
Cooler Master full tower HAF 932 Advanced
Sistema Operativo
Windows 10
#14
Niente da fare ho modificato la funzione movimento e ho aggiunto i puntatori ma nada. Forse c'è qualcosa di sbagliato nel codice che non riesco a vedere. Penso che possa essere un problema nel main. In quanto dopo la chiamata della funzione movimento richiamo visualizza_campo ma forse dovrei modificarla o richiamare di nuovo la funzione genera_campo con i dati aggiornati. :muro:
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);


int main()
{

    char campo[10][10];
    int move;
    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,k=0;

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


    {
        while(k<1){
        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;
    }
}
 
Ultima modifica:
398
254
Hardware Utente
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
Hard Disk
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
Scheda Video
Nvidia Geforce GTX 960M, 4GB
Scheda Audio
Realtek
Sistema Operativo
Windows 10 64bit
#15
Bhe, il campo l'hai generato con i valori vecchi... quindi devi per forza riposizionare i nuovi elementi. Puoi anche pensare ad una logica differente: la funzione movimento sposta il giocatore direttamente. Così non rigeneri tutto per 1 sola mossa, ma effettui solo lo spostamento necessario.

Comunque si, ci sono un pò di aspetti che magari andrebbero rivisti. Mi associo all'osservazione di rctimelines. Non avendo nessun ciclo, è del tutto inutile quel controllo. Se richiami questa funzione anche; quando setti un 'o' esci direttamente, non servono altri controlli. Se la posizione (i,j) è già occupata dovrai - immagino - generare una nuova posizione valida.
A che servono poi quelle parentesi graffe in più?