Autor
|
Tema: Juego 4 en linea. Ayuda!!! (Leído 12,302 veces)
|
rir3760
Desconectado
Mensajes: 1.639
|
Algunos comentarios:
En la cadena de formato " \n%d" no es necesario utilizar " \n" ya que la función lo primero que hace es descartar el espacio blanco (tabulador, avance de linea, etc). Solo es necesario cuando se utilizan los especificadores "%c" y "%[]" ya que con ellos el descarte no sucede. /* ... */ char matriz[dim][dim];
Si van a utilizar un array declarado en esa forma hay que asegurarse de que el compilador soporte el estándar C99 y se compile en ese modo (a veces sucede). char matriz[dim][dim]; /* ... */ for (i = 1; i <= dim; i++){ for (j = 1; j <= dim; j++){ matriz[i][j] = '.'; } }
En C y C los indices de los arrays inician en 0 y terminan en N-1 donde N es el numero de elementos. Hay que cambiar el par de bucles a: char matriz[dim][dim]; /* ... */ for (i = 0; i < dim; i++){ for (j = 0; j < dim; j++){ matriz[i][j] = '.'; fputs(". ", stdout ); /* Imprime ". " en la salida estandar */ } }
Un saludo
|
|
|
En línea
|
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language
|
|
|
KaL3o
Desconectado
Mensajes: 60
|
hay varios apartes que se repiten, seria bueno utilizar funciones, reduciriaas varias lineas de codigo salu2 ![:)](https://foro.elhacker.net/Smileys/navidad/smiley.gif)
|
|
|
En línea
|
Todos los caminos se vuelven a juntar. Pero nunca de la misma forma.
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
Algunos comentarios: ........................................ Si van a utilizar un array declarado en esa forma hay que asegurarse de que el compilador soporte el estándar C99 y se compile en ese modo (a veces sucede).
Yo al menos llevo un tiempito usándolos en el Code::Blocks sin problemas.char matriz[dim][dim]; /* ... */ for (i = 1; i <= dim; i++){ for (j = 1; j <= dim; j++){ matriz[i][j] = '.'; } }
En C y C los indices de los arrays inician en 0 y terminan en N-1 donde N es el numero de elementos. Hay que cambiar el par de bucles a: char matriz[dim][dim]; /* ... */ for (i = 0; i < dim; i++){ for (j = 0; j < dim; j++){ matriz[i][j] = '.'; fputs(". ", stdout ); /* Imprime ". " en la salida estandar */ } }
Un saludo Sí, estoy de acuerdo contigo. Pero yo lo estoy haciendo "a conciencia", puesto que las líneas de i=0 y j=0 se rellenarán para la numeración de las casillas. Y la dimensión de la matriz en mi último post ya estaba corregida a dim+1. De todas formas, gracias nuevamente por la atención prestada. Saluditos! .... ..![](https://st.forocoches.com/foro/images/smilies/ciao.gif)
|
|
« Última modificación: 12 Junio 2013, 17:15 pm por leosansan »
|
En línea
|
|
|
|
mathias_vg
Desconectado
Mensajes: 39
|
Buenas! finalmente luego de unas cuantas horas podido hacer el juego. Lo posteo abajo para que me puedan corregir algunas cosas las cuales yo no me doy cuenta debido a que soy bastante nuevo en esto. leosansan muchas gracias, me ha sido de gran ayuda tus consejos. #include <stdio.h> #include <stdlib.h> #define DIM 16 int inicializar_tablero(char tablero[][DIM],int); int juegan_O_(char tabla[][DIM],int,int); int juegan_X_(char tablero[][DIM],int,int); int main() { int n=0,i,j,x,resto=1,k=0,jugador,partida,victoria=0; char d; printf("\n\n\n JUEGO CONECTA CUATRO\n\n\n\n\n\n\n"); printf(" Nueva partida (S/N): "); do { if (d=='n' || d=='N') { return 1; } if (d!='s' && d!='S') printf("\nOpcion incorrecta. Elija: s / n "); }while (d!='s' && d!='S'); volver: printf("\n\nIngresa la dimension del tablero de juego(4-15): "); do { if (x<4 || x>15) printf("\nOpcion no valida. Ingresa la dimension (4-15): "); } while (x<4 || x>15); char tablero[DIM][DIM]; printf("\n ELIJA JUGADOR\n\n\n"); printf("\n\n 1) JUGADOR 1 (X)\n"); printf("\n\n 2) JUGADOR 2 (O)\n"); elegir: if ((jugador!=1) && (jugador!=2)) { printf("\nError: Los jugadores posibles son 1 y 2 "); goto elegir; } do { inicializar_tablero(tablero,x); while ((resto<=(x*x)) && (victoria!=1)) { if (jugador==1) { jugador++; juegan_X_(tablero,x,n); for (i=1;i<=x;i++) { for (j=1;j<=x;j++) { if ((tablero[i][j]=='X') && ((tablero[i][j+1])=='X') && ((tablero[i][j+2])=='X') && ((tablero[i][j+3])=='X')) { victoria = 1; } else if ((tablero[i][j]=='X') && ((tablero[i+1][j])=='X') && ((tablero[i+2][j])=='X') && ((tablero[i+3][j])=='X')) { victoria = 1; } else if ((tablero[i][j]=='X') && ((tablero[i+1][j-1])=='X') && ((tablero[i+2][j-2])=='X') && ((tablero[i+3][j-3])=='X')) { victoria = 1; } else if ((tablero[i][j]=='X') && ((tablero[i+1][j+1])=='X') && ((tablero[i+2][j+2])=='X') && ((tablero[i+3][j+3])=='X')) { victoria = 1; } } } if (victoria == 1) { printf("\nJUGADOR 1 GANA!!!\n"); } else { resto++; } } else if (jugador == 2) { jugador--; juegan_O_(tablero,x,n); for (i=1;i<=x;i++) { for (j=1;j<=x;j++) { if ((tablero[i][j]=='O') && ((tablero[i][j+1])=='O') && ((tablero[i][j+2])=='O') && ((tablero[i][j+3])=='O')) { victoria = 1; } else if ((tablero[i][j]=='O') && ((tablero[i+1][j])=='O') && ((tablero[i+2][j])=='O') && ((tablero[i+3][j])=='O')) { victoria = 1; } else if ((tablero[i][j]=='O') && ((tablero[i+1][j-1])=='O') && ((tablero[i+2][j-2])=='O') && ((tablero[i+3][j-3])=='O')) { victoria = 1; } else if ((tablero[i][j]=='O') && ((tablero[i+1][j+1])=='O') && ((tablero[i+2][j+2])=='O') && ((tablero[i+3][j+3])=='O')) { victoria = 1; } } } if (victoria == 1) { printf("\nJUGADOR 2 GANA!!!\n"); } else { resto++; } } if (resto > (x*x) && (victoria!=1)) { } } }while ((resto<=(x*x)) && (victoria!=1)); resto = 1; victoria = 0; printf("\nPara jugar nuevamente presione 1: "); if (partida == 1) { goto volver; } } int inicializar_tablero(char tablero[DIM][DIM],int x) { int i,j; for (i=1; i<=x; i++) { for (j=1;j<=x; j++) { printf("%c ",tablero [i ][j ]='.'); } } } int juegan_X_(char tablero[DIM][DIM],int x,int n) { int i,j,k; do { printf("\nJuega JUGADOR 1: "); if (n<1 || n>x) { printf("Error: las columnas posibles son de 1 a %d",x ); } else if (tablero[1][n]!='.') { printf("\nError: la columna ya esta llena.\n "); } }while((n<1 || n>x) || (tablero[1][n]!='.')); for (k=x;k>=1;k--) { if (tablero[k][n]!='.') continue; else { tablero[k][n]='X'; break; } } printf("\nUltima jugada X: Columna %d\n",n ); for (i=1;i<=x;i++) { for (j=1;j<=x;j++) { } } } int juegan_O_(char tablero[DIM][DIM],int x,int n) { int i,j,k; do { printf("\nJuega JUGADOR 2: "); if (n<1 || n>x) { printf("Error: las columnas posibles son de 1 a %d",x ); } else if (tablero[1][n]!='.') { printf("\nError: la columna ya esta llena.\n "); } }while((n<1 || n>x) || (tablero[1][n]!='.')); for (k=x;k>=1;k--) { if (tablero[k][n]!='.') continue; else { tablero[k][n]='O'; break; } } printf("\nUltima jugada O: Columna %d\n",n ); for (i=1;i<=x;i++) { for (j=1;j<=x;j++) { } } }
|
|
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
hay varios apartes que se repiten, seria bueno utilizar funciones, reducirias varias lineas de codigosalu2 ![:)](https://foro.elhacker.net/Smileys/navidad/smiley.gif) Pues la verdad que tienes razón y como simple ejercicio voy a rehacer el código usando funciones, o sea modular, para que no se repitan líneas de código más allá de las imprescindibles.
Y ahora que mathias_vg a publicado su código, posteo el mío. Y como una imagen vale más que mil palabras ahí va:![](http://i1280.photobucket.com/albums/a497/leosansan/GRAFICOS1/conecta4beta1_zpsa3bac13e.jpg) Observar que he tenido en cuenta el "detallito" de que si el usuario introduce por error una letra en lugar de un número no entre en un bucle. ![;)](https://foro.elhacker.net/Smileys/navidad/wink.gif)
Conste que hay una dimensión de la matriz por usar, todo a su momento, como el tema del color. ¿Te animas a una partidita?:#include <stdio.h> #include <stdlib.h> #include<locale.h> /************** FUNCIONES **************/ char** asig_memoria( int dim_plus); void tamanyo_consola (char **matriz,int dim_plus); void jugada(char **matriz,int dim_plus,int jugador, int color_juego); void imprimir(char **matriz,int dim_plus,int color_juego); void comprobar_ganador (char **matriz , int jugador, int x, int y, int dim_plus, int color_jueg); void ganador (char** matriz,int jugador, int dim_plus, int color_juego,int gana_empata); void contador(int* cont,char** matriz,int jugador, int dim_plus, int color_juego); void liberar_mem_matriz( char** matriz, int dim_plus); void salir( char** matriz, int dim_plus); /************** FUNCION MAIN **************/ int main() { setlocale(LC_ALL, "Spanish"); int color_juego=0,dim_plus=0; char d,**matriz; int i=0,j=0,dim=0,movimientos=0,k=0,jugador=1,gana_empata=0; printf("\n\n\tIngresa la dimensión del tablero de juego (4-10):"); fflush (stdout); do { scanf ("%d",&dim); if (dim<4 || dim>10 ) { printf("\n\n\t\tOpción no valida.\n\n\t\tIngresa la dimensión (4-10): "); fflush (stdout); } while (getchar()!='\n'); }while (dim<4 || dim>10); dim_plus=dim+1; matriz = asig_memoria( dim_plus ); for (i=1;i<dim_plus;i++) for (j=1;j<dim_plus;j++) matriz[i][j]=' '; tamanyo_consola (matriz, dim_plus); imprimir( matriz, dim_plus, color_juego); while (movimientos<=(dim*dim)) { jugada( matriz, dim, jugador, color_juego); imprimir( matriz, dim_plus, color_juego); if (jugador==1) jugador=2; else jugador=1; movimientos++; if (movimientos==dim*dim) ganador (matriz,jugador,dim_plus, color_juego,gana_empata); } system("PAUSE"); return 0; } /************** FUNCION JUGADA **************/ void jugada(char **matriz,int dim_plus,int jugador,int color_juego) { int x=0,y=0,flag=0; char simbolo[]={'X','O'}; do { do { flag=0; printf("\nJUGADOR %d (%c): ",jugador,simbolo[jugador-1]); fflush (stdout); scanf ("%d",&y); while (getchar()!='\n'); if (y<1 || y>dim_plus) puts("Opción no valida.\nIngresa (4-10)"); }while(y<1 || y>dim_plus); for (x=dim_plus;x>=0;x--)/*<==este for es mejorable*/ { if (matriz[x][y]!=' ' && x!=0) continue; else if (x==0) { puts("¡Ya se llego al limite!.\nIntroduzca otro valor."); flag=1; } else { matriz[x][y]=simbolo[jugador-1]; break; } } }while (flag==1); comprobar_ganador (matriz,jugador,x, y,dim_plus, color_juego); } /************** FUNCION TAMAÑO DE LA CONSOLA **************/ void tamanyo_consola (char **matriz,int dim_plus) { char tamanyo_consola2[80]; int tam_x=0,tam_y=0; tam_x=3.8*dim_plus; /* con estos valores puedes*/ tam_y=2*dim_plus ;/*cambiar el tamaño de la consola*/ sprintf(tamanyo_consola2, "MODE %d,%d", tam_x, tam_y); system(tamanyo_consola2); system ("cls"); } /************** FUNCION ASIGNACION DE MEMORIA **************/ char **asig_memoria(int dim_plus ) { int i; char** matriz; matriz = malloc( dim_plus * sizeof *matriz ); for( i = 0; i < dim_plus; ++i ) matriz[i] = malloc( dim_plus * sizeof **matriz ); return matriz; } /************** FUNCION IMPRIMIR **************/ void imprimir(char **matriz,int dim_plus,int color_juego) { int i=0,j=0; system ("cls"); for (i=0;i<dim_plus;i++) { for (j=1;j<dim_plus;j++) { if (i==0) { printf ("[%d] ",j); fflush (stdout); } else { printf ("(%c) ",matriz[i][j]); fflush (stdout); } } puts(""); } } /************** FUNCION COMPROBAR GANADOR **************/ void comprobar_ganador (char **matriz , int jugador, int x, int y,int dim_plus,int color_juego) { int k=1,cont=1; for (k=1;k<5;k++) { if ( x+k <= dim_plus && y+k <= dim_plus && matriz[x][y]==matriz[x+k][y+k]) contador (&cont, matriz,jugador,dim_plus, color_juego); else break; } for (k=1;k<5;k++) { if ( x+k > 0 && y+k > 0 && matriz[x][y]==matriz[x-k][y-k]) contador (&cont, matriz,jugador,dim_plus, color_juego); else break; } cont=1; for (k=1;k<5;k++) { if ( x+k <= dim_plus && y+k > 0 && matriz[x][y]==matriz[x+k][y-k]) contador (&cont, matriz,jugador,dim_plus, color_juego); else break; } for (k=1;k<5;k++) { if ( x+k > 0 && y+k <= dim_plus && matriz[x][y]==matriz[x-k][y+k]) contador (&cont, matriz,jugador,dim_plus, color_juego); else break; } cont=1; for (k=1;k<5;k++) { if ( x+k <= dim_plus && matriz[x][y]==matriz[x+k][y]) contador (&cont, matriz,jugador,dim_plus, color_juego); else break; } cont=1; for (k=1;k<5;k++) { if ( y+k <= dim_plus && matriz[x][y]==matriz[x][y+k]) contador (&cont, matriz,jugador,dim_plus, color_juego); else break; } for (k=1;k<5;k++) { if (y+k > 0 && matriz[x][y]==matriz[x][y-k] ) contador (&cont, matriz,jugador,dim_plus, color_juego); else break; } } /************** FUNCION LIBERAR MEMORIA **************/ void liberar_mem_matriz( char** matriz, int dim_plus ) { int i; for( i = 0; i < dim_plus; ++i ) free( matriz[i] ); free( matriz ); } /************** FUNCION CONTADOR **************/ void contador(int* cont,char** matriz,int jugador, int dim_plus, int color_juego) { int gana_empata=1; *cont=+*cont+1; if (*cont==4) { imprimir( matriz, dim_plus+1, color_juego); ganador (matriz,jugador,dim_plus, color_juego,gana_empata); } } /************** FUNCION GANADOR **************/ void ganador (char** matriz,int jugador, int dim_plus, int color_juego,int gana_empata) { if (gana_empata==1) printf ("Ganó el JUGADOR %d\n",jugador); else if (gana_empata==0) puts("EMPATE"); else puts("¡ERROR!"); puts ("Hasta lueguito."); salir( matriz, dim_plus ); } /************** FUNCION SALIR **************/ void salir( char** matriz, int dim_plus ) { int i; for( i = 0; i < dim_plus; ++i ) free( matriz[i] ); free( matriz ); system ("pause"); exit (0); } /************** FIN **************/
Próximamente habrán más novedades/variantes del /los juegos, tanto del Conecta-4 como del 4 en línea.
Por supuesto que serán bienvenidas las críticasy/o sugerencias.
Ya adelanto que la intención es que tenga color y que se pueda elegir entre seguir jugando o salir. Detallitos que espero hagan más sugerente el/los jueguitos.
Y sí, ya sé que lo he "complicado" con tanta función pero de eso iba el "envite" deKaL3o . Saluditos!.
|
|
« Última modificación: 31 Diciembre 2013, 11:58 am por leosansan »
|
En línea
|
|
|
|
mathias_vg
Desconectado
Mensajes: 39
|
Me podrian decir porque entra en bucle cuando elijo un caracter? Que es lo que tengo que modificar?
Muchas gracias
|
|
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
Me podrían decir porque entra en bucle cuando elijo un caracter? Que es lo que tengo que modificar?
Ya sabía que tarde o temprano te darías cuanta por ti mismo. Se debe a que el caracter, no utilizado porque el scanf no lo reconoce, ya que el espera un int, se queda en el bufer y en la próxima llamada al scanf éste toma automáticamente el valor del carcater que quedo en el bufer y y así sucesivamente entrando por ello en un bucle.
Fíjate e los detalles de mi código:
do { scanf ("%d",&dim); if (dim<4 || dim>10 ) { printf("\n\n\t\tOpción no valida.\n\n\t\tIngresa la dimensión (4-10): "); fflush (stdout); } while (getchar()!='\n'); /*<==limpio el buffer e impido entrar en un bucle*/ }while (dim<4 || dim>10);
Eso en los scanf de tipos numéricos, no hace falta cuando son de tipo char. Saluditos! .... ..![](https://st.forocoches.com/foro/images/smilies/dancer2.gif)
|
|
« Última modificación: 12 Junio 2013, 07:37 am por leosansan »
|
En línea
|
|
|
|
mathias_vg
Desconectado
Mensajes: 39
|
Gracias leosansan, ahora, te pregunto, hay alguna manera de hacerlo sin tener que utilizar la funcion getchar? ya que no la dimos en clase y no se si la puedo utilizar. algo como transformar el caracter de entrada en numero y asi que me marque el error?
Saludos
|
|
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
Gracias leosansan, ahora, te pregunto, hay alguna manera de hacerlo sin tener que utilizar la funcion getchar? ya que no la dimos en clase y no se si la puedo utilizar. algo como transformar el caracter de entrada en numero y así que me marque el error?
Si sólo fuera un caracter podrías hacer uso de atoi, y aún así habría que añadir la condición de >0 y <15, pero como ves el "15" no es un caracter sino una cadena, con lo que no valdría el uso de dicha función y, en principio lo que se me ocurre a bote proto, sería usar una función como "strol". Pero se me hace difícil entender que no uses getchar, que es una función muy usada de la librería stdio y, a cambio, te metas con funciones de la librería string que conllevan más cosas para lograr el objetivo.
Usa getchar.
Es más, en varios compiladores -e.j. Dev-C++- es una función que se aprende al tiempo que el uso de main o printf, pues si no la ponen al final del código el programa se ejecuta y se cierra de un golpe y, en ese caso, se usa getchar "como freno" para "ver" la consola antes de que ésta se cierre.Saluditos!. ![](https://st.forocoches.com/foro/images/smilies/aaaaa.gif)
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
En Age of the Empire Conquerors como juego en lìnea si es una copia???
Juegos y Consolas
|
(¸.•´ .•´Trowa ¸.•´¸.•´¯)
|
4
|
5,000
|
18 Abril 2004, 05:12 am
por redHat
|
|
|
Crea tu propio Juego, sin programar ni una sola linea de codigo
Juegos y Consolas
|
[Decoded]
|
7
|
4,051
|
26 Septiembre 2007, 03:31 am
por [Decoded]
|
|
|
On Live, una plataforma de juego en línea
Noticias
|
wolfbcn
|
0
|
1,443
|
9 Junio 2011, 18:09 pm
por wolfbcn
|
|
|
Juego en linea con anti WPE PRO
Juegos y Consolas
|
komanndoos
|
0
|
2,352
|
1 Noviembre 2015, 03:18 am
por komanndoos
|
|
|
juego de cuatro en linea en lenguaje C
Programación C/C++
|
gwennnnnn26
|
5
|
3,715
|
7 Diciembre 2016, 01:24 am
por jvm1994
|
|