glimmer_snake 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 2d1bec8cd2eac33a2b2546c9a852007b7fb58d26556ee207a9c2ba0966775311
4
+ data.tar.gz: ebe57fdb0c8c69eace44d740d3972c3793932839807a3db87269833acb9d35d8
5
+ SHA512:
6
+ metadata.gz: 4d0e241b9fdeba7328906c739364d06dc518f45c279340775e5f85b305652b8c6da3d32f7a990f3fedf6dceeaf04dc4b4f8ea1093a0a6d043046eda4e2c0e9fe
7
+ data.tar.gz: 6c7775a38e281cfc373ee5b070803d9d65d75eb03316ea97a9ea2a84b1e617dfbe729d93c361d9f375c78aa390c815e818cd8f7fe6f9aaefad4c819d1e536441
data/CHANGELOG.md ADDED
@@ -0,0 +1,5 @@
1
+ # Change Log
2
+
3
+ ## 1.0.0
4
+
5
+ - Initial Glimmer Snake implementation
data/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2023 Andy Maleh
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,126 @@
1
+ # <img alt="Glimmer Tetris Icon" src="https://raw.githubusercontent.com/AndyObtiva/glimmer_snake/master/icons/linux/Glimmer%20Snake.png" height=85 /> Glimmer Snake 1.0.0
2
+ ## [<img src="https://raw.githubusercontent.com/AndyObtiva/glimmer/master/images/glimmer-logo-hi-res.png" height=40 /> Glimmer DSL for LibUI Application](https://github.com/AndyObtiva/glimmer-dsl-libui)
3
+ [![Gem Version](https://badge.fury.io/rb/glimmer_snake.svg)](http://badge.fury.io/rb/glimmer_snake)
4
+
5
+ Snake game that runs on Mac, Windows, and Linux. Built with [Ruby](https://www.ruby-lang.org/) and [Glimmer DSL for LibUI](https://github.com/AndyObtiva/glimmer-dsl-libui) (Prerequisite-Free Ruby Desktop Development Cross-Platform Native GUI Library) using [Application Scaffolding](https://github.com/AndyObtiva/glimmer-dsl-libui#scaffold-application).
6
+
7
+ ![glimmer-dsl-libui-mac-snake.gif](/screenshots/glimmer-dsl-libui-mac-snake.gif)
8
+
9
+ ## Setup
10
+
11
+ Assuming you have [Ruby](https://www.ruby-lang.org/) installed (standard MRI / CRuby).
12
+
13
+ Run:
14
+
15
+ ```
16
+ gem install glimmer_snake
17
+ ```
18
+
19
+ ## Usage
20
+
21
+ Run:
22
+
23
+ ```
24
+ glimmer_snake
25
+ ```
26
+
27
+ Mac | Windows | Linux
28
+ ----|---------|------
29
+ ![glimmer-dsl-libui-mac-snake.png](/screenshots/glimmer-dsl-libui-mac-snake.png) ![glimmer-dsl-libui-mac-snake-game-over.png](/screenshots/glimmer-dsl-libui-mac-snake-game-over.png) | ![glimmer-dsl-libui-windows-snake.png](/screenshots/glimmer-dsl-libui-windows-snake.png) ![glimmer-dsl-libui-windows-snake-game-over.png](/screenshots/glimmer-dsl-libui-windows-snake-game-over.png) | ![glimmer-dsl-libui-linux-snake.png](/screenshots/glimmer-dsl-libui-linux-snake.png) ![glimmer-dsl-libui-linux-snake-game-over.png](/screenshots/glimmer-dsl-libui-linux-snake-game-over.png)
30
+
31
+ The goal is for the green snake to eat the red apple and to survive for as long as possible. Every time it eats an apple, it grows by 1 block (the size of the apple). If the snake hits its own body (especially after enlargement), it dies.
32
+
33
+ The game remembers the highest score by storing in `~/.glimmer-snake`. You can delete that file if you want to reset the highest score.
34
+
35
+ ## Development
36
+
37
+ Clone project:
38
+
39
+ ```
40
+ git clone https://github.com/AndyObtiva/glimmer_snake.git
41
+ ```
42
+
43
+ Change directory:
44
+
45
+ ```
46
+ cd glimmer_snake
47
+ ```
48
+
49
+ Install project gems with [Bundler](https://bundler.io/):
50
+
51
+ ```
52
+ bundle
53
+ ```
54
+
55
+ Run application with `glimmer` command:
56
+
57
+ ```
58
+ glimmer run
59
+ ```
60
+
61
+ Or run using included binary script:
62
+
63
+ ```
64
+ bin/glimmer_snake
65
+ ```
66
+
67
+ Package as a Ruby gem with `glimmer` command:
68
+
69
+ ```
70
+ glimmer "package:gem"
71
+ ```
72
+
73
+ Or package using equivalent direct rake command:
74
+
75
+ ```
76
+ rake build
77
+ ```
78
+
79
+ Generate updated gemspec with `glimmer command`:
80
+
81
+ ```
82
+ glimmer "package:gemspec"
83
+ ```
84
+
85
+ Or generate gemspec using equivalent direct rake command:
86
+
87
+ ```
88
+ rake gemspec:generate
89
+ ```
90
+
91
+ ## Contributing to glimmer_snake
92
+
93
+ - Check out the latest master to make sure the feature hasn't been
94
+ implemented or the bug hasn't been fixed yet.
95
+ - Check out the issue tracker to make sure someone already hasn't
96
+ requested it and/or contributed it.
97
+ - Fork the project.
98
+ - Start a feature/bugfix branch.
99
+ - Commit and push until you are happy with your contribution.
100
+ - Make sure to add tests for it. This is important so I don't break it
101
+ in a future version unintentionally.
102
+ - Please try not to mess with the Rakefile, version, or history. If
103
+ you want to have your own version, or is otherwise necessary, that
104
+ is fine, but please isolate to its own commit so I can cherry-pick
105
+ around it.
106
+
107
+ ## TODO
108
+
109
+ [TODO.md](TODO.md)
110
+
111
+ ## Change Log
112
+
113
+ [CHANGELOG.md](CHANGELOG.md)
114
+
115
+ ## Copyright
116
+
117
+ [MIT](LICENSE.txt)
118
+
119
+ Copyright (c) 2023 Andy Maleh. See
120
+ [LICENSE.txt](LICENSE.txt) for further details.
121
+
122
+ --
123
+
124
+ [<img src="https://raw.githubusercontent.com/AndyObtiva/glimmer/master/images/glimmer-logo-hi-res.png" height=40 />](https://github.com/AndyObtiva/glimmer) Built with [Glimmer DSL for LibUI](https://github.com/AndyObtiva/glimmer-dsl-libui) (Prerequisite-Free Ruby Desktop Development Cross-Platform Native GUI Library)
125
+
126
+ Glimmer Snake icon made by <a href="https://www.flaticon.com/authors/freepik" title="Freepik">Freepik</a> from <a href="https://www.flaticon.com/" title="Flaticon">www.flaticon.com</a>
data/TODO.md ADDED
@@ -0,0 +1,3 @@
1
+ # TODO
2
+
3
+ N/A
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 1.0.0
@@ -0,0 +1,3 @@
1
+ require_relative '../glimmer_snake'
2
+
3
+ GlimmerSnake::View::GlimmerSnake.launch
@@ -0,0 +1,33 @@
1
+ class GlimmerSnake
2
+ module Model
3
+ class Apple
4
+ attr_reader :game
5
+ attr_accessor :row, :column
6
+
7
+ def initialize(game)
8
+ @game = game
9
+ end
10
+
11
+ # generates a new location from scratch or via dependency injection of what cell is (for testing purposes)
12
+ def generate(initial_row: nil, initial_column: nil)
13
+ if initial_row && initial_column
14
+ self.row, self.column = initial_row, initial_column
15
+ else
16
+ self.row, self.column = @game.height.times.zip(@game.width.times).reject do |row, column|
17
+ @game.snake.vertebrae.map {|v| [v.row, v.column]}.include?([row, column])
18
+ end.sample
19
+ end
20
+ end
21
+
22
+ def remove
23
+ self.row = nil
24
+ self.column = nil
25
+ end
26
+
27
+ # inspect is overridden to prevent printing very long stack traces
28
+ def inspect
29
+ "#{super[0, 120]}... >"
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,27 @@
1
+ class GlimmerSnake
2
+ module Presenter
3
+ class Cell
4
+ COLOR_CLEAR = :white
5
+ COLOR_SNAKE = :green
6
+ COLOR_APPLE = :red
7
+
8
+ attr_reader :row, :column, :grid
9
+ attr_accessor :color
10
+
11
+ def initialize(grid: ,row: ,column: )
12
+ @row = row
13
+ @column = column
14
+ @grid = grid
15
+ end
16
+
17
+ def clear
18
+ self.color = COLOR_CLEAR unless color == COLOR_CLEAR
19
+ end
20
+
21
+ # inspect is overridden to prevent printing very long stack traces
22
+ def inspect
23
+ "#{super[0, 150]}... >"
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,68 @@
1
+ require 'fileutils'
2
+
3
+ require_relative 'snake'
4
+ require_relative 'apple'
5
+
6
+ class GlimmerSnake
7
+ module Model
8
+ class Game
9
+ WIDTH_DEFAULT = 20
10
+ HEIGHT_DEFAULT = 20
11
+ FILE_HIGH_SCORE = File.expand_path(File.join(Dir.home, '.glimmer-snake'))
12
+
13
+ attr_reader :width, :height
14
+ attr_accessor :snake, :apple, :over, :score, :high_score, :paused
15
+ alias over? over
16
+ alias paused? paused
17
+
18
+ def initialize(width = WIDTH_DEFAULT, height = HEIGHT_DEFAULT)
19
+ @width = width
20
+ @height = height
21
+ @snake = Snake.new(self)
22
+ @apple = Apple.new(self)
23
+ FileUtils.touch(FILE_HIGH_SCORE)
24
+ @high_score = File.read(FILE_HIGH_SCORE).to_i rescue 0
25
+ end
26
+
27
+ def score=(new_score)
28
+ @score = new_score
29
+ self.high_score = @score if @score > @high_score
30
+ end
31
+
32
+ def high_score=(new_high_score)
33
+ @high_score = new_high_score
34
+ File.write(FILE_HIGH_SCORE, @high_score.to_s)
35
+ rescue => e
36
+ puts e.full_message
37
+ end
38
+
39
+ def start
40
+ self.over = false
41
+ self.score = 0
42
+ self.snake.generate
43
+ self.apple.generate
44
+ end
45
+
46
+ def pause
47
+ self.paused = true
48
+ end
49
+
50
+ def resume
51
+ self.paused = false
52
+ end
53
+
54
+ def toggle_pause
55
+ unless paused?
56
+ pause
57
+ else
58
+ resume
59
+ end
60
+ end
61
+
62
+ # inspect is overridden to prevent printing very long stack traces
63
+ def inspect
64
+ "#{super[0, 75]}... >"
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,49 @@
1
+ require 'glimmer'
2
+ require_relative '../model/game'
3
+ require_relative 'cell'
4
+
5
+ class GlimmerSnake
6
+ module Presenter
7
+ class Grid
8
+ include Glimmer
9
+
10
+ attr_reader :game, :cells
11
+
12
+ def initialize(game = Model::Game.new)
13
+ @game = game
14
+ @cells = @game.height.times.map do |row|
15
+ @game.width.times.map do |column|
16
+ Cell.new(grid: self, row: row, column: column)
17
+ end
18
+ end
19
+ observe(@game.snake, :vertebrae) do |new_vertebrae|
20
+ occupied_snake_positions = @game.snake.vertebrae.map {|v| [v.row, v.column]}
21
+ @cells.each_with_index do |row_cells, row|
22
+ row_cells.each_with_index do |cell, column|
23
+ if [@game.apple.row, @game.apple.column] == [row, column]
24
+ cell.color = Cell::COLOR_APPLE
25
+ elsif occupied_snake_positions.include?([row, column])
26
+ cell.color = Cell::COLOR_SNAKE
27
+ else
28
+ cell.clear
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+ def clear
36
+ @cells.each do |row_cells|
37
+ row_cells.each do |cell|
38
+ cell.clear
39
+ end
40
+ end
41
+ end
42
+
43
+ # inspect is overridden to prevent printing very long stack traces
44
+ def inspect
45
+ "#{super[0, 75]}... >"
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,95 @@
1
+ require_relative 'vertebra'
2
+
3
+ class GlimmerSnake
4
+ module Model
5
+ class Snake
6
+ SCORE_EAT_APPLE = 50
7
+ RIGHT_TURN_MAP = {
8
+ north: :east,
9
+ east: :south,
10
+ south: :west,
11
+ west: :north
12
+ }
13
+ LEFT_TURN_MAP = RIGHT_TURN_MAP.invert
14
+
15
+ attr_accessor :collided
16
+ alias collided? collided
17
+
18
+ attr_reader :game
19
+ # vertebrae and joins are ordered from tail to head
20
+ attr_accessor :vertebrae
21
+
22
+ def initialize(game)
23
+ @game = game
24
+ end
25
+
26
+ # generates a new snake location and orientation from scratch or via dependency injection of what head_cell and orientation are (for testing purposes)
27
+ def generate(initial_row: nil, initial_column: nil, initial_orientation: nil)
28
+ self.collided = false
29
+ initial_vertebra = Vertebra.new(snake: self, row: initial_row, column: initial_column, orientation: initial_orientation)
30
+ self.vertebrae = [initial_vertebra]
31
+ end
32
+
33
+ def length
34
+ @vertebrae.length
35
+ end
36
+
37
+ def head
38
+ @vertebrae.last
39
+ end
40
+
41
+ def tail
42
+ @vertebrae.first
43
+ end
44
+
45
+ def remove
46
+ self.vertebrae.clear
47
+ self.joins.clear
48
+ end
49
+
50
+ def move
51
+ @old_tail = tail.dup
52
+ @new_head = head.dup
53
+ case @new_head.orientation
54
+ when :east
55
+ @new_head.column = (@new_head.column + 1) % @game.width
56
+ when :west
57
+ @new_head.column = (@new_head.column - 1) % @game.width
58
+ when :south
59
+ @new_head.row = (@new_head.row + 1) % @game.height
60
+ when :north
61
+ @new_head.row = (@new_head.row - 1) % @game.height
62
+ end
63
+ if @vertebrae.map {|v| [v.row, v.column]}.include?([@new_head.row, @new_head.column])
64
+ self.collided = true
65
+ @game.over = true
66
+ else
67
+ @vertebrae.append(@new_head)
68
+ @vertebrae.delete(tail)
69
+ if head.row == @game.apple.row && head.column == @game.apple.column
70
+ grow
71
+ @game.apple.generate
72
+ end
73
+ end
74
+ end
75
+
76
+ def turn_right
77
+ head.orientation = RIGHT_TURN_MAP[head.orientation]
78
+ end
79
+
80
+ def turn_left
81
+ head.orientation = LEFT_TURN_MAP[head.orientation]
82
+ end
83
+
84
+ def grow
85
+ @game.score += SCORE_EAT_APPLE
86
+ @vertebrae.prepend(@old_tail)
87
+ end
88
+
89
+ # inspect is overridden to prevent printing very long stack traces
90
+ def inspect
91
+ "#{super[0, 150]}... >"
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,22 @@
1
+ class GlimmerSnake
2
+ module Model
3
+ class Vertebra
4
+ ORIENTATIONS = %i[north east south west]
5
+ # orientation is needed for snake occuppied cells (but not apple cells)
6
+ attr_reader :snake
7
+ attr_accessor :row, :column, :orientation
8
+
9
+ def initialize(snake: , row: , column: , orientation: )
10
+ @row = row || rand(snake.game.height)
11
+ @column = column || rand(snake.game.width)
12
+ @orientation = orientation || ORIENTATIONS.sample
13
+ @snake = snake
14
+ end
15
+
16
+ # inspect is overridden to prevent printing very long stack traces
17
+ def inspect
18
+ "#{super[0, 150]}... >"
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,89 @@
1
+ require 'glimmer_snake/model/grid'
2
+
3
+ class GlimmerSnake
4
+ module View
5
+ class GlimmerSnake
6
+ include Glimmer::LibUI::Application
7
+
8
+ CELL_SIZE = 15
9
+ SNAKE_MOVE_DELAY = 0.1
10
+
11
+ before_body do
12
+ @game = Model::Game.new
13
+ @grid = Presenter::Grid.new(@game)
14
+ @game.start
15
+ @keypress_queue = []
16
+ end
17
+
18
+ after_body do
19
+ register_observers
20
+ end
21
+
22
+ body {
23
+ window {
24
+ # data-bind window title to game score, converting it to a title string on read from the model
25
+ title <= [@game, :score, on_read: -> (score) {"Snake (Score: #{@game.score})"}]
26
+ content_size @game.width * CELL_SIZE, @game.height * CELL_SIZE
27
+ resizable false
28
+
29
+ vertical_box {
30
+ padded false
31
+
32
+ @game.height.times do |row|
33
+ horizontal_box {
34
+ padded false
35
+
36
+ @game.width.times do |column|
37
+ area {
38
+ square(0, 0, CELL_SIZE) {
39
+ fill <= [@grid.cells[row][column], :color] # data-bind square fill to grid cell color
40
+ }
41
+
42
+ on_key_up do |area_key_event|
43
+ if area_key_event[:key] == ' '
44
+ @game.toggle_pause
45
+ else
46
+ @keypress_queue << area_key_event[:ext_key]
47
+ end
48
+ end
49
+ }
50
+ end
51
+ }
52
+ end
53
+ }
54
+ }
55
+ }
56
+
57
+ def register_observers
58
+ observe(@game, :over) do |game_over|
59
+ Glimmer::LibUI.queue_main do
60
+ if game_over
61
+ msg_box('Game Over!', "Score: #{@game.score} | High Score: #{@game.high_score}")
62
+ @game.start
63
+ end
64
+ end
65
+ end
66
+
67
+ Glimmer::LibUI.timer(SNAKE_MOVE_DELAY) do
68
+ unless @game.paused? || @game.over?
69
+ process_queued_keypress
70
+ @game.snake.move
71
+ end
72
+ end
73
+ end
74
+
75
+ def process_queued_keypress
76
+ # key press queue ensures one turn per snake move to avoid a double-turn resulting in instant death (due to snake illogically going back against itself)
77
+ key = @keypress_queue.shift
78
+ case [@game.snake.head.orientation, key]
79
+ in [:north, :right] | [:east, :down] | [:south, :left] | [:west, :up]
80
+ @game.snake.turn_right
81
+ in [:north, :left] | [:west, :down] | [:south, :right] | [:east, :up]
82
+ @game.snake.turn_left
83
+ else
84
+ # No Op
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,91 @@
1
+ require 'glimmer-dsl-libui'
2
+
3
+ require_relative 'snake/presenter/grid'
4
+
5
+ class Snake
6
+ include Glimmer
7
+
8
+ CELL_SIZE = 15
9
+ SNAKE_MOVE_DELAY = 0.1
10
+
11
+ def initialize
12
+ @game = Model::Game.new
13
+ @grid = Presenter::Grid.new(@game)
14
+ @game.start
15
+ @keypress_queue = []
16
+ create_gui
17
+ register_observers
18
+ end
19
+
20
+ def launch
21
+ @main_window.show
22
+ end
23
+
24
+ def register_observers
25
+ observe(@game, :over) do |game_over|
26
+ Glimmer::LibUI.queue_main do
27
+ if game_over
28
+ msg_box('Game Over!', "Score: #{@game.score} | High Score: #{@game.high_score}")
29
+ @game.start
30
+ end
31
+ end
32
+ end
33
+
34
+ Glimmer::LibUI.timer(SNAKE_MOVE_DELAY) do
35
+ unless @game.paused? || @game.over?
36
+ process_queued_keypress
37
+ @game.snake.move
38
+ end
39
+ end
40
+ end
41
+
42
+ def process_queued_keypress
43
+ # key press queue ensures one turn per snake move to avoid a double-turn resulting in instant death (due to snake illogically going back against itself)
44
+ key = @keypress_queue.shift
45
+ case [@game.snake.head.orientation, key]
46
+ in [:north, :right] | [:east, :down] | [:south, :left] | [:west, :up]
47
+ @game.snake.turn_right
48
+ in [:north, :left] | [:west, :down] | [:south, :right] | [:east, :up]
49
+ @game.snake.turn_left
50
+ else
51
+ # No Op
52
+ end
53
+ end
54
+
55
+ def create_gui
56
+ @main_window = window {
57
+ # data-bind window title to game score, converting it to a title string on read from the model
58
+ title <= [@game, :score, on_read: -> (score) {"Snake (Score: #{@game.score})"}]
59
+ content_size @game.width * CELL_SIZE, @game.height * CELL_SIZE
60
+ resizable false
61
+
62
+ vertical_box {
63
+ padded false
64
+
65
+ @game.height.times do |row|
66
+ horizontal_box {
67
+ padded false
68
+
69
+ @game.width.times do |column|
70
+ area {
71
+ square(0, 0, CELL_SIZE) {
72
+ fill <= [@grid.cells[row][column], :color] # data-bind square fill to grid cell color
73
+ }
74
+
75
+ on_key_up do |area_key_event|
76
+ if area_key_event[:key] == ' '
77
+ @game.toggle_pause
78
+ else
79
+ @keypress_queue << area_key_event[:ext_key]
80
+ end
81
+ end
82
+ }
83
+ end
84
+ }
85
+ end
86
+ }
87
+ }
88
+ end
89
+ end
90
+
91
+ Snake.new.launch
@@ -0,0 +1,20 @@
1
+ $LOAD_PATH.unshift(File.expand_path('..', __FILE__))
2
+
3
+ begin
4
+ require 'bundler/setup'
5
+ Bundler.require(:default)
6
+ rescue StandardError, Gem::LoadError
7
+ # this runs when packaged as a gem (no bundler)
8
+ require 'glimmer-dsl-libui'
9
+ # add more gems if needed
10
+ end
11
+
12
+ class GlimmerSnake
13
+ include Glimmer
14
+
15
+ APP_ROOT = File.expand_path('../..', __FILE__)
16
+ VERSION = File.read(File.join(APP_ROOT, 'VERSION'))
17
+ LICENSE = File.read(File.join(APP_ROOT, 'LICENSE.txt'))
18
+ end
19
+
20
+ require 'glimmer_snake/view/glimmer_snake'
data/bin/glimmer_snake ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ runner = File.expand_path('../../app/glimmer_snake/launch.rb', __FILE__)
4
+
5
+ require 'glimmer/launcher'
6
+
7
+ launcher = Glimmer::Launcher.new([runner] + ARGV)
8
+ launcher.launch
Binary file
Binary file
Binary file
Binary file
metadata ADDED
@@ -0,0 +1,132 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: glimmer_snake
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Andy Maleh
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-10-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: glimmer-dsl-libui
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.9.7
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.9.7
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 3.5.0
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 3.5.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: juwelier
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '='
46
+ - !ruby/object:Gem::Version
47
+ version: 2.4.9
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '='
53
+ - !ruby/object:Gem::Version
54
+ version: 2.4.9
55
+ - !ruby/object:Gem::Dependency
56
+ name: simplecov
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: Glimmer Snake game desktop application built with Glimmer DSL for LibUI.
70
+ Gem ships with a glimmer_snake binary script for launching the game.
71
+ email: andy.am@gmail.com
72
+ executables:
73
+ - glimmer_snake
74
+ extensions: []
75
+ extra_rdoc_files:
76
+ - CHANGELOG.md
77
+ - LICENSE.txt
78
+ - README.md
79
+ files:
80
+ - CHANGELOG.md
81
+ - LICENSE.txt
82
+ - README.md
83
+ - TODO.md
84
+ - VERSION
85
+ - app/glimmer_snake.rb
86
+ - app/glimmer_snake/launch.rb
87
+ - app/glimmer_snake/model/apple.rb
88
+ - app/glimmer_snake/model/cell.rb
89
+ - app/glimmer_snake/model/game.rb
90
+ - app/glimmer_snake/model/grid.rb
91
+ - app/glimmer_snake/model/snake.rb
92
+ - app/glimmer_snake/model/vertebra.rb
93
+ - app/glimmer_snake/view/glimmer_snake.rb
94
+ - app/glimmer_snake/view/snake.rb
95
+ - bin/glimmer_snake
96
+ - glimmer_snake.gemspec
97
+ - icons/linux/Glimmer Snake.png
98
+ - icons/macosx/Glimmer Snake.icns
99
+ - icons/windows/Glimmer Snake.ico
100
+ homepage: http://github.com/AndyObtiva/glimmer_snake
101
+ licenses:
102
+ - MIT
103
+ metadata: {}
104
+ post_install_message:
105
+ - |2+
106
+
107
+ Glimmer Snake 1.0.0 was installed!
108
+ Play by running:
109
+
110
+ glimmer_snake
111
+
112
+ rdoc_options: []
113
+ require_paths:
114
+ - lib
115
+ - app
116
+ required_ruby_version: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - ">="
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
121
+ required_rubygems_version: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ requirements: []
127
+ rubygems_version: 3.4.10
128
+ signing_key:
129
+ specification_version: 4
130
+ summary: Glimmer Snake
131
+ test_files: []
132
+ ...