VIBORITA / SNAKE .. game developed in a matrix: it does not print with the modifications of rows and columns

0

Always print the matrix and the vibora in the initial position that I established, it does not move. I thought that with lines like the following I am modifying the number of rows and columns, but I do not print the little vibration with the modified rows or columns, I do not know if I am accessing and modifying the rows and columns of the matrix correctly:

           cabeza.fila=cabeza.fila+1;  //mueve cabeza
           cabeza.columna=cabeza.columna;
           for(i=0;i<longitud_cuerpo;i++){
           cuerpo[i].fila=cuerpo[i].fila+1;  //mueve cuerpo
           cuerpo[i].columna=cabeza.columna; 

I do not know how to make it move in the direction it moves while not touching the keys that change my direction. I wanted to do it within the user_entry function. For example I tried but did not work with (before if (kbhit ())):

   while(!=kbhit){ 
   if(*direccion=='w'){
      cabeza.fila=cabeza.fila-1;
      cabeza.columna=cabeza.columna;
      for(i=0;i<longitud_cuerpo;i++){
       cuerpo[i].fila=cuerpo[i].fila-1;
       cuerpo[i].columna=cabeza.columna;
        }
   if(*direccion=='s'){
                      ..instrucciones de avance..}
  etc..
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <Windows.h>
#include <time.h>
#define fil 20
#define col 20
void posicion_inicial_vibora();
void generar_comida(char matriz[][col]);
void bordear_matriz(char matriz[][col]);
void entrada_de_usuario(char *c,int fin,int puntos,char *direccion);
void comprobar_movimiento(char matriz[][col],int *longitud_cuerpo, int *fin,int *puntos);



typedef struct vibora{
    int fila;
    int columna;
}coordenada;

coordenada cuerpo[fil*col];
coordenada cabeza;

void posicion_inicial_vibora(){ //establece la posicion inical de la vibora


        cabeza.fila=9;

        cabeza.columna=10;

        cuerpo[0].fila=10;

        cuerpo[0].columna=10;


}

void generar_comida(char matriz[][col]){ //genera una posicion aleatoria para la comida
//comprueba que no hay nada en la posicion donde se creara la comida y si no hay nada la genera
    int posicion_aleatoria[2];
    int posicion_encontrada = 0;
    do{
           srand(time(NULL)); //no se si va adentro o afuera del do while, DONDE VAA???
       posicion_aleatoria[0] = rand() % fil;//devuelve el numero de fila, como disminuyo el valor max!!!!!-->(rand()-32747)%fil ??
       posicion_aleatoria[1] = rand() % col;//devuelve el numero de columna

    if(matriz[posicion_aleatoria[0]][posicion_aleatoria[1]] != '*' &&  //comprueba q no haya nada donde va a generarla y si no hay la genera
        matriz[posicion_aleatoria[0]][posicion_aleatoria[1]] != 'o'&&
        matriz[posicion_aleatoria[0]][posicion_aleatoria[1]] != '#' ){
             posicion_encontrada = 1;
             matriz[posicion_aleatoria[0]][posicion_aleatoria[1]] = '@';  //crea la comida representada con un @, f
    }

    }while(posicion_encontrada != 1);

}


void bordear_matriz(char matriz[][col]){
    int i,j;
    //rellenar la matriz
    for(i=0; i<fil; i++){
            for(j=0; j<col; j++){
                    if((i == 0) || (i == fil-1) || (j == 0) || (j == col-1)){
                     matriz[i][j] = '*';
                     }
                    if((i!=0)&&(i!=fil-1)&&(j!=0)&&(j!=col-1)){
                     matriz[i][j] = ' ';}

                    // printf("%c",matriz[i][j]); estos printf son de prueba para ver si me imprime la matriz..y si!!
                     }
          //  printf("\n");
    }



    //posiciones de la serpiente
    matriz[cabeza.fila][cabeza.columna] = 'o';
    matriz[cuerpo[0].fila][cuerpo[0].columna] = '#';

    generar_comida(matriz);
}
void entrada_de_usuario(char *c,int fin,int puntos,char *direccion){
    char matriz[fil][col]; 
    int longitud_cuerpo=1,i;

    fin=0,puntos=0; //esta bien inicializarlo aca?


    if(kbhit())
        {
        *c=getch();

        switch(*c){
            fflush(stdin);

            case 'w': if(*direccion!='s') {*direccion='w'; //ARRIBA
            // while(direccion='w'){ //creo q tengo q hacer un mientras(mientras no muera y no apriete otra direccion)
                                             //asi sigue en el bucle y repite para que avance.

              cabeza.fila=cabeza.fila-1;
              cabeza.columna=cabeza.columna;
                 for(i=0;i<longitud_cuerpo;i++){
                   cuerpo[i].fila=cuerpo[i].fila-1;
                   cuerpo[i].columna=cabeza.columna;
                   }
            comprobar_movimiento(matriz,&longitud_cuerpo,&fin,&puntos);

            break;

            case 's': if(*direccion!='w') {*direccion='s'; //ABAJO

               cabeza.fila=cabeza.fila+1;  //mueve cabeza
               cabeza.columna=cabeza.columna;
               for(i=0;i<longitud_cuerpo;i++){
               cuerpo[i].fila=cuerpo[i].fila+1;  //mueve cuerpo
               cuerpo[i].columna=cabeza.columna;
               }
            comprobar_movimiento(matriz,&longitud_cuerpo,&fin,&puntos);}

            break;

            case 'd': if(*direccion!='a') {*direccion='d'; //DERECHA

               cabeza.columna=cabeza.columna+1;
               cabeza.fila=cabeza.fila;
               for(i=0;i<longitud_cuerpo;i++){
               cuerpo[i].columna=cuerpo[i].columna+1;
               cuerpo[i].fila=cabeza.fila;
               }
            comprobar_movimiento(matriz,&longitud_cuerpo,&fin,&puntos);}

            break;

            case 'a': if(*direccion!='d'){ *direccion='a'; //IZQUIERDA

               cabeza.columna=cabeza.columna-1;
               cabeza.fila=cabeza.fila;
               for(i=0;i<longitud_cuerpo;i++){
               cuerpo[i].columna=cuerpo[i].columna-1;
               cuerpo[i].fila=cabeza.fila;
               }
            comprobar_movimiento(matriz,&longitud_cuerpo,&fin,&puntos);} 
            break;


        }
            }

    }
        }


void comprobar_movimiento(char matriz[][col],int *longitud_cuerpo, int *fin,int *puntos){ //ESTA FUNCION ME TIENE QUE DEVOLVER LO Q PONGO ABAJO
    int total_cuerpo=0,i=0; // no se inicializa el puntero *fin=0?? es necesario agregar *fin=0 en los casos en que no perdio??

//CUANDO ENTRO EN ESTA FUNCION, EN ALGUN IF, QUIERO Q ME DEVUELVA LAS MODIFICACIONES DE LOS CASOS Y FIN(0 O 1) PARA VER SI PERDI

    //COMPRUEBO SI EL SIGUIENTE MOVIENTO ES COMIDA
    if(matriz[cabeza.fila][cabeza.columna]=='@'){
            (*longitud_cuerpo)++;//creo q con esto se alarga
            total_cuerpo=total_cuerpo+1;
            matriz[cabeza.fila][cabeza.columna]='o';//con este la comida encontrada ahora es la cabeza del bicho
            for(i=0;i<(*longitud_cuerpo);i++){            //con este el cuerpo del bicho se fue actualizando y sumando
                matriz[cuerpo[i].fila][cuerpo[i].columna]='#';
            }

            matriz[cuerpo[(*longitud_cuerpo)].fila][cuerpo[(*longitud_cuerpo)].columna]=' ';//con esto se supone que BORRA la ultima posición
            generar_comida(matriz);// cada vez q coma me va a generar una comida en una posicion nueva
           *puntos=*puntos+total_cuerpo*10;//sale del if,sale de la funcion y vuelva al entrada usuario
    }

    //COMPRUEBO SI EL SIGUIENTE MOVIMIENTO ES LA PARED
    if(matriz[cabeza.fila][cabeza.columna]=='*'){// puse LONGITUD_CUERPO como puntero, entonces en los for donde lo uso.. que va? ..for(..<=*longitud_cuerpo)???

        //entra por la pared de ARRIBA
        if((cabeza.fila==0)&&(cabeza.columna>=1)&&(cabeza.columna<=col-2)){
            cabeza.fila=cabeza.fila+(fil-1); //me posiciona la CABEZA en fila nro =>0+19=19(la ultima fila)
            cabeza.columna=cabeza.columna;
            for(i=0;i<(*longitud_cuerpo);i++){// con este for hasta el ultimo elemento del CUERPO me resta una posicion hasta que cada uno llegue a la pared
                cuerpo[i].fila=cuerpo[i].fila-1;
                cuerpo[i].columna=cuerpo[i].columna;
                matriz[cuerpo[(*longitud_cuerpo)].fila][cuerpo[(*longitud_cuerpo)].columna]=' ';//con esto se supone que BORRA la ultima posición
                if(matriz[cuerpo[i].fila][cuerpo[i].columna]=='*'){//cuando cada elemento del cuerpo llega a la pared entra en este if,me mueve la cabeza una fila menos y me lleva a cada elemento a la ulitma fila
                    cabeza.fila=cabeza.fila-1; //mueve hacia ARRIBA la CABEZA
                    cabeza.columna=cabeza.columna;
                    cuerpo[i].fila=cuerpo[i].fila+(fil-1);//manda el cuerpo a la fila nro 19(la ultima)
                    cuerpo[i].columna=cuerpo[i].columna;
                    matriz[cuerpo[(*longitud_cuerpo)].fila][cuerpo[(*longitud_cuerpo)].columna]='*';//con esto el ULTIMO elemento del cuerpo q llega a ser pared y pasa a la fila de abajo, sigue siendo la pared
                }
            }
        }

        //entra por la pared de la IZQUIERD
        if((cabeza.fila>=1)&&(cabeza.columna==0)&&(cabeza.fila<=fil-2)){
            cabeza.columna=cabeza.columna+(col-1); //me posiciona en columna nro=19(la ultima col)
            cabeza.fila=cabeza.fila;
            for(i=0;i<(*longitud_cuerpo);i++){
                cuerpo[i].columna=cuerpo[i].columna-1;
                cuerpo[i].fila=cuerpo[i].fila;
                matriz[cuerpo[(*longitud_cuerpo)].fila][cuerpo[(*longitud_cuerpo)].columna]=' ';//con esto se supone que BORRA la ultima posición
                if(matriz[cuerpo[i].fila][cuerpo[i].columna]=='#'){
                    cabeza.columna=cabeza.columna-1;
                    cabeza.fila=cabeza.fila;
                    cuerpo[i].columna=cuerpo[i].columna+(col-1);
                    cuerpo[i].fila=cuerpo[i].fila;
                    matriz[cuerpo[(*longitud_cuerpo)].fila][cuerpo[(*longitud_cuerpo)].columna]='*';//con esto el ULTIMO elemento del cuerpo q llega a ser pared y pasa a la fila de abajo, sigue siendo la pared
                }
            }
        }

        //entra por la pared de ABAJO
        if((cabeza.fila==fil-1)&&(cabeza.columna>=1)&&(cabeza.columna<=col-2)){
            cabeza.fila=cabeza.fila-(fil-1); //me posiciona en fila nro =>19-19=0(la primera fila)
            cabeza.columna=cabeza.columna;
            for(i=0;i<(*longitud_cuerpo);i++){
                cuerpo[i].fila=cuerpo[i].fila+1;
                cuerpo[i].columna=cuerpo[i].columna;
                matriz[cuerpo[(*longitud_cuerpo)].fila][cuerpo[(*longitud_cuerpo)].columna]=' ';//con esto se supone que BORRA la ultima posición
                if(matriz[cuerpo[i].fila][cuerpo[i].columna]=='~'){
                    cabeza.fila=cabeza.fila+1; //mueve hacia ABAJO la CABEZA
                    cabeza.columna=cabeza.columna;
                    cuerpo[i].fila=cuerpo[i].fila-(fil-1);//manda el cuerpo a la fila nro 0(la primera)
                    cuerpo[i].columna=cuerpo[i].columna;
                    matriz[cuerpo[(*longitud_cuerpo)].fila][cuerpo[(*longitud_cuerpo)].columna]='*';//con esto el ULTIMO elemento del cuerpo q llega a ser pared y pasa a la fila de abajo, sigue siendo la pared
                }
            }
        }

        //entra por la pared de la DERECHA
        if((cabeza.fila>=1)&&(cabeza.columna==col-1)&&(cabeza.fila<=fil-2)){
            cabeza.columna=cabeza.columna-(col-1); //me posiciona en columna nro=0(la primera col)
            cabeza.fila=cabeza.fila;
            for(i=0;i<(*longitud_cuerpo);i++){
                cuerpo[i].columna=cuerpo[i].columna+1;
                cuerpo[i].fila=cuerpo[i].fila;
                matriz[cuerpo[(*longitud_cuerpo)].fila][cuerpo[(*longitud_cuerpo)].columna]=' ';//con esto se supone que BORRA la ultima posición
                if(matriz[cuerpo[i].fila][cuerpo[i].columna]=='~'){
                    cabeza.columna=cabeza.columna+1;//mueve hacia la DERECHA la CABEZA
                    cabeza.fila=cabeza.fila;
                    cuerpo[i].columna=cuerpo[i].columna-(col-1);//manda cada elemento del cuerpo a la col nro=0
                    cuerpo[i].fila=cuerpo[i].fila;
                    matriz[cuerpo[(*longitud_cuerpo)].fila][cuerpo[(*longitud_cuerpo)].columna]='*';//con esto el ULTIMO elemento del cuerpo q llega a ser pared y pasa a la fila de abajo, sigue siendo la pared
                }
            }
        }
    }

    //COMPRUEBO SI EL SIGUIENTE MOVIMIENTO EN " " (NADA)
    if(matriz[cabeza.fila][cabeza.columna]==' '){

       matriz[cabeza.fila][cabeza.columna]='o';//con este la "nada" encontrada ahora es la cabeza del bicho
      for(i=0;i<(*longitud_cuerpo);i++){            //con este el cuerpo del bichose fue actualizando y sumando,creo q es longitud_cuerpo
       matriz[cuerpo[i].fila][cuerpo[i].columna]='#';
            }
      matriz[cuerpo[(*longitud_cuerpo)].fila][cuerpo[(*longitud_cuerpo)].columna]=' ';//con esto se BORRA la ultima posicion
    }

    //COMPRUEBO SI EL SIGUIENTE MOVIMIENTO ES EL CUERPO "~",ENTONCES PERDIO
    if(matriz[cabeza.fila][cabeza.columna]=='~'){
            *fin=1;
    }


}



int main(){
    char matriz[fil][col],c,direccion='w';//inicializa direccion en el main pero despues la otra funcion que la usa me la modifica
    int fin=0,puntos=0,i,j;


   posicion_inicial_vibora();
   bordear_matriz(matriz);

   do{

     entrada_de_usuario(&c,fin,puntos,&direccion);
     Sleep(500);
     system("cls");
     for(i=0;i<fil;i++){
        for(j=0;j<col;j++){
            printf("%c",matriz[i][j]);
        }
        printf("\n");
        //Sleep(500);
     }
   }while(fin!=1);

   if(fin==1){
    printf("PARTIDA PERDIDA\n");
    printf("PUNTUACION: %i",puntos);
   }


    return 0;
    }
    
asked by Maria 03.08.2018 в 04:39
source

1 answer

0

Your code is complicated to follow and analyze (In a quick glance I have already seen something that does not compile), even more so when your problem is very specific but you do not mention in the code where the problem is ... but if I understand your problem is not a code but a concept:

  

I do not know how to make it move in the direction it moves while not touching the keys that change my direction.

This operation can be quite simple if you use a coordenada to represent the movement:

  • When the movement is from left to right, fila will be 0 and columna will be 1.
  • When the movement is from top to bottom, fila will be 1 and columna will be 0.
  • When the movement is from right to left, fila will be 0 and columna will be -1.
  • When the movement is from bottom to top, fila will be -1 and columna will be 0.

With this simple premise, in each game cycle you can calculate the following position of the head by adding the components to the current position:

coordenada siguiente;
siguiente.fila = cabeza.fila + direccion.fila;
siguiente.columna = cabeza.columna + direccion.columna;

The coordenada direccion remains the same until you press a key, in which case it changes according to the preset rules:

switch(*c) {
    case 'w': case 'W':
        direccion.fila = -1;
        direccion.columna = 0;
        break;
    case 'a': case 'A':
        direccion.fila = 0;
        direccion.columna = -1;
        break;
    case 's': case 'S':
        direccion.fila = 1;
        direccion.columna = 0;
        break;
    case 'd': case 'D':
        direccion.fila = 0;
        direccion.columna = 1;
        break;
}

The logic behind this proposal is that the viper always moves in the direction that the structure direccion marks and this direction changes when pressing keys.

    
answered by 06.08.2018 в 08:23