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

Duda

Estas en el tema de Duda en el foro de C/C++ en Foros del Web. Cita: int MovPermitido(Bloque * l,int donde) { switch(donde) { case izquierda: if(l->x>0) //Si el movimiento esta dentro del tablero.... if(Tablero[l->x-1][l->y]!='X') //Si el movimiento hacia la ...
  #1 (permalink)  
Antiguo 22/01/2008, 14:30
 
Fecha de Ingreso: enero-2008
Mensajes: 6
Antigüedad: 16 años, 4 meses
Puntos: 0
Duda

Cita:
int MovPermitido(Bloque * l,int donde)
{
switch(donde)
{
case izquierda:
if(l->x>0) //Si el movimiento esta dentro del tablero....
if(Tablero[l->x-1][l->y]!='X') //Si el movimiento hacia la izquierda no esta bloqueado por otra ficha....
{
return 1;
}
return 0;
case derecha:
case abajo:
entonces el caso para la derecha seria asi?:
case derecha:
if(l->x<0) //
if(Tablero[l->x+1][l->y]!='X')

y el caso hacia abajo no se...
weno no se ni si esta bien el de izquierda >.<
ayudarme por favor^^
Gracias
  #2 (permalink)  
Antiguo 23/01/2008, 07:14
Avatar de _Lucifer_  
Fecha de Ingreso: junio-2006
Mensajes: 1.662
Antigüedad: 17 años, 11 meses
Puntos: 28
Re: Duda

Sería interesante que dijeras qué es ese código, qué estás tratando de hacer y por qué. Imagino que estás moviendo una ficha en un tablero, pero a diferencia de otros foristas yo no tengo bola de cristal...jejeje

Fuera de broma, postea algo más de info acerca del problema.

Saludos
__________________
Si crees que no tiene sentido, etonces probablemente lo tenga... :arriba:
  #3 (permalink)  
Antiguo 23/01/2008, 07:32
 
Fecha de Ingreso: enero-2008
Mensajes: 6
Antigüedad: 16 años, 4 meses
Puntos: 0
Re: Duda

Es un tetris lo que hay que hacer, y me estoy atascando en lo de mover la ficha (es que me han liado mucho xD), bueno te pongo lo que tengo:
Código:
/* Inclusion de librerias graficas */
#include "./X11/Xlib.h"
#include "./X11/keysymdef.h"
#include "./X11/keysym.h"
#include "./X11/Xutil.h"
#include "./X11/Xatom.h"

/* Inclusion de librerias para procesos UNIX */
#include <pthread.h>
#include <signal.h>
#include <assert.h>
#include <unistd.h>


/* otros includes */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

/* Definicion de limites */
#define LIM_INFERIOR 300  // Esquina inferior grafica del tablero
#define LIM_SUPERIOR 0    // Esquina superior grafica del tablero
#define VENT_IZQ 100   // Posiciones iniciales de las ventanas
#define VENT_DER 500
#define VENT_SUP 0
#define VENT_INF 310
#define TAM_BLOQUE 20 // Dimension en pixels de un bloque
#define X_INICIAL 5   // Posicion X inicial de las fichas
#define Y_INICIAL 0   // Posicion Y inicial de las fichas
#define TOTAL_X 10    // Numero de columnas del tetris
#define TOTAL_Y 16    // Numero de filas del tetris


//Cadenas para opciones
#define X_CADENA 250         // Posicion de las cadenas de opciones en pantalla
#define INICIAR "a - Iniciar Partida:"   
#define DEC_DIFICULTAD "b - Disminuir Dificultad"
#define INC_DIFICULTAD "c - Incrementar Dificultad"
#define PUNTOS "Puntos:"
#define FIN_PARTIDA "Fin de partida!!!"


//GLOBALES

/* Tipo que define la posicion de un bloque dentro del tablero del tetris,
 * cada bloque lleva las coordenas x e y */

typedef struct strBloque
{
   int x; //Posicion tablero
   int y;
} Bloque;

/* La estructura Ficha, es una forma con cuatro bloques */ 
typedef struct strFicha
{
   int tipo;
   Bloque Bl[4];  //Cada ficha son 4 bloques
} Ficha;


/* Prototipos de funciones propias */
void AlmacenaFicha(Ficha * l);
void DibujaBloque(int x, int y);
void DibujaTablero();
void CompruebaLineas();
int Grafica(int z);
int MovPermitido(Bloque * l,int donde);
int MovFichaPermitido(Ficha * l, int donde);
void FichaAbajo(Ficha * l);
void FichaIzquierda(Ficha * l);
void FichaDerecha(Ficha * l);
void BorraFicha(Ficha * l);
void DibujaFicha(Ficha * l);
int MueveFicha(Ficha * l, int donde);
void GeneraFicha(Ficha * l);
int FinPartida();
void * lanzafichas(Ficha * l);
void Rotar(Ficha * l);
void Escribe(int x, int y, char * cad);
void CalculaPuntos(int n_lineas);
void IniciaPartida();


// Definiciones globales
Display *dpy;   // Display X
Window w;       // Ventana general
GC gc, gc_borrar, gc_fichas, gc_letras;                // Contextos graficos
enum Movimientos { abajo,izquierda,derecha,rotacion};  // Varias constantes de movimiento
char Tablero[TOTAL_X][TOTAL_Y];                        // Tablero de tetris
int dificultad=800000;      // 0.8 segundos por movimiento hacia abajo
int Puntos;                 // Numero de puntos del usuario
int partida_jugando=0;      // Se está jugando una partida?
Ficha l;                    // Ficha que cae
pthread_mutex_t tab;   // Semaforo para memoria compartida (solo un proceso a la vez puede acceder al tablero)


// Funcion que calcula los puntos obtenidos por una o varias lineas
void CalculaPuntos(int n_lineas)
{
    char cadena[20];
    
    switch(n_lineas)
    {
	case 1:
		Puntos+=10;
		Escribe(X_CADENA, 250, "Simple: 10 puntos!!");
		break;
	case 2:
		Puntos+=30;
		Escribe(X_CADENA, 250, "Doble: 30 puntos!!");
		break;
	case 3:
		Puntos+=70;
		Escribe(X_CADENA, 250, "Triple: 70 puntos!!");
		break;
	case 4:
		Puntos+=150;
		Escribe(X_CADENA, 250, "Tetris: 150 puntos!!");
		break;
    }
    printf("\a\n"); //Beep!
    sprintf(cadena,"Puntos:%d",Puntos);
    Escribe(X_CADENA,100, cadena);
}


// Funcion que escribe una cadena de caracteres en una posición de pantalla
void Escribe(int x, int y, char * cad)
{
    XFillRectangle(dpy,w,gc_borrar,x-5,y-10,200,20);
    XDrawString(dpy,w,gc_letras,x,y,cad,strlen(cad));
}

// Funcion que dibuja todos los bloques que hay en pantalla
void DibujaTablero()
{
   int x,y;

   XFillRectangle(dpy,w,gc_borrar,5,LIM_SUPERIOR+5,200,LIM_INFERIOR);
   for(y=0;y<TOTAL_Y-1;y++)     //Menos 1 por la barrera del final
      for(x=0;x<TOTAL_X;x++)
	    if(Tablero[x][y]=='X')
                DibujaBloque(x,y);
   
   XFlush(dpy);
   
}


// Funcion que comprueba si hay lineas en el tablero de tetris
void CompruebaLineas()
{
   int con_lineas=0; //Contador de lineas

   pthread_mutex_lock(&tab);  // Acceso a memoria compartida

for (y=0;y<Lineas;y++)
{
l=0;
for (x=0;x<Lineas;x++)
if (Matrix[y][x]!=0) l++;
if (l==Lineas) //la linea esta completa
    //Do something
}


   if(con_lineas>0)
   {	       
       DibujaTablero();
       CalculaPuntos(con_lineas);
   }
   pthread_mutex_unlock(&tab);  // Liberamos acceso a memoria compartida
}


/* Funcion que retorna la posicion grafica de un bloque */
int Grafica(int z)  
{
    return z*TAM_BLOQUE+5;
}


// ¿Se permite el movimiento de bloque?
int MovPermitido(Bloque * l,int donde)
{
       switch(donde)
       {
          case izquierda:
             if(l->x>0)       //Si el movimiento esta dentro del tablero....
                if(Tablero[l->x-1][l->y]!='X')  //Si el movimiento hacia la izquierda no esta bloqueado por otra ficha....
                {
                   return 1;
                }
             return 0;
          case derecha: *AQUI ME LIO*
          case abajo: *AQUI ME LIO*
	  case rotacion:
	     if(l->x>=0 && l->x<TOTAL_X)
		if(Tablero[l->x][l->y]!='X')
		{
		    return 1;
		}
	     return 0;
       }

}
y me lio en saber si el movimiento esta permitido en el caso izquierda y hacia abajo

Gracias de antemano^^
  #4 (permalink)  
Antiguo 23/01/2008, 09:48
Avatar de _Lucifer_  
Fecha de Ingreso: junio-2006
Mensajes: 1.662
Antigüedad: 17 años, 11 meses
Puntos: 28
Re: Duda

Ah ok...mucho mejor ahora...

Fíjate que en la línea:

Código:
...
case izquierda:
             if(l->x>0)       //Si el movimiento esta dentro del tablero....
...
Se hace la comparación con cero porque es el límite izquierdo, para la derecha será el límite derecho del tablero. Si no me equivoco debe ser TOTAL_X.

Y para abajo debes verificar que no puede seguir bajando ya sea porque llegó a hasta donde habían fichas o porque llegó a TOTAL_Y.

Saludos
__________________
Si crees que no tiene sentido, etonces probablemente lo tenga... :arriba:
  #5 (permalink)  
Antiguo 23/01/2008, 13:30
 
Fecha de Ingreso: enero-2008
Mensajes: 6
Antigüedad: 16 años, 4 meses
Puntos: 0
Re: Duda

Entonces se haria asi: ????
Código:
          case derecha:
		               if(l->x>0)       
                if(Tablero[l->x + 1][l->y]!='X')  
                {
                   return 1;
                }
             return 0;
          case abajo:
		                if(l->x>0)       
                if(Tablero[l->x][l->y + 1]!='X')  
                {
                   return 1;
                }
             return 0;
  #6 (permalink)  
Antiguo 24/01/2008, 04:47
 
Fecha de Ingreso: enero-2008
Mensajes: 4
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: Duda

tu eres la del tetris jaja
yo soy de la carlos tercero, de electronica y tng la misma practica jaja
pa que veas que soy bueno eh?
case derecha:

if(l->x<9) //Si el movimiento esta dentro del tablero....

if(Tablero[l->x+1][l->y]!='X')

{

return 1;

}

return 0;


case abajo:

if(l->y<16) //Si el movimiento esta dentro del tablero....

if(Tablero[l->x][l->y+1]!='X'&&Tablero[l->x][l->y+1]!='F')

{

return 1;

}

return 0;

asi es, o al menos a mi me sale jaja de nadaa eh??jeje
oye, si tuvieses la de fin de partida o la de comprueba lineas t l agradeceria eternemente!!jaja gracias
  #7 (permalink)  
Antiguo 24/01/2008, 04:52
 
Fecha de Ingreso: enero-2008
Mensajes: 6
Antigüedad: 16 años, 4 meses
Puntos: 0
Re: Duda

Ei siiii yo de la Carlos III y estoy estudiando eso^^
Yo de la de fin de partida he puesto esto pero no tengo ni idea si esta bien o no, pero si te sirve xD, se lo he enviado a la profe pa ver que me dice
Código:
int FinPartida()
{
pthread_mutex_lock(&tab);
   int x, y;

     for (x=0; x<TOTAL_Y; x++)
      for (y=0; y<TOTAL_X; y++)
         if (bloque->bloque[x][y] && bloque->y + y >= 0 &&
             Tablero->bloque[bloque->x + x][bloque->y + y])
            return TRUE;

     bloque->y++;
   if (MovPermitido(Bloque * l,int donde))
      return TRUE;

   /   bloque->y--;

   return FALSE;
  pthread_mutex_unlock(&tab);
}
  #8 (permalink)  
Antiguo 24/01/2008, 04:59
 
Fecha de Ingreso: enero-2008
Mensajes: 4
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: Duda

jaja muxisimas gracias!! es mas de lo que yo tng asike
eres dl grupo de mañ o tarde?? si hasta a lomejor t konozko y to!!
si seguro que estas en una klase de ordenadores ahora jaja
oye, toma mi msn y agregame si kieres y ablms desde alli ke yo m voy ya ok?? wen tu veras
[email protected]
  #9 (permalink)  
Antiguo 24/01/2008, 05:04
 
Fecha de Ingreso: enero-2008
Mensajes: 6
Antigüedad: 16 años, 4 meses
Puntos: 0
Re: Duda

Soy del grupo de tarde >.< Ya te he agregao, haber si conseguimos hacerla jajajja^^
Bss
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 00:17.