Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] juego con comportamiento extraño

Estas en el tema de juego con comportamiento extraño en el foro de C/C++ en Foros del Web. Estoy en la recreación de un juego el cual se llama "cool balls" el cual evidentemente no es igual pero es similar, el punto es ...
  #1 (permalink)  
Antiguo 09/11/2013, 20:24
Avatar de Cova  
Fecha de Ingreso: noviembre-2013
Mensajes: 4
Antigüedad: 11 años
Puntos: 0
Pregunta juego con comportamiento extraño

Estoy en la recreación de un juego el cual se llama "cool balls" el cual evidentemente no es igual pero es similar, el punto es que inserte unas condiciones para recorrer las letras,al intentar recorrerlas hacia la izquierda o hacia arriba no hay problema pero al intentarlo hacia la derecha o hacia abajo borra parte del tablero... básicamente tienen la misma instrucción excepto por el signo que es lo único que cambia.
a continuación mi juego:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
char A[8][8],letra,direccion,CO;
int C=1,X,Y,T=0;

/*Logo*/
printf(" .. ..::::i,. . . .. \n ... ..... \n. . .:ir77v77rv7v7LvLL7:. . . \n. . ::ir7rriri;i;i;irrYYvi: . \n. . . .r:r7riiiiiiiiiiiiiiir727i . \n 7:7i::::::i:iii:i:::i:;rjr: . \n i,7:::77Lv7;i,:,,,rYL777Y7YL: \n ,ii:rSZ0BBYi8SFYj1M8:,iri:r75i. \n ::ijBMqB5 vM1B0JLYY2Jr:ii7UY. \n i,LS;JN: i iG1F: ::::ii777rLL. \n i:Y2 vi i:kquXFrLi;L:iirr7YY. \n ,:ikP5O8MZqZEP2O7:rJFULL7:;vki \n ::7U8EZNGZGkJFGXXX7,:iri7752. \n :;ri7vjJYr:.::::::i:iir7UX: \n :rJi:::,::i:::i:ii;r7YSU, \n .:YJL;;iriii;ir;77u1kr \n .iv2UuLLvYLJY25XUr \n :rYYUYuuYri. \n .::77r:. .Lu ..... .:U5:,7E7 \n rvFMBBBBM, 7BBj ,NNPNN0G: :uXBPijBB \n:.LGBXYLuXN .i7YYr. :rY7i iZBL 7XGBEYLMB .ir7r:r,;ruB0:7BB..:rr7i \nL.ZO1. iYZBOMBO:.,vOBMBBG:::EML ;k12ii7BG i1MBMX2BB:;LB1:rBMiiNBONB7\nY.MO7. :rMM7::YMG77GM7,:YMZ7iXBv rSJ1ESUUYrrYOB7irJEBiiYB5,7BB.J00rLP \nL.8OU:... r7Mq.,i:EMirM0..::ZZY;PMY rFqBr2iLFB.1MM ::JqBirYB5:rBO.:u1kLU,\n. LOBk25S0Z77ZBUY7XBNirZB2Y7PBkr78Bu LPFu:7rjBB:JqUrvLUGBr7jBN:YBB.7vYirBB\n :7FMBBBBq,,ikBBBB5 :kBBBBj :BBi ,MBBBBBBM .SBBBBPBB 7BB7:ZBq:0BBBBB.\nCargando...");

/*efecto de tiempo

do
{
T=T+1;
}while(T<=1990000000);*/

printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nInstruccio nes:\n\nEl objetivo es comerse todas las letras con un numero limite de movimientos \nhasta que quede una sola en el tablero \n1:Elige una letra del tablero \n2:Con las tecla w, a, s, d elige la direccion de movimimento \n3:No hay movimentos en diagonal\n\n\nPresiona enter para empezar");
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n");

system("pause>nul");
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n");


/* llena la tabla de puntos*/
for(X=0;X<=7;X++)
{
for(Y=0;Y<=7;Y++)
{
A[X][Y]='.';

}
}
/*¨nivel 1*/

/* asignar de la a a la m */
A[0][1]='a';
A[1][2]='b';
A[2][3]='c';
A[3][4]='d';
A[4][5]='e';
A[5][6]='f';
A[6][6]='g';
A[6][5]='h';
A[5][4]='i';
A[4][3]='j';
A[3][2]='k';
A[2][1]='l';
A[1][0]='m';

