Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: Kenji-chan en 13 Diciembre 2016, 00:15 AM

Título: error logico c
Publicado por: Kenji-chan en 13 Diciembre 2016, 00:15 AM
hola, necesito ayuda para entender el error de mi código, es un bus caminas versión ms-dos en la funcion comprobar() que se ejecuta en la funcion gameLoop() no me reconoce las coordenadas correctas y me da otro valor.

gracias de antemano.


PD. el codigo esta preparado en mi modo debug para cundo lo ejjecuten sea mas facil de entender


#include <stdio.h>
#include <time.h>
#include <windows.h>

int numero;

void gotoxy(int x,int y);
int menu();
void llenarTablero(int tablero[][numero], int num);
void dibujarTablero(int tablero[][numero], int num);
int comprbacion(int tablero[][numero], int corx, int cory);
void gameLoop(int tablero[][numero], int num);
int gameOver(int tablero[][numero], int num);
void borrar(int num);
void comodin(int tablero[][numero], int num, int corx, int cory);

int main(){

   int op;

   do{
       op = menu();

       switch(op){
           case 1:
           numero = 10;
           break;
           case 2:
           numero = 15;
           break;
           case 3:
           numero = 20;
           break;
       }

       if(op != 0){
           int tablero[numero][numero];

           llenarTablero(tablero,numero);
           dibujarTablero(tablero,numero);
           gameLoop(tablero,numero);
       }

   }while(op != 0);

   return 0;
}

void gotoxy(int x,int y){
     HANDLE hcon;
     hcon = GetStdHandle(STD_OUTPUT_HANDLE);
     COORD dwPos;
     dwPos.X = x;
     dwPos.Y= y;
     SetConsoleCursorPosition(hcon,dwPos);
}

int menu(){
   system("cls");
   int op;

    printf("\t\t\tBusca minas versión ms-dos\n\n");

   do{
       printf("1)facil\n");
       printf("2)medio\n");
       printf("3)dificil\n");
       printf("0)salir\n");
       printf("\nOpcion: ");
       scanf("%i", &op);
       if(op<0 || op>3)
           printf("EL numero ingresado es incorecto\n");
   }while(op<0 || op>3);

   return op;
}

void llenarTablero(int tablero[][numero], int num){

   srand(time(NULL));
   int i, j;

   for(i=0; i<num; i++){
       for(j=0; j<num; j++){
               tablero[i][j] = rand()%2;
       }
   }

}

void dibujarTablero(int tablero[][numero], int num){

   int i, j;

   system("cls");

   for(i=0; i<num; i++){
       for(j=0; j<num; j++){
           //printf("%c",35);
           printf("%d",tablero[i][j]);//para hacer debug
       }
       printf("\n");
   }
}

int comprbacion(int tablero[][numero], int corx, int cory){
   if(tablero[corx][cory] == 1){
       gotoxy(25,2);//para hacer debug
       printf("tablrero[%d][%d] = %d", corx, cory, tablero[corx][cory]);//para hacer debug
       gotoxy(0,numero+3);//para hacer debug
       tablero[corx][cory] = 3;
       getch();//para hacer debug
       return 1;
   }
}

void gameLoop(int tablero[][numero], int num){
   int corx, cory, fin, vidas = 3;
   int i, j;

   do{
       borrar(num);
       printf("escriba una cordenado");
       printf("cordenada x: ");
       scanf("%d", &corx);
       printf("cordenada y: ");
       scanf("%d", &cory);

       if(corx>=num || cory>=num){
           borrar(num);
           printf("las cordenadas son incorrectas");
       }else if(comprbacion(tablero, corx, cory) == 1){
           borrar(num);
           printf("As asertado te quedan %d vidas", vidas);
           gotoxy(corx,cory);
           printf("X");
           //sirve para buscar espacios libres vecionos y desbloquearlos
           comodin(tablero, num, corx, cory);

       }else if(comprbacion(tablero, corx, cory) == 0){
           borrar(num);
           vidas--;
           printf("Era una bomba te quedan %d vidas", vidas);
           gotoxy(corx,cory);
           printf("O");
       }
       //fin = gameOver(tablero, num);

       Sleep(2500);
   }while(vidas !=0);
}

