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;
}