elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
29 Mayo 2012, 00:54  


Tema destacado: Personaliza-Escoge el diseño del foro que más te guste.

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  Duda sobre Cuatro en línea
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda sobre Cuatro en línea  (Leído 380 veces)
DickGumshoe

Desconectado Desconectado

Mensajes: 145


Ver Perfil WWW
Duda sobre Cuatro en línea
« en: 18 Enero 2012, 18:03 »

Hola.


Hola.

Estoy haciendo el juego del 4 en raya.

Mi problema es que pregunto la columna en la que quiero poner la ficha, y "cae" a la de más abajo. Pero después, si meto la misma columna, en vez de caerme justo arriba de la ficha, "cae" en la misma casilla (las fichas son 1 y 2, según jugador 1 y jugador 2).

Mi código es:

Código
#include<stdio.h>
#include<stdlib.h>
 
int main (void){
 
  int M[8][8];
 
 int i,j,col,jugador,s,fila,xd;
 int v[col];
 
 
 
  for(i=0;i<8;i++){
  for(j=0;j<8;j++){
  M[i][j]=0;
  }
  }
  jugador=1;
 
  do{    
 
 
  for(i=0;i<8;i++){
  for(j=0;j<8;j++){
  printf("%d  ",M[i][j]);                
  }  
  printf("\n");                                  
  }
 
  printf("Introduce la columna ");
  scanf("%d",&col);
 
  col=col-1;
 
  fila=7;
 
  M[fila][col]=jugador;
 
  fila--;
 
 
  printf("Introduzca un 0 si abandona o un 1 si quiere seguir jugando");
  scanf("%d",&s);
  jugador=3-jugador;
  }while(s==1);
 
 
system("pause");    
}
 

Muchas gracias.
Saludos.


En línea
soyloqbuskas

Desconectado Desconectado

Mensajes: 94


¡El conocimiento es de todos!


Ver Perfil
Re: Duda sobre Cuatro en línea
« Respuesta #1 en: 18 Enero 2012, 19:05 »

¡Buenas DickGumshoe!

Tu problema es sencillode resolver.
La variable fila no la tienes inicializada al principio, si no que la inicializas dentro del bucle, cuando en realidad deberias hacerlo fuera.

Código:
fila=7;
do{

//codigo del juego...
fila--;

}while(s==1);

Si fila=7 lo metes dentro del bucle, fila solo toma los valores 7 y 6.....
Ademas, tu variable fila es un int, eso significa que si el bucle se repite 8 veces, fila sera igual a "-1"......asi que deberas poner un:
Código:
if(fila==0)//la fila esta llena, entonces no insertar

¡Espero haberte ayudado, un saludo!

PD: Deberias tabular y comentar el codigo, asi te sera mas facil a ti y a los demas ver donde estan los fallos.


« Última modificación: 18 Enero 2012, 19:09 por soyloqbuskas » En línea

"Si tienes 1 manzana y yo tengo otra manzana...
y las intercambiamos, ambos seguiremos teniendo 1 manzana.
Pero...si tu tienes 1 idea y yo tengo otra idea...
y las intercambiamos, ambos tendremos 2 ideas."


George Bernard Shaw
DickGumshoe

Desconectado Desconectado

Mensajes: 145


Ver Perfil WWW
Re: Duda sobre Cuatro en línea
« Respuesta #2 en: 18 Enero 2012, 19:12 »

¡Muchísimas gracias!

Ahora mismo acabo de ponerlo fuera del bucle, y, así, me he dado cuenta de otro problema...
Ahora siempre me sale primero la fila 8, después; la 6, la 5, la 4... Incluso cuando meto una columna que no haya usado nunca...

¿Podría darme alguna pista para resolver eso?

Gracias.

Saludos.
En línea
satu

Desconectado Desconectado

Mensajes: 263

Siempre aprendiendo


Ver Perfil WWW
Re: Duda sobre Cuatro en línea
« Respuesta #3 en: 18 Enero 2012, 21:43 »

Hola

La solución es muy fácil, lo que tienes que hacer es que "fila" sea un array con tantos campos como columnas haya y en cada posición almacene la fila por la que va esa columna. Al principio inicializas todas las posiciones a 7 y si por ejemplo insertas en la columna "col" pues fila[col]-- y listo.

A esto tendrías que añadirle un control para que no se pueda insertar en las columnas que ya estén llenas.

Saludos
En línea

Breakbeat como forma de vida
DickGumshoe

Desconectado Desconectado

Mensajes: 145