void borrar(int num){
   int i;
   gotoxy(0,num+3);
   for(i=0; i<5; i++){
       printf("                                            \n");
   }
   gotoxy(0,num+3);
}

void comodin(int tablero[][numero], int num, int corx, int cory){
   int i,j;

   for(i=corx; i<num; i++){
       for(j=cory; j<num; j++){
           if(tablero[i][j] == 0)
               j=num;
           else if(tablero[i][j] == 1){
               gotoxy(i,j);
               printf("X");
           }
           getch();//para hacer debug
       }

       for(j=cory; j>0; j--){
           if(tablero[i][j] == 0)
               j=0;
           else if(tablero[i][j] == 1){
               gotoxy(i,j);
               printf("X");
           }
           getch();//para hacer debug
       }

       if(tablero[i][j] == 0)
               i=num;
   }

   for(i=corx; i>0; i--){
       for(j=cory; j>0; j--){
           if(tablero[i][j] == 0)
               j=0;
           else if(tablero[i][j] == 1){
               gotoxy(i,j);
               printf("X");
           }
           getch();//para hacer debug
       }

       for(j=cory; j<num; j++){
           if(tablero[i][j] == 0)
               j=num;
           else if(tablero[i][j] == 1){
               gotoxy(i,j);
               printf("X");
           }
           getch();//para hacer debug
       }

       if(tablero[i][j] == 0)
               i=0;
   }

}

int gameOver(int tablero[][numero], int num){
   int i, j;
   for(i=0; i<num; i++){
       for(j=0; j<num; j++){
           if(tablero[i][j] == 1)
               return 1;
           else
               return 0;
       }
   }
}

Título: Re: error logico c
Publicado por: engel lex en 13 Diciembre 2016, 00:22 AM
CitarPD. el codigo esta preparado en mi modo debug para cundo lo ejjecuten sea mas facil de entender

probablemente nadie lo compile... requiere tiempo y trabajo... es recomendable que indiques exactamente donde está el error, que esperas, que resulta...

me imagino que "comprobar()" es "comprbacion(int tablero[][numero], int corx, int cory)" (te falta una o comprobacion) a demás no retorna valor si no entra al if, lo que puede generar resultados inesperados (no asumas que si no escribes el return, return será 0... nunca asúmas en C o C++ que algo vale 0, si no se lo has colocado tu mismo)

Título: Re: error logico c
Publicado por: Kenji-chan en 13 Diciembre 2016, 00:38 AM
x ejemplo en este caso escrivi en la cordenada 2,0 que es un uno y despus me la da como 0

(https://www.4shared.com/img/68vwM36cce/s25/158f563d798/img) (https://www.4shared.com/photo/68vwM36cce/img.html)

MOD: Imagen adaptada a lo permitido.
Título: Re: error logico c
Publicado por: engel lex en 13 Diciembre 2016, 00:45 AM
tu tablero está girado 90º

lo imprimiste mal

void dibujarTablero(int tablero[][numero], int num){

   int i, j;

   system("cls");

   for(i=0; i<num; i++){
       for(j=0; j<num; j++){
           //printf("%c",35);
           printf("%d",tablero[i][j]);//para hacer debug
       }
       printf("\n");
   }
}




en ese codigo "j" es x (acuerdate que el compilador imprime a la derecha del anterior) cuando j termina, hace un salto de linea y va con el siguiente "i" (y) por consecuencia siempre que uses printf, el ciclo interno es X

siempre es util mentener la uniformidad

void dibujarTablero(int tablero[][numero], int num){

   int x, y;

   system("cls");

   for(y=0; y<num; y++){
       for(x=0; x<num; x++){
           //printf("%c",35);
           printf("%d",tablero[x][y]);//para hacer debug
       }
       printf("\n");
   }
}


Título: Re: error logico c
Publicado por: Kenji-chan en 13 Diciembre 2016, 00:57 AM
gracias ya funciona bien  ;D