DataWindow Snake en PowerBuilder


Esta mañana he hecho una pequeña prueba en PowerBuilder: un Snake completamente jugable usando únicamente un DataWindow, sin imágenes, sin gráficos externos y sin controles de terceros.

La implementación la ha ido generando Claude Code a partir de la idea y del enfoque que yo quería probar.

La idea del juego me ha surgido después de ver Minefield DataWindow Game, un Buscaminas hecho en PowerBuilder, que me ha parecido una forma muy curiosa de usar un DataWindow como superficie visual. A partir de ahí me he planteado hacer lo mismo, pero con un Snake.

Primera versión

La primera versión que he montado funcionaba así:

  • Un DataWindow (dw_snake) con un único detail band como “pantalla”
  • Una cuadrícula lógica de 31×21
  • La serpiente almacenada en arrays de coordenadas
  • Un Timer cada 0.12s
  • Control de dirección desde el evento Key

El renderizado se hacía destruyendo y recreando rectángulos en cada tick mediante Modify().

Funcionaba, pero tenía dos problemas claros:

  • Parpadeo
  • Demasiado trabajo por frame

La mejora

Después me he encontrado con Three Simple Games de René Ullrich en Appeon CodeExchange, que incluye también una versión de Snake hecha con DataWindow.

De ese ejemplo he tomado la idea clave que mejora mucho el enfoque:

  • No recrear rectángulos continuamente, sino crearlos una sola vez y hacer que su estado dependa de los datos.

Versión refactorizada

La versión final trabaja así:

  • Una fila por cada fila del tablero
  • Una columna cells tipo char()
  • Cada carácter representa una celda:
    • 0 = vacío
    • 1 = cuerpo
    • 2 = cabeza
    • 9 = comida

Al abrir la ventana, se crean una sola vez los rectángulos (cell_1..cell_31) y se enlazan a expresiones del DataWindow para controlar:

  • visibilidad
  • color

De esa forma, en cada tick ya no hace falta reconstruir visualmente todo.

Ahora solo se actualizan unas pocas celdas con SetItem():

  • nueva cabeza
  • antigua cabeza → cuerpo
  • cola → vacío

Resultado:

  • sin flicker (parpadeo)
  • mucho menos trabajo por tick
  • movimiento bastante más fluido

También he añadido un pequeño guard (ib_intimer) para evitar reentradas del Timer.

Código

La demo se queda en solo dos archivos:

  • w_snake.srw
  • dw_snake.srd

Descarga

Teneis el ejemplo publicado en modo solución de PowerBuilder 2025 en:

¡Nos vemos en el próximo artículo! Y recuerda: en PowerBuilder, los límites solo están en nuestra imaginación. 🚀

Comentarios