RISOLTO Movimento C

Stato
Discussione chiusa ad ulteriori risposte.

Dradkol

Eretico
Utente Èlite
5,072
4,377
CPU
Intel core i7 11700KF 8 core/ 16 thread 4.6Ghz all core
Dissipatore
Arctic Liquid freezer II 240mm Argb
Scheda Madre
Asus TUF Gaming z590 Plus wifi
HDD
NVMe M.2 Gen4 Crucial P5 Plus 1TB + NVMe M.2 Gen3 Sabrent 256GB / +SSD Crucial bx500 256GB
RAM
Kingston Fury Beast 32Gb (2X16GB) 3200Mhz CL16
GPU
Asus TUF Rtx 3080 12GB Gaming OC 900mv/1865mhz
Audio
HyperX Cloud II + Logitech Z313
Monitor
Xiaomi Mi 34° WQHD 144hz + LG UltraGear 32GN650 32° QHD, 165hz
PSU
Corsair RM850x
Case
Cooler Master TD500 Mesh Argb
OS
Windows 11
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]
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
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';
  
}
 

Dradkol

Eretico
Utente Èlite
5,072
4,377
CPU
Intel core i7 11700KF 8 core/ 16 thread 4.6Ghz all core
Dissipatore
Arctic Liquid freezer II 240mm Argb
Scheda Madre
Asus TUF Gaming z590 Plus wifi
HDD
NVMe M.2 Gen4 Crucial P5 Plus 1TB + NVMe M.2 Gen3 Sabrent 256GB / +SSD Crucial bx500 256GB
RAM
Kingston Fury Beast 32Gb (2X16GB) 3200Mhz CL16
GPU
Asus TUF Rtx 3080 12GB Gaming OC 900mv/1865mhz
Audio
HyperX Cloud II + Logitech Z313
Monitor
Xiaomi Mi 34° WQHD 144hz + LG UltraGear 32GN650 32° QHD, 165hz
PSU
Corsair RM850x
Case
Cooler Master TD500 Mesh Argb
OS
Windows 11
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:

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
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 piace
Reazioni: Dradkol

Dradkol

Eretico
Utente Èlite
5,072
4,377
CPU
Intel core i7 11700KF 8 core/ 16 thread 4.6Ghz all core
Dissipatore
Arctic Liquid freezer II 240mm Argb
Scheda Madre
Asus TUF Gaming z590 Plus wifi
HDD
NVMe M.2 Gen4 Crucial P5 Plus 1TB + NVMe M.2 Gen3 Sabrent 256GB / +SSD Crucial bx500 256GB
RAM
Kingston Fury Beast 32Gb (2X16GB) 3200Mhz CL16
GPU
Asus TUF Rtx 3080 12GB Gaming OC 900mv/1865mhz
Audio
HyperX Cloud II + Logitech Z313
Monitor
Xiaomi Mi 34° WQHD 144hz + LG UltraGear 32GN650 32° QHD, 165hz
PSU
Corsair RM850x
Case
Cooler Master TD500 Mesh Argb
OS
Windows 11
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.
 
  • Mi piace
Reazioni: DispatchCode

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Nessuna vergogna e nessun imbarazzo. Alla fine siamo tutti qui per imparare qualcosa e dare una mano, quando si può. ;)
 
  • Mi piace
Reazioni: Dradkol

rctimelines

Utente Èlite
5,143
2,023
CPU
Ryzen 7 2700X | i7-6700k@4.5 | i5-4460... altri
Dissipatore
wraith MAX | Scythe Katana2|Arctic Freezer 11LP
Scheda Madre
Asrock B450 Fatal1ty 4K | Asus Prime Z270P | Acer Veriton
HDD
Samsung 970evo m.2 | vari | Samsung 860 evo
RAM
16GB G.Skill TridentZ 3000 | 16GB CORSAIR 2133 | 8GB DDR3 1600
GPU
RadeonPro WX3100 4G | ZOTAC GTX 1070 8G | Quadro k620 2G
Monitor
DELL 2419P 2K + Benq 17" | LG Ultrawide 27''
Net
fibra 1000
OS
Windows10-pro64/OpenSUSE-QL15.1/Debian 10.3
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
 
  • Mi piace
Reazioni: Dradkol

Dradkol

Eretico
Utente Èlite
5,072
4,377
CPU
Intel core i7 11700KF 8 core/ 16 thread 4.6Ghz all core
Dissipatore
Arctic Liquid freezer II 240mm Argb
Scheda Madre
Asus TUF Gaming z590 Plus wifi
HDD
NVMe M.2 Gen4 Crucial P5 Plus 1TB + NVMe M.2 Gen3 Sabrent 256GB / +SSD Crucial bx500 256GB
RAM
Kingston Fury Beast 32Gb (2X16GB) 3200Mhz CL16
GPU
Asus TUF Rtx 3080 12GB Gaming OC 900mv/1865mhz
Audio
HyperX Cloud II + Logitech Z313
Monitor
Xiaomi Mi 34° WQHD 144hz + LG UltraGear 32GN650 32° QHD, 165hz
PSU
Corsair RM850x
Case
Cooler Master TD500 Mesh Argb
OS
Windows 11
Si, ho capito cosa vuoi dire, ma è un'implementazione quantomeno stravagante! K non serve.

Inviato dal mio Nexus 5 utilizzando Tapatalk
Ehh si riguardando il codice non aveva molto senso. Mr.Wolf come immagine profilo ;)
 
Ultima modifica:
  • Mi piace
Reazioni: rctimelines

Andretti60

Utente Èlite
6,440
5,091
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.
 
  • Mi piace
Reazioni: Dradkol

Dradkol

Eretico
Utente Èlite
5,072
4,377
CPU
Intel core i7 11700KF 8 core/ 16 thread 4.6Ghz all core
Dissipatore
Arctic Liquid freezer II 240mm Argb
Scheda Madre
Asus TUF Gaming z590 Plus wifi
HDD
NVMe M.2 Gen4 Crucial P5 Plus 1TB + NVMe M.2 Gen3 Sabrent 256GB / +SSD Crucial bx500 256GB
RAM
Kingston Fury Beast 32Gb (2X16GB) 3200Mhz CL16
GPU
Asus TUF Rtx 3080 12GB Gaming OC 900mv/1865mhz
Audio
HyperX Cloud II + Logitech Z313
Monitor
Xiaomi Mi 34° WQHD 144hz + LG UltraGear 32GN650 32° QHD, 165hz
PSU
Corsair RM850x
Case
Cooler Master TD500 Mesh Argb
OS
Windows 11
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.

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili