• Viernes 15 de Noviembre de 2024, 11:41

Autor Tema:  Tetris U_u  (Leído 1632 veces)

kitkat

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Tetris U_u
« en: Sábado 19 de Enero de 2008, 16:54 »
0
Bueno tengo este codigo del tetris pero me faltan unas partes que no consigo sacar  :(

Código: Text
  1.  
  2. /* Inclusion de librerias graficas */
  3. #include "./X11/Xlib.h"
  4. #include "./X11/keysymdef.h"
  5. #include "./X11/keysym.h"
  6. #include "./X11/Xutil.h"
  7. #include "./X11/Xatom.h"
  8.  
  9. /* Inclusion de librerias para procesos UNIX */
  10. #include <pthread.h>
  11. #include <signal.h>
  12. #include <assert.h>
  13. #include <unistd.h>
  14.  
  15.  
  16. /* otros includes */
  17. #include <stdio.h>
  18. #include <string.h>
  19. #include <stdlib.h>
  20.  
  21. /* Definicion de limites */
  22. #define LIM_INFERIOR 300  // Esquina inferior grafica del tablero
  23. #define LIM_SUPERIOR 0    // Esquina superior grafica del tablero
  24. #define VENT_IZQ 100   // Posiciones iniciales de las ventanas
  25. #define VENT_DER 500
  26. #define VENT_SUP 0
  27. #define VENT_INF 310
  28. #define TAM_BLOQUE 20 // Dimension en pixels de un bloque
  29. #define X_INICIAL 5   // Posicion X inicial de las fichas
  30. #define Y_INICIAL 0   // Posicion Y inicial de las fichas
  31. #define TOTAL_X 10    // Numero de columnas del tetris
  32. #define TOTAL_Y 16    // Numero de filas del tetris
  33.  
  34.  
  35. //Cadenas para opciones
  36. #define X_CADENA 250         // Posicion de las cadenas de opciones en pantalla
  37. #define INICIAR "a - Iniciar Partida:"  
  38. #define DEC_DIFICULTAD "b - Disminuir Dificultad"
  39. #define INC_DIFICULTAD "c - Incrementar Dificultad"
  40. #define PUNTOS "Puntos:"
  41. #define FIN_PARTIDA "Fin de partida!!!"
  42.  
  43.  
  44. //GLOBALES
  45.  
  46. /* Tipo que define la posicion de un bloque dentro del tablero del tetris,
  47.  * cada bloque lleva las coordenas x e y */
  48.  
  49. typedef struct strBloque
  50. {
  51.    int x; //Posicion tablero
  52.    int y;
  53. } Bloque;
  54.  
  55. /* La estructura Ficha, es una forma con cuatro bloques */
  56. typedef struct strFicha
  57. {
  58.    int tipo;
  59.    Bloque Bl[4];  //Cada ficha son 4 bloques
  60. } Ficha;
  61.  
  62.  
  63. /* Prototipos de funciones propias */
  64. void AlmacenaFicha(Ficha * l);
  65. void DibujaBloque(int x, int y);
  66. void DibujaTablero();
  67. void CompruebaLineas();
  68. int Grafica(int z);
  69. int MovPermitido(Bloque * l,int donde);
  70. int MovFichaPermitido(Ficha * l, int donde);
  71. void FichaAbajo(Ficha * l);
  72. void FichaIzquierda(Ficha * l);
  73. void FichaDerecha(Ficha * l);
  74. void BorraFicha(Ficha * l);
  75. void DibujaFicha(Ficha * l);
  76. int MueveFicha(Ficha * l, int donde);
  77. void GeneraFicha(Ficha * l);
  78. int FinPartida();
  79. void * lanzafichas(Ficha * l);
  80. void Rotar(Ficha * l);
  81. void Escribe(int x, int y, char * cad);
  82. void CalculaPuntos(int n_lineas);
  83. void IniciaPartida();
  84.  
  85.  
  86. // Definiciones globales
  87. Display *dpy;   // Display X
  88. Window w;       // Ventana general
  89. GC gc, gc_borrar, gc_fichas, gc_letras;                // Contextos graficos
  90. enum Movimientos { abajo,izquierda,derecha,rotacion};  // Varias constantes de movimiento
  91. char Tablero[TOTAL_X][TOTAL_Y];                        // Tablero de tetris
  92. int dificultad=800000;      // 0.8 segundos por movimiento hacia abajo
  93. int Puntos;                 // Numero de puntos del usuario
  94. int partida_jugando=0;      // Se está jugando una partida?
  95. Ficha l;                    // Ficha que cae
  96. pthread_mutex_t tab;   // Semaforo para memoria compartida (solo un proceso a la vez puede acceder al tablero)
  97.  
  98.  
  99. // Funcion que calcula los puntos obtenidos por una o varias lineas
  100. void CalculaPuntos(int n_lineas)
  101. {
  102.     char cadena[20];
  103.    
  104.     switch(n_lineas)
  105.     {
  106.   case 1:
  107.     Puntos+=10;
  108.     Escribe(X_CADENA, 250, "Simple: 10 puntos!!");
  109.     break;
  110.   case 2:
  111.     Puntos+=30;
  112.     Escribe(X_CADENA, 250, "Doble: 30 puntos!!");
  113.     break;
  114.   case 3:
  115.     Puntos+=70;
  116.     Escribe(X_CADENA, 250, "Triple: 70 puntos!!");
  117.     break;
  118.   case 4:
  119.     Puntos+=150;
  120.     Escribe(X_CADENA, 250, "Tetris: 150 puntos!!");
  121.     break;
  122.     }
  123.     printf("\a\n"); //Beep!
  124.     sprintf(cadena,"Puntos:%d",Puntos);
  125.     Escribe(X_CADENA,100, cadena);
  126. }
  127.  
  128.  
  129. // Funcion que escribe una cadena de caracteres en una posición de pantalla
  130. void Escribe(int x, int y, char * cad)
  131. {
  132.     XFillRectangle(dpy,w,gc_borrar,x-5,y-10,200,20);
  133.     XDrawString(dpy,w,gc_letras,x,y,cad,strlen(cad));
  134. }
  135.  
  136. // Funcion que dibuja todos los bloques que hay en pantalla
  137. void DibujaTablero()
  138. {
  139.    int x,y;
  140.  
  141.    XFillRectangle(dpy,w,gc_borrar,5,LIM_SUPERIOR+5,200,LIM_INFERIOR);
  142.    for(y=0;y<TOTAL_Y-1;y++)     //Menos 1 por la barrera del final
  143.       for(x=0;x<TOTAL_X;x++)
  144.       if(Tablero[x][y]=='X')
  145.                 DibujaBloque(x,y);
  146.    
  147.    XFlush(dpy);
  148.    
  149. }
  150.  
  151.  
  152. // Funcion que comprueba si hay lineas en el tablero de tetris
  153. void CompruebaLineas()
  154. {
  155.    int con_lineas=0; //Contador de lineas
  156.  
  157.    pthread_mutex_lock(&tab);  // Acceso a memoria compartida
  158.  
  159.    /*[COLOR=red] Esta funcion se tiene que jecutar cuando la ficha a terminado de caer, hay que usar la funcion con_lineas (ya que se debe codificar la deteccion de lineas usando ese contador para eliminarlas del tablero)...pero no se me ocurre como hacerlo...ayudarme por favor....[/COLOR]
  160.     */
  161.  
  162.  
  163.    if(con_lineas>0)
  164.    {        
  165.        DibujaTablero();
  166.        CalculaPuntos(con_lineas);
  167.    }
  168.    pthread_mutex_unlock(&tab);  // Liberamos acceso a memoria compartida
  169. }
  170.  
  171.  
  172. /* Funcion que retorna la posicion grafica de un bloque */
  173. int Grafica(int z)  
  174. {
  175.     return z*TAM_BLOQUE+5;
  176. }
  177.  
  178.  
  179.  
  180.  

fORU-

  • Miembro MUY activo
  • ***
  • Mensajes: 225
  • Nacionalidad: mo
    • Ver Perfil
Re: Tetris U_u
« Respuesta #1 en: Lunes 21 de Enero de 2008, 20:23 »
0
Y el problema es??? :rain:
atte:fORU-

diego.martinez

  • Miembro MUY activo
  • ***
  • Mensajes: 297
    • Ver Perfil
Re: Tetris U_u
« Respuesta #2 en: Martes 22 de Enero de 2008, 11:13 »
0
Cita de: "kitkat"

   /* Esta funcion se tiene que jecutar cuando la ficha a terminado de caer, hay que usar la funcion con_lineas (ya que se debe codificar la deteccion de lineas usando ese contador para eliminarlas del tablero)...pero no se me ocurre como hacerlo...ayudarme por favor....
    */
 
Ya he podido ver que es lo que necesita, estaba escondido en el codigo,

Tienes que iterar la matriz por cada linea, y por cada linea comprobar si toda la linea esta ocupada !=0.

Código: Text
  1. for (y=0;y<Lineas;y++)
  2. {
  3. l=0;
  4. for (x=0;x<SizeX;x++)
  5. if (Matrix[y][x]!=0) l++;
  6. if (l==SizeX) //la linea esta completa
  7.      //Do something
  8. }
  9.  
  10.  

kitkat

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Tetris U_u
« Respuesta #3 en: Martes 22 de Enero de 2008, 21:18 »
0
No me entero (es que soy mu mala pa la programacion >.<), es que hay que usar eso de con_lineas, eso lo meto donde?