do
{

for(X=0;X<=7;X++)
{
for(Y=0;Y<=7;Y++)
{
printf("%c ",A[X][Y]);
}
printf("\n\n\n");
}


printf("Elige la letra:");
scanf("%c",&letra);
fflush(stdin);

printf("Elige la direccion(w,a,s,d)");
scanf("%c",& direccion);
fflush(stdin);


for(X=0;X<=7;X++)
{
for(Y=0;Y<=7;Y++)
{
if(A[X][Y]==letra)
{
/*las dos condiciones siguientes tienen un comprtamiento extraño, borran gran parte de la matriz o en dado caso lanza errores*/

if (direccion=='s')
{
A[X][Y]='.';
A[X+1][Y]='.';
A[X+2][Y]=letra;
}

if(direccion=='d')
{
A[X][Y]='.';
A[X][Y+1]='.';
A[X][Y+2]=letra;
}
/*las dos condiciones siguientes hacen lo que quiero y son basicamente la misma instruccion*/
if(direccion=='w')
{
A[X][Y]='.';
A[X-1][Y]='.';
A[X-2][Y]=letra;
}

if(direccion=='a')
{
A[X][Y]='.';
A[X][Y-1]='.';
A[X][Y-2]=letra;
}
}
}
}

printf("\n\n\n\n\n\n\n\n");
C=C+1;

}while(C!=13);

el programa continua pero no tiene relevancia.
de antemano gracias.
  #2 (permalink)  
Antiguo 10/11/2013, 06:27
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 3 meses
Puntos: 83
Respuesta: juego con comportamiento extraño

El array tiene memoria reservada accesible en 8x8, pero cuando recorres el array entre (x,y)[0,7] e intentas acceder a un elemento x+1 o x+2 en el caso que x=6 la posicion de 6+2 o en x=7 las posiciones 7+1 y 7+2 (a x=7 ya no se llega nunca porque cuando x=6 el acceso x+2 -> 6+2 se produce el error), es decir que ambas condiciones intentan acceder a una posicion de memoria para la que la aplicacion no tiene dercho de acceso lo cual provoca la violacion de acceso (segmentation fault).

No te pongo un codigo con la solucion pq no he mirado la logica y no habia visto nunca esta aplicacion. Te comento solo que cuando incrementas dentro de una matriz tienes que poner controles para evitar salir del rango: en caso que estes en posicion x=7, cuando intentas acceder a x+1 sales del rango, lo que te interesa es saltar de fila y seguir contando, es decir que si x+desplazamiento > rango entonces saltas de fila (y += 1), restauras contador de columna (X=0) y de ahi sigues contando.

Una cosa, la definicion de fflush no incluye el uso para el stream stdin; es decir, en determinados s.o. funciona pero la funcion no fue ideada para eso. Te copio una funcion estandar para vaciar el buffer de entrada por teclado estandar:

Código C:
Ver original
  1. void fflush_stdin() {
  2.     char c;
  3.     while ((c = getchar()) != '\n' && c != EOF);
  4. }

Otra cosa, la funcion system lanza una aplicacion, en el caso del system(pause) lanza una aplicacion que espera un retorno; mejor usa el getchar que hace lo mismo sin lanzar una aplicacion externa.

Una ultima cosa, la cabecera stdlib no la estas usando; evita lincar cabeceras de las que no usas ninguna funcion.

Y lo mas importante: indenta el codigo, te será mas facil ver lo que estas haciendo a la vez que será tambien mas facil para cualquier otro que vea tu codigo.

Y otra cosa mas, evita los valores 'hardcoded', esto son las asignaciones de valores picados dentro del codigo; es lo que tienes para declarar el array y lo que tienes para recorrerlo. Es mejor declarar un define para el ancho, el alto, y todo lo que sea necesario y usar esos defines

Código C:
Ver original
  1. #define ANCHO 8
  2. #define ALTO 8
  3.  
  4. char A[ANCHO][ALTO];
  5.  
  6. for(x = 0; x < ANCHO; x++) ...

Y junto con eso tambien te será de utilidad usar nombres de variables significativas; eso significa que declarar un array bajo la variable A es lo mismo que si tienes un perro y le pones de nombre gato; el array del tablero puedes llamarlo TABLERO y la compilacion tendrá el mismo tamaño. Y junto con eso tambien te será de utilidad separar por funciones: una funcion que muestra el logo, otra que pinta las instrucciones, otra que recupera los imputs, otra que ejecuta la logica... El main debe ocupar 4 lineas: la llamada a la funcion de inicio, la llamada al ciclo, el finalizado (en caso que haya alguno) y el return 0, lo demas separado por funciones.

Ok, y bueno aun otra ultima cosa y no te molesto mas :)) Supongo que eres consciente que al evaluar el array lo estas haciendo de forma vertical (para cada columna saltas de fila), no se si afectara en algo a la logica de la aplicacion pero tenlo en cuenta.

