Desarrollo Tetris en Java

alcon678

Hola! Tengo que hacer un tetris como proyecto de fin de curso y no tengo ni idea de por donde cogerlo ya que nunca he trabajado con interfaz grafica.
Me gustaria que me dieseis pistas/consejos de como enfocarlo.
Mi principal problema es el de no saber como representar las piezas y el tablero.

La idea seria llenar de 0 la matriz del tablero y "desplazar por ella" las piezas y una vez que colisione la pieza, escribir valores distintos de cero en el tablero.

Cualquier ayuda sera bienvenida! Muchas gracias!

YaW

#1 Usa LibGDX

https://github.com/jmillikan/gdx-tetris

https://github.com/Pygmalion69/Nitris

http://gamedevelopment.tutsplus.com/series/implementing-tetris--gamedev-12717

1 respuesta
mortadelegle

Si te ponen la norma de no usar motores graficos y no puedes usar lo de #2 yo usaría una GridBagLayout en Swing que es facilillo, incluso si no has visto Swing está bastante bien.

1 respuesta
VicoViper

Hombre si no das más datos de lo que os han pedido, no creo que necesites mucho.

Una de mis prácticas de C en primero fue hacer un Tetris, y por poder (al menos en C), puedes hacerlo todo en ASCII sin problemas:

Ejemplo
1 respuesta
Darkyonk

#4 Pues terminaste hasta la polla del gotoxy, porque un compañero mio hizo un snake y cuando vi el código me daba asco ponerme a ello.

Como bien dice #3 me extraña que no te hayan puesto restricciones, yo de tu preguntaba por si acaso.

1 respuesta
VicoViper

¡Que va! el gotoxy() es de cobardes, creo recordar que solo usabamos stdio.h y time.h.

No lo recuerdo muy bien, pero si no me equivoco, lo primero que hacías era definir las constantes para los dibujo para la pieza, para la casilla vacía y los bordes del tablero con los caracteres ASCII.

Luego preparabas una función pieceFall() que intercambiaba cada casilla con las de abajo si estaban vacías, y que llamaba a grounded() cuando se encontraba con una casilla ocupada.
Desde grounded(), se hacían las comprobaciones y llamadas oportunas para ver si te habías salido de la pantalla (game over), para ver si habias hecho una linea, y blablabla, tampoco tenia mucho misterio una vez que aislabas los elementos.

Todo eso se hacía a base de bucles for y while, muy rudimentario, pero instructivo...

Supongo que en java, lo suyo sería crear la clase tetrimino() y que sea ella la que cargue con los métodos, no sabría decirte ahora mismo...

PD: #5 Y por si el tetris te parece poco, para esta semana estamos acabando una práctica de estructuras de computador que consiste en programar las rutinas de ensamblador de un Buscaminas... Eso si que da bastante mal rollo.

Deoxys

#1 ¿Tienes que hacerlo con GUI? Hacerlo para consola lleva una tarde, si no te han pedido gráficos explícitamente es mejor que te ahorres el marrón.

1 respuesta
alcon678

Muchas a gracias a todos por vuestras respuestas :)
Efectivamente, no nos dejan usar ninguna libreria externa.
He estado practicando a dibujar, mover, "colisiones" (la pieza con el tablero), todo con las coordenadas de un jpanel.

Pero mi pregunta es si existe alguna manera de representar de forma grafica una matriz int[][] de forma "directa"
O si por el contrario deberia trabajar con la matriz int[][] de forma interna e ir recorriendola y dibujando en el jpanel en funcion de su contenido en cada frame.

Gracias!

2 respuestas
alcon678

#7 Con interfaz grafica, si xD

pikMR

pues dibuja la matriz en forma de casillas, y toma estas casillas como pixeles que modificas en forma de piezas,yo tenía un proyecto de ajedrez que dibujaba el tablero a raiz de una matriz..

VicoViper

#8 Ahora mismo con java no te sabría decir, pero yo haría unas constantes para cada elemento que tengas que dibujar de 2 o 3 caracteres de ancho (incluido el espacio en blanco), así puedes hacer luego las pruebas que quieras con diferentes "skins gráficas".

Luego inicializas todo para comenzar, y haces un bucle que comience dibujando el tablero, luego lea el input, mueva la ficha, haga todas las comprobaciones. necesarias, y vuelva a empezar el bucle dibujando todo el tablero y no acabe hasta que actives el flag del "boolean gameover".

