23/01/2008, 07:32
|
| | Fecha de Ingreso: enero-2008
Mensajes: 6
Antigüedad: 17 años 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^^ |