DEV Community

Andy Maleh
Andy Maleh

Posted on

2 2

Conway's Game of Life Glimmer Sample

Glimmer DSL for SWT 4.20.13.11 just shipped with an implementation of Conway's Game of Life. A simpler version was blogged about many years ago, but it has been enhanced to be canvas-based instead of button-based.

The models Grid and Cell were written test first.

Otherwise, the GUI simply binds to the grid cells (the same way the Tic Tac Toe elaborate sample was implemented)

# From: https://github.com/AndyObtiva/glimmer-dsl-swt/blob/master/docs/reference/GLIMMER_SAMPLES.md#game-of-life

require 'glimmer-dsl-swt'

require_relative 'game_of_life/model/grid'

class GameOfLife
  include Glimmer::UI::CustomShell

  WIDTH = 20
  HEIGHT = 20
  CELL_WIDTH = 25
  CELL_HEIGHT = 25

  before_body do
    @grid = GameOfLife::Model::Grid.new(WIDTH, HEIGHT)
  end

  body {
    shell {
      row_layout :vertical
      text "Conway's Game of Life (Glimmer Edition)"

      canvas {
        layout_data {
          width WIDTH*CELL_WIDTH
          height HEIGHT*CELL_HEIGHT
        }
        (0...HEIGHT).each do |row_index|
          (0...WIDTH).each do |column_index|
            rectangle(column_index*CELL_WIDTH, row_index*CELL_HEIGHT, CELL_WIDTH, CELL_HEIGHT) {
              background <= [@grid.cell_rows[row_index][column_index], "alive", on_read: ->(a) {a ? :black : :white}]

              on_mouse_down {
                @grid.cell_rows[row_index][column_index].toggle_aliveness!
              }
            }
          end
        end
      }

      composite {
        row_layout(:horizontal) {
          margin_width 0
        }

        button {
          text 'Step'
          enabled <= [@grid, :playing, on_read: :! ]

          on_widget_selected {
            @grid.step!
          }
        }

        button {
          text 'Clear'
          enabled <= [@grid, :playing, on_read: :! ]

          on_widget_selected {
            @grid.clear!
          }
        }

        button {
          text <= [@grid, :playing, on_read: ->(p) { p ? 'Stop' : 'Play' }]

          on_widget_selected {
            @grid.toggle_playback!
          }
        }

        label {
          text 'Slower'
        }

        scale {
          minimum 1
          maximum 100
          selection <=> [@grid, :speed]
        }

        label {
          text 'Faster'
        }

      }
    }
  }
end

GameOfLife.launch
Enter fullscreen mode Exit fullscreen mode

Animated Screenshot:

Game of Life

Glimmer DSL for SWT enables writing desktop applications in Ruby (JRuby) in a fraction of the time they normally take in other languages (think hours and days for an MVP instead of weeks and months)

Happy Glimmering!

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more