Saludos
vosk

Última edición por vosk; 10/11/2013 a las 06:55
  #3 (permalink)  
Antiguo 11/11/2013, 19:19
Avatar de Cova  
Fecha de Ingreso: noviembre-2013
Mensajes: 4
Antigüedad: 11 años
Puntos: 0
Respuesta: juego con comportamiento extraño

Gracias por las correcciones y por tu tiempo para responder,pero al final note que al sumarlo lo recorría y lo volvía a encontrar así hasta que lo sacaba de la matriz, me sirvio mucho tus consejos.
Para cualquier interesado aquí esta el juego de cool balls.
Código C++:
Ver original
  1. #include <stdio.h>
  2.  
  3. int main(void)
  4. {
  5. char A[8][8],letra,direccion,CO;
  6. int C=1,X,Y,X2,Y2,X3,Y3,T=0,problema=1,perdiste=0;
  7.  
  8. /*Logo*/
  9. printf("       ..                       ..::::i,.                           . . .. \n                                 ... .....                                 \n. .                       .:ir77v77rv7v7LvLL7:.                     .   .  \n.    .                   ::ir7rriri;i;i;irrYYvi:                         . \n. . .                  .r:r7riiiiiiiiiiiiiiir727i                       .  \n                       7:7i::::::i:iii:i:::i:;rjr:                       . \n                      i,7:::77Lv7;i,:,,,rYL777Y7YL:                        \n                     ,ii:rSZ0BBYi8SFYj1M8:,iri:r75i.                       \n                     ::ijBMqB5   vM1B0JLYY2Jr:ii7UY.                       \n                     i,LS;JN:  i iG1F: ::::ii777rLL.                       \n                     i:Y2  vi  i:kquXFrLi;L:iirr7YY.                       \n                     ,:ikP5O8MZqZEP2O7:rJFULL7:;vki                        \n                      ::7U8EZNGZGkJFGXXX7,:iri7752.                        \n                       :;ri7vjJYr:.::::::i:iir7UX:                         \n                        :rJi:::,::i:::i:ii;r7YSU,                          \n                         .:YJL;;iriii;ir;77u1kr                            \n                           .iv2UuLLvYLJY25XUr                              \n                               :rYYUYuuYri.                                \n   .::77r:.                     .Lu     .....             .:U5:,7E7        \n  rvFMBBBBM,                    7BBj  ,NNPNN0G:           :uXBPijBB        \n:.LGBXYLuXN  .i7YYr.    :rY7i   iZBL  7XGBEYLMB   .ir7r:r,;ruB0:7BB..:rr7i \nL.ZO1.      iYZBOMBO:.,vOBMBBG:::EML  ;k12ii7BG  i1MBMX2BB:;LB1:rBMiiNBONB7\nY.MO7.     :rMM7::YMG77GM7,:YMZ7iXBv  rSJ1ESUUYrrYOB7irJEBiiYB5,7BB.J00rLP \nL.8OU:...  r7Mq.,i:EMirM0..::ZZY;PMY  rFqBr2iLFB.1MM ::JqBirYB5:rBO.:u1kLU,\n. LOBk25S0Z77ZBUY7XBNirZB2Y7PBkr78Bu  LPFu:7rjBB:JqUrvLUGBr7jBN:YBB.7vYirBB\n  :7FMBBBBq,,ikBBBB5   :kBBBBj  :BBi  ,MBBBBBBM  .SBBBBPBB 7BB7:ZBq:0BBBBB.\nCargando...");
  10.  
  11. /*efecto de tiempo
  12.  
  13. do
  14. {
  15.     T=T+1;
  16. }while(T<=1990000000);*/
  17.  
  18. printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nInstrucciones:\n\nEl objetivo es comerse todas las letras con un numero limite de movimientos \nhasta que quede una sola en el tablero \n1:Elige una letra del tablero \n2:Con las tecla w, a, s, d elige la direccion de movimimento \n3:No hay movimentos en diagonal\n\n\nPresiona enter para empezar");
  19. printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
  20.  
  21. system("pause>nul");
  22. printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
  23.  
  24.  
  25. /* llena la tabla de puntos*/
  26. for(X3=0;X3<=7;X3++)
  27.     {
  28.         for(Y3=0;Y3<=7;Y3++)
  29.         {
  30.            A[X3][Y3]='.';
  31.  
  32.         }
  33.     }
  34. /*¨nivel 1*/
  35.  
  36. /* asignar de la a a la m */
  37. A[0][1]='a';
  38. A[1][2]='b';
  39. A[2][3]='c';
  40. A[3][4]='d';
  41. A[4][5]='e';
  42. A[5][6]='f';
  43. A[6][6]='g';
  44. A[6][5]='h';
  45. A[5][4]='i';
  46. A[4][3]='j';
  47. A[3][2]='k';
  48. A[2][1]='l';
  49. A[1][0]='m';
  50.  
  51. do
  52. {   for(X2=0;X2<=7;X2++)
  53.     {
  54.         for(Y2=0;Y2<=7;Y2++)
  55.         {
  56.            printf("%c    ",A[X2][Y2]);
  57.         }
  58.         printf("\n\n\n");
  59.     }
  60. problema=1;
  61.     printf("Elige la letra:");
  62.     scanf("%c",&letra);
  63.     fflush(stdin);
  64.  
  65.     printf("Elige la direccion(w,a,s,d)");
  66.     scanf("%c",& direccion);
  67.     fflush(stdin);
  68.  
  69.  
  70.     for(X=0;X<=7;X++)
  71.     {   Y=0;
  72.          while (Y<=7 && problema<2)
  73.         {
  74.                 if(A[X][Y]==letra)
  75.                 {       /*las dos condiciones siguientes tienen un comprtamiento extraño, borran gran parte de la matriz o en dado caso lanza errores*/
  76.  
  77.                             if (direccion=='s')
  78.                             {
  79.                             A[X][Y]='.';
  80.                             A[X+1][Y]='.';
  81.                             A[X+2][Y]=letra;
  82.                             }
  83.  
  84.                             if(direccion=='d')
  85.                             {
  86.                             A[X][Y]='.';
  87.                             A[X][Y+1]='.';
  88.                             A[X][Y+2]=letra;
  89.                             }
  90.                             /*las dos condiciones siguientes hacen lo que quiero y son basicamente la misma instruccion*/
  91.                             if(direccion=='w')
  92.                             {
  93.                             A[X][Y]='.';
  94.                             A[X-1][Y]='.';
  95.                             A[X-2][Y]=letra;
  96.                             }
  97.  
  98.                             if(direccion=='a')
  99.                             {
  100.                             A[X][Y]='.';
  101.                             A[X][Y-1]='.';
  102.                             A[X][Y-2]=letra;
  103.                             }
  104.                             problema=problema+1;
  105.                     }
  106.             Y++;
  107.             }
  108.         }
  109.  
  110. printf("\n\n\n\n\n\n\n\n");
  111. C=C+1;
  112.  
  113. }while(C!=13);
  114.  
  115. /*buscar si quedo la g sola*/
  116. for(X=0;X<=7;X++)
  117.     {
  118.         for(Y=0;Y<=7;Y++)
  119.         {
  120.            if(A[X][Y]=='a'||A[X][Y]=='b'||A[X][Y]=='c'||A[X][Y]=='d'||A[X][Y]=='e'||A[X][Y]=='f'||A[X][Y]=='h'||A[X][Y]=='i'||A[X][Y]=='j'||A[X][Y]=='k'||A[X][Y]=='l'||A[X][Y]=='m'||A[X][Y]=='n')
  121.            {
  122.                perdiste=perdiste+1;
  123.            }
  124.         }
  125.     }
  126.  
  127. if(perdiste<1)
  128. {
  129.     /*you win*/
  130.     printf(" LBBB.         :BBBU        iBBBBBBBBBBBBBB        .BBBq              BBBB \n JBBB,         :BBB1    .:,.7EGNZNZ0ENZ0Z00..,:    .BBBq              BBBB \n UBBB:         iBBBk    UBBBL              BBBB    ,BBBE              BBBB \n PBBB.         ,BBBG    LBBBY              BBBB    .BBBq              BBBB \n iFUjXjX:   :XuPYUF7    7BBBL              BBBB    ,BBB0              BBBB \n     BBBJ   SBBB        7BBBY              BBBB    ,BBBq              BBBB \n     juYXUU5ujuY        7BBBL              BBBB    ,BBB0              BBBB \n        MBBB7           7BBBY              BBBB    .BBBq              BBBB \n        EBBBr           rBBBL              BBBB    ,BBB0              BBBB \n        8BBB7           7BBBY              BBBB    .BBBN              BBBB \n        GBBB7           7BBBL              BBBB    :BBBE              BBBB \n        OBBBv           2BBBY              BBBB    iBBBG              BBBB \n        OBBB7            :..7M8OGMGOGOGMGME..,,     ,..iOMGOGMGOGMGO8M,..: \n        BBBB1               YBBBBBBBBBBBBBB            .BBBBBBBBBBBBBB     \n         . .                7BBBBBOGNOBBBBB             BMZBBBBBBBBBBB     \n ....   .      .i:i                                 :..                ::: \n.BBBB   BBBB   0BBBJ              0BBB              BBBBBBB,          :BBB \n BBBM   BBBB   uBBB;              PBBB              BBBBBBB,          :BBB \n BBBE   BBBB   uBBB;              FBBB              BBBBBBB,          ,BBB \n BBB8   BBBB   YBBBi              kBBB              BBBBBBB.          ,BBB \n BBBE   BBBB   jBBB;              FBBB              BBB7   GBBB       ,BBB \n BBB8   BBBB   JBBBi              kBBB              BBB7   BBBB       ,BBB \n BBBE   BBBB   uBBB;              FBBB              BBBY       BBBB   .BBB \n BBBG   BBBB   JBBBi              XBBB              BBBL       BBBB    BBB \n BBBZ   BBBB   uBBBr              FBBB              BBBY           BBBBBBB \n.BBBB   BBBB   jBBBL              kBBB              BBBL           BBBBBBB \n :,.iMMM    BBB7                  kBBB              BBBj           BBBBBBB \n    ,BBB    BBBL                  BBBB              BBBF           BBBBBBB \nPresiona enter para continuar");
  131.     system("pause>nul");
  132.  
  133.  
  134.  
  135.  
  136.  
  137. }
  138.  
  139. else
  140. {
  141.     /*game over*/
  142.     printf("GEOEOGM8MOMOM8M8MOMG8ZOGMOMOMOMOM8M8OGOOMOMGOZ8ZM8M8M8M8MOMOMOMOM8M8M8OZ8ZG\nZZ0GGBBBBBBBBBBBBBBBGMMBBBBBBBBBBBBM8OBBBBBBG8ZOBBBBBBMBBBBBBBBBBBBBBBB8E8N\n80O8BBi:i:i:::i::::LBBB:i:i:::i:i:7BBBr:i::OBBBBk:i::JBr::iii:i:::i::.YBMGG\nG88B7:              BL:            iUB     .rBBr     :B                B8OE\nOEMB     :FFqX0P0XFZB     :7;i7.    :B.      ;:      iB.    YM0P0P0PqUEBMZZ\nZ8MB.    ZBjvjYuJu7qB.    BBBBBX    iB.              rB.    ;5YYLJLJv72B8OE\n8EMB.    FB        :B.    :ri:7.    rB.              rB.              .BMZG\nZGMB.    ZBEPBi    iB.              iB.    7S  8:    rB.    YB0E0ZNZqS0BG8E\n8EMB     .rrLu:    :B.    iUYvF.    iB.    0B71BL    iB.    iuYvL7L77i1BMZ8\nZG8BUL            YNB     2BBBB;    .B     YBBBB,    :B                B8OE\nO0O8BBJYjYYLYLjYYuBBBuLYj7EBMOBSLYj7kBUvjLvNB8MBk7JYLFBuYYuYjLYLYLYLLr5BOEG\nZGZO8BBBBBBBBBBBBBMMMBBBBBBOZ88BBBBBBBBBBBBBMBMBBBBBBBMBBBBBBBBBBBBBBBBOZ8E\n80OGBBBBBBBBBBBBBBBMBBBBBBB8OGMBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBG8ZG\nGZ8MBB           .BBB.    YBGMBr    iB.              iB.            .BBMG80\n80MB,              rB     YBM8B:    :B               ,B               iBMZG\nZGOB     JBOGB;    iB.    2BOBBr    iB.    qBBBBBBBBBBB.    PBBBB7    .BGO0\nO0MB.    FBBBBY    iB     qBBBBv    iB.     .   .    rB.    ....,    MMMOZG\nZGOB.    1BBBB7    ;B       BB      :B.              :B.           BBBBMG8E\n80MB.    SBBBBY    :BB8            BBB.    PBBBBBBBBBBB.    XB      :BBMMGG\nZ8OB               :BBBBL        XBBBB               7B.    XBB1      :B88E\n8EMMBE            BMB8MBBB.    iBBBOBB               .B     jBBBB:    ,BMG8\nZ8GMBB8BMBMBMBMBMMBBG8GOMBBMMB8BBBGO8BGMMBBBMBMBMBMBZMBM8BM8MB8BBBMBMO8BGO0\nONGE8OBBBBBBBBBBBBMZGEG088BBBBBM8EG0GGBBBBBBBBBBBBBBBMMMBBBBMZGZOMBBBBMZ8EZ");
  143. }
  144.  
  145. }

Etiquetas: comportamiento, extraño, int, juego, matriz, numero, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:08.