Ver Perfil WWW
Re: Duda sobre Cuatro en línea
« Respuesta #4 en: 18 Enero 2012, 23:19 »

Muchísimas gracias, pero hace unos meses que empecé con C, y no le he entendido muy bien.

Saludos.
En línea
satu

Desconectado Desconectado

Mensajes: 263

Siempre aprendiendo


Ver Perfil WWW
Re: Duda sobre Cuatro en línea
« Respuesta #5 en: 19 Enero 2012, 12:12 »

Hola

La idea es crearte un array que tenga tantas posiciones como columnas tenga el tablero, en este caso 8. Pues cada una de esas posiciones (que corresponden a las columnas del tablero) indicará dónde se insertará la ficha. Te lo explico con un ejemplo:

Código
#include<stdio.h>
#include<stdlib.h>
 
int main (void)
{
  int M[8][8];
 
 int i, j, col, jugador, s, fila[8];
 
  for(i=0; i<8; i++){
      for(j=0; j<8; j++){
          M[i][j] = 0;
      }
      fila[i] = 7;
  }
 
  jugador = 1;
 
  do{    
 
 
  for(i=0; i<8; i++){
      for(j=0; j<8; j++){
          printf("%d  ",M[i][j]);                
      }  
      printf("\n");                                  
  }
 
  printf("Introduce la columna (1-8): ");
  scanf("%d", &col);
 
  col = col-1;
 
  M[fila[col]][col] = jugador;
 
  fila[col]--; //
 
 
  printf("Introduzca un 0 si abandona o un 1 si quiere seguir jugando: ");
  scanf("%d", &s);
  jugador = 3-jugador;
  }
  while(s==1);
 
 
system("pause");    
return 0;
}
 

Si tienes más dudas ya sabes.

Saludos
En línea

Breakbeat como forma de vida
DickGumshoe

Desconectado Desconectado

Mensajes: 145


Ver Perfil WWW
Re: Duda sobre Cuatro en línea
« Respuesta #6 en: 19 Enero 2012, 16:23 »

Ah, ¡muchísimas gracias!

Ahora entiendo bien lo que me ha explicado.

Ahora estoy intentando poner si el juego lo gana el jugador 1 o el 2 (quien tenga 4 fichas seguidas en horizontal, en vertical o en diagonal).

Más o menos tengo pensado cómo es, pero falla algo... Al no tener cada "ficha" un valor, no puedo hacer lo que estoy pensando (lo que había pensado era que gana el que tuviera ficha, ficha +1, ficha +2 y ficha + 3 o el que tuviera ficha, ficha+9, ficha+18 y ficha +27).

Al no tener eso, no sé cómo podría plantearlo...

Gracias.
En línea
satu

Desconectado Desconectado

Mensajes: 263

Siempre aprendiendo


Ver Perfil WWW
Re: Duda sobre Cuatro en línea
« Respuesta #7 en: 19 Enero 2012, 17:26 »

Hola

La idea es crearte una función (no se si habrás llegado a ese tema) a la que le pasas por parámetros la matriz (el tablero) y solo tienes que comprobar si hay 4 posiciones consecutivas, en horizontal, vertical o diagonal, con el mismo valor (1 si en esa posición ha puesto el jugador 1 o 2 si ha puesto el jugador 2) y comprobar también que ese valor no es 0 (el tablero está inicializado a 0)

Coge un papel y un boli y dibújate el tablero y al lado del tablero el número de las filas y de las columnas para que veas las comprobaciones que tienes que hacer, es fácil pero lía un poco.

Si no te sale te pongo una posible solución

Saludos
En línea

Breakbeat como forma de vida
DickGumshoe

Desconectado Desconectado

Mensajes: 145


Ver Perfil WWW
Re: Duda sobre Cuatro en línea
« Respuesta #8 en: 19 Enero 2012, 17:47 »

Sí, justo antes de empezar con las matrices estuve viendo el tema de funciones del manual que estoy siguiendo.

¿Con que ponga la matriz en parámetros se refiere a la que tenía en la función main (int M[8][8]; )?

¿Y cómo podría comprobar que hay cuatro valores iguales en la misma posición?

Gracias, y siento si estoy preguntando mucho...

Saludos.
« Última modificación: 19 Enero 2012, 18:05 por DickGumshoe » En línea
satu

Desconectado Desconectado

Mensajes: 263

Siempre aprendiendo


Ver Perfil WWW
Re: Duda sobre Cuatro en línea
« Respuesta #9 en: 19 Enero 2012, 18:03 »