Añadirle los Score y los Next, no es demasiado complicado.
Vamos, que la forma más sencilla de dibujar un panel al menos para mi gusto siempre es un:

for (i=0; i<maxY; i++){
    for (j=0; i<maxX, j++){
        println (table[i][j]);
    }
}

Edit: Vale, he visto que necesitas hacerlo en jpanel... no me hagas demasiado caso entonces.

Darkyonk

#8 Supongo que si te creas un tablero (cuadriculado) de imagen de fondo de X * Y, y las imágenes que uses para el tetris, están formadas por la unión de cuadraditos de ese tamaño, en teoría tienes lo que quieres y si los desplazas siempre por el offset en píxels del tamaño de los cuadrados, ya tienes el control que necesitas.

alcon678

Gracias a todos por las respuestas, he aprendido bastante la verdad, al principio lo hice todo sobre calculos con las coordenadas del canvas, me volvi loco y termine haciendolo con un jpanel y un int[][] donde guardo numeros en funcion de la pieza, que era mi idea inicial, pero que al priincipio no tenia ni idea de como se podria hacer xD

Aqui esta, por si quereis echarle un vistacillo.
Me falta adornarlo un poco y mostrar la puntuacion (la calculo pero aun no le he metido en un jlabel porque no se posicionaba donde queria xD)
Pero bueno, lo basico creo que seria eso xD

Una vez mas gracias :)

2 respuestas
E

#13

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
	at Tablero.añadirPiezaTablero(Tablero.java:222)
	at Tablero.ejecucuion(Tablero.java:190)
	at Main.main(Main.java:20)

te sales del array si pierdes el juego

1 respuesta
Frezz

#13 Tienes el código de eso que llevas hecho?, lo he probado y va bien, ahora te falta meter si quieres puntuación o contador de líneas hechas, como buen viciado de tetrisfriends he echado en falta el hard-drop (bajar la pieza to rápido) y lo de cambiar de pieza, yo estoy haciendo como proyecto de fin de curso "el juego de la vida" pero en modo texto con matriz.

1 respuesta
alcon678

#14 Si, porque empiezo a dibujar las piezas fuera del jpanel por lo que comparo fuera de la matriz de enteros, y de la forma que esta controlada el final de partida intenta escribir la ultima pieza en el tablero y siempre tiene una parte fuera de la matriz, en cuanto tenga tiempo pondre la comprobacion que me falta para evitar eso
#15 Si, pero esta tan mal organizado que me da verguenza hasta ponerlo xD. Si quieres podria mandarte el codigo en su estado actual.
Si, son cosas que tenia pensado poner, pero que no voy a tener tiempo, estoy de examenes finales y casi no he tenido tiempo para echarle al tetris, y aun hay que meterle bases de datos al juego xD

1 respuesta
mecmec

#16 juega con los listener y booleanos para que al mantener la tecla se mueva porque sino es un coñazo tener que ir dándole y queda mucho más fluido. Añadiría aparte que con barra espaciadora baje automático, pulsando una tecla baje más rápido, las puntuaciones y varios niveles de dificultad.

Por otra parte, para que sea un poco más estético le pondría un fondo con color, bordes a las piezas e incluso un sonido para cuando consigues línea.

Vas bien, ánimo.

1 1 respuesta
alcon678

#17
Gracias :)

Es que en la version que subi usaba el evento de keyReleased, ya lo cambie a key pressed y añadi que al dejar la flecha de abajo pulsada bajase lineas mas rapido.
Las puntuaciones las calculo, pero la maldita etiqueta que tiene que mostrarlas no se posiciona bien, a pesar de que si hago un system.out de del getbounds de la etiqueta me muestra las coordenadas donde deberia aparecer, pero aparece siempre en 0,0
Todo lo que has mencionado son cosas que tenia en mente incluir este finde :)
Y como me queda poco tiempo y tengo que añadir bases de datos, registro de usuarios y navegacion de un jpanel a otro (esto me esta dando problemas, porque navega bien entre jpanels estaticos, pero no con el del tetris que tiene movimiento xD)

Usuarios habituales

  • alcon678
  • mecmec
  • Frezz
  • Darkyonk
  • VicoViper
  • Deoxys
  • YaW