Autor
|
Tema: 2048 juego en C, algoritmo para que pierda (Leído 5,357 veces)
|
damical
Desconectado
Mensajes: 8
|
tengo el codigo completo en C, del juego 2048, no logro hacer que pierda, es decir, que termine cuando no queden mas movimientos ni celdas vacias!! Necesito ayuda, alguna sugerencia, algo! He estado horas con esto y no logro que me quede, gracias!!!1 #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 4 void imp_tablero (); void random_m (); //Funciones Movimientos void MOV_ARRIBA1 (); void MOV_ABAJO1 (); void MOV_IZQ1 (); void MOV_DER1 (); void MOV_ARRIBA2 (); void MOV_ABAJO2(); void MOV_DER2(); void MOV_IZQ2(); void lugares_ARRIBA(); void inicio_juego(); // Imprime tablero, muestra puntaje e indica movimiento. void movimiento(); // Generar movimiento void opciones(); //Pregunta al usuario si quiere continuar jugando. void verificar_mov(); void perder(); int tablero[N][N] = {0}; int aux, aux1=1,aux2=0,aux3=0,aux4=0,aux5=0; int a,b,ab,mov,no_mov1=0, no_mov2=0,no_mov3=0,no_mov4=0,no_mov5=0,no_mov6=0,no_mov7=0,no_mov8=0; int b1=0, juego=0; int cambio_num=0; int M=N-2, puntaje; char decision; int main() { printf ("--------------------------------------------------\n");; printf ("**2222222222**0000000000**444****444**8888888888**\n");; printf ("**2222222222**0000000000**444****444**8888888888**\n");; printf ("*********222**000****000**444****444**888****888**\n");; printf ("**2222222222**000****000**4444444444**8888888888**\n");; printf ("**2222222222**000****000**4444444444**8888888888**\n");; printf ("**222*********000****000*********444**888****888**\n");; printf ("**2222222222**0000000000*********444**8888888888**\n");; printf ("**2222222222**0000000000*********444**8888888888**\n");; printf ("--------------------------------------------------\n\n\n");; time_t t; for(a=0;a<3;a++) { random_m(); } while (juego==0){ inicio_juego(); imp_tablero(); movimiento(); } opciones (); return 0; } void imp_tablero() { int a,b,c=0,i,j; char borde = '|', piso= '_'; for(a=0;a<N;a++) { for(b=0;b<N;b++) { printf("%c\t%d\t%c",borde , tablero [a ][b ], borde ); } aux1=1; } //Indica movimiento realizado. if (mov==1) printf("\nMovimiento hacia arriba\n"); if (mov==2) printf ("\nMovimiento hacia abajo\n"); if (mov==3) printf ("\nMovimiento hacia la izquierda\n"); if (mov==4) printf ("\nMovimiento hacia la derecha\n"); for (i=0; i<N; i++){ for (j=0; j<N; j++){ puntaje= tablero[i][j]+c; c=puntaje; if (tablero[i][j]==2048){ printf ("\nFELICITACIONES, HAS GANADO EL JUEGO!\n"); juego=1;} } } printf("\nPUNTAJE: %d\n", puntaje ); } void random_m() { int h,g; do { b1=0; if(tablero[g][h]==0){ // Alternar para que aparezca '2' y '4' if (cambio_num==0) { tablero[g][h] = 2; cambio_num=1; b1 = 1; } else { tablero[g][h] = 4; cambio_num=0; b1 = 1; } } } while (b1==0); } void MOV_ARRIBA1() { do{ ab=0; for(a=1;a<N;a++) { for(b=0;b<N;b++) { if(tablero[a-1][b]==0&&tablero[a][b]!=0) { tablero[a-1][b]=tablero[a][b]; tablero[a][b]=0; ab=1; aux2=0; aux4=0; } else {aux2++; if (aux2==12){ no_mov3=1; b1=1; } else aux2=0; } } } }while (ab==1); mov=1; } void MOV_ABAJO1() { do{ ab=0; for(a=M;a>=0;a--) { for(b=0;b<N;b++) { if(tablero[a+1][b]==0&&tablero[a][b]!=0) { tablero[a+1][b]=tablero[a][b]; tablero[a][b]=0; ab=1; aux2=0; } else { aux2++; if (aux2==2){ no_mov5=1; b1=1; } else aux2=0; } } } }while(ab==1); mov=2; } void MOV_IZQ1() { do { ab=0; for (a=0;a<N;a++) { for (b=1;b<N;b++) { if(tablero[a][b-1]==0&&tablero[a][b]!=0) { tablero[a][b-1]=tablero[a][b]; tablero[a][b]=0; ab=1; aux2=0; } else {aux2++; if (aux2==2){ no_mov7=1; b1=1; } else aux2=0; } } } }while (ab==1); mov=3; } void MOV_DER1() { do{ ab=0; for (a=0;a<N;a++) { for (b=M;b>=0;b--) { if(tablero[a][b+1]==0&&tablero[a][b]!=0) { tablero[a][b+1]=tablero[a][b]; tablero[a][b]=0; ab=1; aux2=0; } else {aux2++; if (aux2==2){ no_mov1=1; b1=1; } else aux2=0; } } } }while (ab==1); mov=4; } void MOV_ARRIBA2() { for (a=1;a<N;a++) { for (b=0;b<N;b++) { if (tablero[a-1][b]==tablero[a][b]) { tablero[a-1][b]+=tablero[a][b]; tablero[a][b]=0; no_mov4=0; aux3=0; } else { aux3++; if (aux3==12) no_mov4=1; } } } } void MOV_ABAJO2() { for (a=M;a>=0;a--) { for (b=0;b<N;b++) { if (tablero[a+1][b]==tablero[a][b]) { tablero[a+1][b]+=tablero[a][b]; tablero[a][b]=0; aux3=0; } else { aux3=1; no_mov6=1; } } } } void MOV_DER2 () { for (a=0;a<N;a++) { for (b=M;b>=0;b--) { if(tablero[a][b+1]==tablero[a][b]) { tablero[a][b+1]+=tablero[a][b]; tablero[a][b]=0; aux3=0; } else { aux3=1; no_mov2=1; } } } } void MOV_IZQ2() { for(a=0;a<N;a++) { for(b=1;b<N;b++) { if(tablero[a][b-1]==tablero[a][b]) { tablero[a][b-1]+=tablero[a][b]; tablero[a][b]=0; aux3=0; } else { aux3=1; no_mov8=1; } } } } void inicio_juego() { printf("Utilice:\nW para arriba\nS para abajo\nD para derecha \nA para izquierda \n\n\n\n"); printf ("TABLERO DE JUEGO\n\n\n");; } void movimiento() { int i,h,g,a; int band=0; char t1; time_t t; do { char aux[1]; t1=aux[0]; switch(t1) { case 'w': case 'W': MOV_ARRIBA1 (); MOV_ARRIBA2(); MOV_ARRIBA1 (); random_m(); break; case 's': case 'S': MOV_ABAJO1(); MOV_ABAJO2(); MOV_ABAJO1(); random_m(); break; case 'a': case 'A': MOV_IZQ1(); MOV_IZQ2(); MOV_IZQ1(); random_m(); break; case 'd': case 'D': MOV_DER1; MOV_DER2(); MOV_DER1(); random_m(); break; default: { printf("\n\n\n\tTECLA ERRONEA\n\n"); break; } } imp_tablero(); } while(aux1==1); verificar_mov(); } void opciones() { char decision; printf("Desea seguir jugando?\nS = Si\nN = No\n-------> "); if (decision=='s'||decision=='S') juego=0; else printf ("GRACIAS POR JUGAR! HASTA LA PRÓXIMA.."); } void verificar_mov() { if (no_mov1==1&&no_mov2==1){ printf ("\nNO PUEDE MOVERSE A LA DERECHA\n"); aux2=0; aux3=0; aux4=0; no_mov1=0; no_mov2=0; b1=0; } if (no_mov3==1&&no_mov4==1){ printf ("\nNO PUEDE MOVERSE HACIA ARRIBA\n"); aux2=0; aux3=0; aux4=0; no_mov3=0; no_mov4=0; b1=0; } if (no_mov5==1&&no_mov6==1){ printf ("\nNO PUEDE MOVERSE HACIA ABAJO\n"); aux2=0; aux3=0; no_mov5=0; no_mov6=0; b1=0; } if (no_mov7==1&&no_mov8==1){ printf ("\nNO PUEDE MOVERSE A LA IZQUIERDA\n"); aux2=0; aux3=0; no_mov7=0; no_mov8=0; b1=0; } }
[MOD] Usar las etiquetas GeShi, para publicar código.
|
|
« Última modificación: 27 Mayo 2016, 02:44 am por simorg »
|
En línea
|
|
|
|
HardForo
Desconectado
Mensajes: 219
HardForo.com
|
void verificar_mov()
deberia ser
int verificar_mov()
O sea... debes devolver un boolean (o un entero) que te permita tomar una accion en consecuencia.
|
|
|
En línea
|
HardForo: foro de Hardware y programación Se buscan Mods y colaboradores *
|
|
|
damical
Desconectado
Mensajes: 8
|
void verificar_mov()
deberia ser
int verificar_mov()
O sea... debes devolver un boolean (o un entero) que te permita tomar una accion en consecuencia.
Pero, la logica que use en esa funcion esta bien? no entendi muy bien lo que me quisiste decir, perdon pero soy bastante lenta ja.
|
|
|
En línea
|
|
|
|
damical
Desconectado
Mensajes: 8
|
Tambien pasa, que cuando un movimiento no esta permitido (por ejemplo si no quedan mas movs a la derecha), el juego queda colgado.
|
|
|
En línea
|
|
|
|
HardForo
Desconectado
Mensajes: 219
HardForo.com
|
Veo... tienes un montón de variables aux, no es por criticar pero es dificil saber que hace cada una, deberias empezar definiendo bien los nombres de tus variables, que tus metodos del tipo quedan_movimientos() devuelvan "booleanos" (0 ó 1) y que no hagan nada mas! no imprimas nada dentro... no enredes el código, manten clara la funcionalidad de cada "módulo" (función)
Si re-organizas tu codigo, yo te ayudo...sino... es algo para mártires
|
|
« Última modificación: 27 Mayo 2016, 02:13 am por HardForo »
|
En línea
|
HardForo: foro de Hardware y programación Se buscan Mods y colaboradores *
|
|
|
damical
Desconectado
Mensajes: 8
|
Si, es verdad esta bastante entreverado, voy a ver si puedo arreglarlo un poco
|
|
|
En línea
|
|
|
|
damical
Desconectado
Mensajes: 8
|
Veo... tienes un montón de variables aux, no es por criticar pero es dificil saber que hace cada una, deberias empezar definiendo bien los nombres de tus variables, que tus metodos devuelvan "booleanos" (0 ó 1) y que no hagan nada mas! no imprimas nada dentro... no enredes el código, manten clara la funcionalidad de cada "módulo" (función)
Si re-organizas tu codigo, yo te ayudo...sino... es algo para mártires
Borré todo lo que estaba de mas, y quedo funcionando el jueguito (se mueve y suma), borre todo lo que habia intentado para que pierda, porque ni yo me entendia.. a ver si ahi esta un poco mejor: #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 4 void imp_tablero (); void random_m (); //Funciones Movimientos void MOV_ARRIBA1 (); void MOV_ABAJO1 (); void MOV_IZQ1 (); void MOV_DER1 (); void MOV_ARRIBA2 (); void MOV_ABAJO2(); void MOV_DER2(); void MOV_IZQ2(); void inicio_juego(); // Imprime tablero, muestra puntaje e indica movimiento. void movimiento(); // Generar movimiento void opciones(); //Pregunta al usuario si quiere continuar jugando. int tablero[N][N] = {0}; int aux, aux1=1,aux2=0,aux3=0,aux4=0,aux5=0; int a,b,ab,mov; int b1=0, juego=0; int cambio_num=0; int M=N-2, puntaje; char decision; int main() { printf ("--------------------------------------------------\n");; printf ("**2222222222**0000000000**444****444**8888888888**\n");; printf ("**2222222222**0000000000**444****444**8888888888**\n");; printf ("*********222**000****000**444****444**888****888**\n");; printf ("**2222222222**000****000**4444444444**8888888888**\n");; printf ("**2222222222**000****000**4444444444**8888888888**\n");; printf ("**222*********000****000*********444**888****888**\n");; printf ("**2222222222**0000000000*********444**8888888888**\n");; printf ("**2222222222**0000000000*********444**8888888888**\n");; printf ("--------------------------------------------------\n\n\n");; time_t t; for(a=0;a<3;a++) { random_m(); } while (juego==0){ inicio_juego(); imp_tablero(); movimiento(); } opciones (); return 0; } void imp_tablero() { int a,b,c=0,i,j; char borde = '|', piso= '_'; for(a=0;a<N;a++) { for(b=0;b<N;b++) { printf("%c\t%d\t%c",borde , tablero [a ][b ], borde ); } } //Indica movimiento realizado. if (mov==1) printf("\nMovimiento hacia arriba\n"); if (mov==2) printf ("\nMovimiento hacia abajo\n"); if (mov==3) printf ("\nMovimiento hacia la izquierda\n"); if (mov==4) printf ("\nMovimiento hacia la derecha\n"); for (i=0; i<N; i++){ for (j=0; j<N; j++){ puntaje= tablero[i][j]+c; c=puntaje; if (tablero[i][j]==2048){ printf ("\nFELICITACIONES, HAS GANADO EL JUEGO!\n"); juego=1;} } } printf("\nPUNTAJE: %d\n", puntaje ); } void random_m() { int h,g; do { b1=0; if(tablero[g][h]==0){ // Alternar para que aparezca '2' y '4' if (cambio_num==0) { tablero[g][h] = 2; cambio_num=1; b1 = 1; } else { tablero[g][h] = 4; cambio_num=0; b1 = 1; } } } while (b1==0); } void MOV_ARRIBA1() { do{ ab=0; for(a=1;a<N;a++) { for(b=0;b<N;b++) { if(tablero[a-1][b]==0&&tablero[a][b]!=0) { tablero[a-1][b]=tablero[a][b]; tablero[a][b]=0; ab=1; } } } }while (ab==1); mov=1; } void MOV_ARRIBA2() { for (a=1;a<N;a++) { for (b=0;b<N;b++) { if (tablero[a-1][b]==tablero[a][b]) { tablero[a-1][b]+=tablero[a][b]; tablero[a][b]=0; } } } } void MOV_ABAJO1() { do{ ab=0; for(a=M;a>=0;a--) { for(b=0;b<N;b++) { if(tablero[a+1][b]==0&&tablero[a][b]!=0) { tablero[a+1][b]=tablero[a][b]; tablero[a][b]=0; ab=1; } } } }while(ab==1); mov=2; } void MOV_ABAJO2() { for (a=M;a>=0;a--) { for (b=0;b<N;b++) { if (tablero[a+1][b]==tablero[a][b]) { tablero[a+1][b]+=tablero[a][b]; tablero[a][b]=0; } } } } void MOV_IZQ1() { do { ab=0; for (a=0;a<N;a++) { for (b=1;b<N;b++) { if(tablero[a][b-1]==0&&tablero[a][b]!=0) { tablero[a][b-1]=tablero[a][b]; tablero[a][b]=0; ab=1; } } } }while (ab==1); mov=3; } void MOV_IZQ2() { for(a=0;a<N;a++) { for(b=1;b<N;b++) { if(tablero[a][b-1]==tablero[a][b]) { tablero[a][b-1]+=tablero[a][b]; tablero[a][b]=0; } } } } void MOV_DER1() { do{ ab=0; for (a=0;a<N;a++) { for (b=M;b>=0;b--) { if(tablero[a][b+1]==0&&tablero[a][b]!=0) { tablero[a][b+1]=tablero[a][b]; tablero[a][b]=0; ab=1; } } } }while (ab==1); mov=4; } void MOV_DER2 () { for (a=0;a<N;a++) { for (b=M;b>=0;b--) { if(tablero[a][b+1]==tablero[a][b]) { tablero[a][b+1]+=tablero[a][b]; tablero[a][b]=0; } } } } void inicio_juego() { printf("Utilice:\nW para arriba\nS para abajo\nD para derecha \nA para izquierda \n\n\n\n"); printf ("TABLERO DE JUEGO\n\n\n");; } void movimiento() { int i,h,g,a; int band=0; char t1; time_t t; do { char aux[1]; t1=aux[0]; switch(t1) { case 'w': case 'W': MOV_ARRIBA1 (); MOV_ARRIBA2(); MOV_ARRIBA1 (); random_m(); break; case 's': case 'S': MOV_ABAJO1(); MOV_ABAJO2(); MOV_ABAJO1(); random_m(); break; case 'a': case 'A': MOV_IZQ1(); MOV_IZQ2(); MOV_IZQ1(); random_m(); break; case 'd': case 'D': MOV_DER1; MOV_DER2(); MOV_DER1(); random_m(); break; default: { printf("\n\n\n\tTECLA ERRONEA\n\n"); break; } } imp_tablero(); } while(aux1==1); } void opciones() { char decision; printf("Desea seguir jugando?\nS = Si\nN = No\n-------> "); if (decision=='s'||decision=='S') juego=0; else printf ("GRACIAS POR JUGAR! HASTA LA PRÓXIMA.."); }
[MOD] Para publicar código, usar etiquetas GeShi. Segundo aviso.
|
|
« Última modificación: 27 Mayo 2016, 02:46 am por simorg »
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Balas con GPS para que la policía no pierda la pista de coches fugitivos
Noticias
|
wolfbcn
|
7
|
2,689
|
1 Mayo 2014, 04:29 am
por Gh057
|
|
|
Algoritmo de búsqueda en juego de adivinanza
Foro Libre
|
JonaLamper
|
8
|
4,794
|
2 Febrero 2015, 00:57 am
por @synthesize
|
|
|
Crear juego de 2048 en lenguaje C con Codeblocks
Programación C/C++
|
Carlos.Martinez
|
2
|
3,791
|
18 Noviembre 2015, 03:36 am
por furciorifa
|
|
|
Problemas en este programa (Juego de 2048 en C) No responde a comandos W,A,S,D
Programación C/C++
|
Carlos.Martinez
|
4
|
2,504
|
20 Mayo 2016, 21:19 pm
por damical
|
|
|
PROGRAMAR EN C EL JUEGO "2048"
Programación C/C++
|
damical
|
2
|
3,234
|
17 Mayo 2016, 15:35 pm
por damical
|
|