Hola

Claro, esa matriz.

Un ejemplo sería:
Código
int finPartida(int m[FILAS][COLUMNAS])
{
   int i, j;
   for(i = FILAS-1; i >= 3; i--)
       for(j = COLUMNAS-1; j >= 3; j--)
           if((m[i][j] == m[i-1][j] && m[i][j] == m[i-2][j] && m[i][j] == m[i-3][j] && m[i][j] != 0) || /*Aqui comprobamos si hay 4 iguales en la misma fila*/
              (m[i][j] == m[i][j-1] && m[i][j] == m[i][j-2] && m[i][j] == m[i][j-3] && m[i][j] != 0) || /*Aqui comprobamos si hay 4 iguales en la misma columna*/
              (m[i][j] == m[i-1][j-1] && m[i][j] == m[i-2][j-2] && m[i][j] == m[i-3][j-3] && m[i][j] != 0)) /*Aqui comprobamos si hay 4 iguales en la diagonal principal*/
               return 1;
 
   for(i = FILAS-1; i >= 3; i--)
       for(j = 0; j <= COLUMNAS-3; j++)
           if(m[i][j] == m[i-1][j+1] && m[i][j] == m[i-2][j+2] && m[i][j] == m[i-3][j+3] && m[i][j] != 0) /*Aqui comprobamos si hay 4 iguales en la diagonal secundaria*/
               return 1;
 
   return 0;
}
 

Aquí debes cambiar FILAS y COLUMNAS por 8, yo lo he hecho genérico.

Entonces si devuelve 1 es que hay 4 en raya, si devuelve 0 sigue el juego. Ahora tienes que meter en el main la llamada a esta función, y dependiendo del valor de retorno se acabará el juego o no.

Me voy a poner a hacer una versión del juego utilizando lo que llevas hasta ahora, cuando lo termine lo pongo aquí.

Saludos
En línea

Breakbeat como forma de vida
DickGumshoe

Desconectado Desconectado

Mensajes: 145


Ver Perfil WWW
Re: Duda sobre Cuatro en línea
« Respuesta #10 en: 19 Enero 2012, 18:25 »

No sé por qué, pero me da el error
" too few arguments to function `int finPartida(int (*)[8])' "
Haciendo esto:


Código
#include<stdio.h>
#include<stdlib.h>
 
int finPartida(int m[8][8])
{
 
   int i, j;
   for(i = 8-1; i >= 3; i--)
       for(j = 8-1; j >= 3; j--)
           if((m[i][j] == m[i-1][j] && m[i][j] == m[i-2][j] && m[i][j] == m[i-3][j] && m[i][j] != 0) ||
              (m[i][j] == m[i][j-1] && m[i][j] == m[i][j-2] && m[i][j] == m[i][j-3] && m[i][j] != 0) ||
              (m[i][j] == m[i-1][j-1] && m[i][j] == m[i-2][j-2] && m[i][j] == m[i-3][j-3] && m[i][j] != 0))
               return 1;
 
   for(i = 8-1; i >= 3; i--)
       for(j = 0; j <= 8-3; j++)
           if(m[i][j] == m[i-1][j+1] && m[i][j] == m[i-2][j+2] && m[i][j] == m[i-3][j+3] && m[i][j] != 0)
               return 1;
 
   return 0;
}
 
 
int main (void)
{
  int M[8][8];
 
 int i, j, col, jugador, s, fila[8];
 
  for(i=0; i<8; i++){
      for(j=0; j<8; j++){
          M[i][j] = 0;
      }
      fila[i] = 7;
  }
 
  jugador = 1;
 
  do{    
 
 
  for(i=0; i<8; i++){
      for(j=0; j<8; j++){
          printf("%d  ",M[i][j]);                
      }  
      printf("\n");                                  
  }
 
  printf("Introduce la columna (1-8): ");
  scanf("%d", &col);
 
  col = col-1;
 
  M[fila[col]][col] = jugador;
 
  fila[col]--; //
 
 
  do{
  printf("Introduzca un 0 si abandona o un 1 si quiere seguir jugando: ");
  scanf("%d", &s);
  jugador = 3-jugador;
  }
  while((s<0)||(s>1));
  }
  while(s==1);
 
  finPartida();
 
 
 
 
system("pause");    
return 0;
}

El código en sí lo he entendido.

Gracias.
En línea
satu

Desconectado Desconectado

Mensajes: 263

Siempre aprendiendo


Ver Perfil WWW
Re: Duda sobre Cuatro en línea
« Respuesta #11 en: 19 Enero 2012, 18:31 »

Hola

El error que te está dando está en la llamada a la función, tú tienes finPartida(); pero debes pasarle la matriz finPartida(M);

Te pongo mi programa y así lo comparas, y si tienes alguna duda pregunta.

Código
#include <stdio.h>
 
#define FILAS 8
#define COLUMNAS 8
 
void mostrarTablero(int m[FILAS][COLUMNAS]);
int finPartida(int m[FILAS][COLUMNAS]);
 
int main(void)
{
   int m[FILAS][COLUMNAS];
   int i, j, col, jugador, s = 0;
   int fila[COLUMNAS];
 
   for(i = 0; i < 8; i++)
   {
       for(j = 0; j < 8; j++)
           m[i][j] = 0;
       fila[i] = 7;
   }
 
   jugador = 1;
 
   do
   {
       mostrarTablero(m);
 
       printf("\nTurno del jugador %d\n", jugador);
 
       do
       {
           printf("Introduce la columna (1-8): ");
           scanf("%d", &col);
           if(fila[col-1] < 0)
           {
               col = 0;
               printf("\nEsa columna esta llena\n\n");
           }
       }
       while(col < 1 || col > 8);
 
       col = col-1;
       m[fila[col]][col] = jugador;
       fila[col]--;
 
       jugador = 3 - jugador;
 
       s = finPartida(m);
   }
   while(s == 0);
 
   mostrarTablero(m);
 
   printf("\n\nGANADOR EL JUGADOR %d\n\n", 3 - jugador);
 
   while(getchar() != '\n');
   printf("Pulsa Enter para salir...");
   getchar();
   return 0;
}
 
 
void mostrarTablero(int m[FILAS][COLUMNAS])
{
   int i, j;
 
   printf("\n");
   for(i = 0; i < FILAS; i++)
   {
       printf("%d - ", i+1);
       for(j = 0; j < COLUMNAS; j++)
           printf("%i  ", m[i][j]);
       printf("\n");
   }
 
   printf("   ");
   for(j = 0; j < COLUMNAS; j++)
       printf("___");
 
   printf("\n    ");
   for(j = 0; j < COLUMNAS; j++)
       printf("%i  ", j+1);
   printf("\n\n");
}
 
 
int finPartida(int m[FILAS][COLUMNAS])
{
   int i, j;
   for(i = FILAS-1; i >= 3; i--)
       for(j = COLUMNAS-1; j >= 3; j--)
           if((m[i][j] == m[i-1][j] && m[i][j] == m[i-2][j] && m[i][j] == m[i-3][j] && m[i][j] != 0) ||
              (m[i][j] == m[i][j-1] && m[i][j] == m[i][j-2] && m[i][j] == m[i][j-3] && m[i][j] != 0) ||
              (m[i][j] == m[i-1][j-1] && m[i][j] == m[i-2][j-2] && m[i][j] == m[i-3][j-3] && m[i][j] != 0))
               return 1;
 
   for(i = FILAS-1; i >= 3; i--)
       for(j = 0; j <= COLUMNAS-3; j++)
           if(m[i][j] == m[i-1][j+1] && m[i][j] == m[i-2][j+2] && m[i][j] == m[i-3][j+3] && m[i][j] != 0)
               return 1;
 
   return 0;
}
 

Saludos
En línea

Breakbeat como forma de vida
DickGumshoe

Desconectado Desconectado

Mensajes: 145


Ver Perfil WWW
Re: Duda sobre Cuatro en línea
« Respuesta #12 en: 19 Enero 2012, 18:42 »

Muchísimas gracias. Ya entiendo el programa entero.

Ahora voy a intentar hacer la opción de si hay 4 en vertical, que me parece que en su código no sale bien.

Saludos.
En línea
satu

Desconectado Desconectado

Mensajes: 263

Siempre aprendiendo


Ver Perfil WWW
Re: Duda sobre Cuatro en línea
« Respuesta #13 en: 19 Enero 2012, 19:12 »

Hola

Tienes razón, en las 3 primeras columnas no funciona el vertical, hice el código a ojo sin probarlo y esto es lo que pasa, pero es fácil de arreglar.

Bueno me alegro de que te haya quedado todo claro.

Saludos

Edito: también pasa lo mismo con las horizontales en las 3 filas de arriba
« Última modificación: 19 Enero 2012, 19:13 por satu » En línea

Breakbeat como forma de vida
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines