rubtris 0.0.6 → 0.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/game.rb +141 -0
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 885e292a13093f20c8349defe31d4954e7b32ae4
|
4
|
+
data.tar.gz: 7fe117d323a0b46827a13212ec8c9d2790e48063
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 83072d6ef5fd113ee6a6438416f68219de30468fc9d454cd1ed6124ee186a1ebea4378657e709ffd711ba10827026bac2c0bdeb40e81cbcf5389eafca1af8606
|
7
|
+
data.tar.gz: 0f24d991eb081a27b1a56c232c1adeb3ba35fd9e063ec30ba6a71cb6e325ab62ea5a14c6574a1fb8dae88efee66040796a49b53ae8c29a61b55d540420f307da
|
data/lib/game.rb
ADDED
@@ -0,0 +1,141 @@
|
|
1
|
+
require_relative 'board'
|
2
|
+
require 'timeout'
|
3
|
+
require 'io/console'
|
4
|
+
require_relative 'menu'
|
5
|
+
|
6
|
+
class Game
|
7
|
+
|
8
|
+
REFRESH_RATE = 0.1
|
9
|
+
BEGINNING_ADVANCE_RATE = 0.3
|
10
|
+
MINIMUM_ADVANCE_RATE = 0.05
|
11
|
+
DIF_BTWN_LEVEL = 0.04
|
12
|
+
|
13
|
+
|
14
|
+
def run
|
15
|
+
set_up_game
|
16
|
+
until over?
|
17
|
+
do_turn
|
18
|
+
end
|
19
|
+
end_game
|
20
|
+
run if !force_quit? && play_again
|
21
|
+
end
|
22
|
+
|
23
|
+
def get_mode
|
24
|
+
options = [
|
25
|
+
{title: "Unlimited", type: :none, value: true},
|
26
|
+
{title: "Timed", type: :increment, value: 3, unit: 'min.'},
|
27
|
+
{title: "Lines", type: :increment, value: 40}
|
28
|
+
]
|
29
|
+
prompt = "Welcome to Rubtris.\nSelect the mode you want to play!"
|
30
|
+
menu = Menu.new(options, prompt)
|
31
|
+
@game_mode = menu.open
|
32
|
+
end
|
33
|
+
|
34
|
+
def play_again
|
35
|
+
options = [
|
36
|
+
{title: "Yes", type: :none, value: true},
|
37
|
+
{title: "No", type: :none, value: false}
|
38
|
+
]
|
39
|
+
prompt = "#{@board.summary_s}\nPlay again?"
|
40
|
+
menu = Menu.new(options, prompt)
|
41
|
+
menu.open[:value]
|
42
|
+
end
|
43
|
+
|
44
|
+
def set_up_game
|
45
|
+
@board = Board.new
|
46
|
+
STDIN.echo = false
|
47
|
+
@force_quit = false
|
48
|
+
@board.add_block
|
49
|
+
@board.render
|
50
|
+
@start_time, @last_advanced, @level = Time.now, Time.now, 0
|
51
|
+
@time_limit, @line_limit = nil, nil
|
52
|
+
config = get_mode
|
53
|
+
add_win_condition(config[:title], config[:value])
|
54
|
+
end
|
55
|
+
|
56
|
+
def do_turn
|
57
|
+
auto_advance if auto_advance_needed?
|
58
|
+
system "clear" or system "cls"
|
59
|
+
@board.render
|
60
|
+
action = get_input
|
61
|
+
take_action(action) if action
|
62
|
+
end
|
63
|
+
|
64
|
+
def end_game
|
65
|
+
STDIN.echo = true
|
66
|
+
end
|
67
|
+
|
68
|
+
def current_advance_rate
|
69
|
+
[BEGINNING_ADVANCE_RATE - (@level * DIF_BTWN_LEVEL), MINIMUM_ADVANCE_RATE].max
|
70
|
+
end
|
71
|
+
|
72
|
+
def auto_advance_needed?
|
73
|
+
Time.now - @last_advanced > current_advance_rate
|
74
|
+
end
|
75
|
+
|
76
|
+
def auto_advance
|
77
|
+
@last_advanced = Time.now
|
78
|
+
@board.move_selected_down
|
79
|
+
end
|
80
|
+
|
81
|
+
def get_input
|
82
|
+
action = nil
|
83
|
+
begin
|
84
|
+
action = Timeout::timeout(REFRESH_RATE) { STDIN.getch }
|
85
|
+
rescue
|
86
|
+
end
|
87
|
+
action
|
88
|
+
end
|
89
|
+
|
90
|
+
def force_quit?
|
91
|
+
@force_quit
|
92
|
+
end
|
93
|
+
|
94
|
+
def take_action(action)
|
95
|
+
case action.downcase
|
96
|
+
when "w"
|
97
|
+
@board.move_to_bottom
|
98
|
+
when "a"
|
99
|
+
@board.move_selected_left
|
100
|
+
when "s"
|
101
|
+
@board.move_selected_down
|
102
|
+
when "d"
|
103
|
+
@board.move_selected_right
|
104
|
+
when "\r"
|
105
|
+
@board.push_selected_down
|
106
|
+
when "e"
|
107
|
+
@board.rotate_selected_right
|
108
|
+
when "q"
|
109
|
+
@board.rotate_selected_left
|
110
|
+
when "["
|
111
|
+
@board.rotate_selected_left
|
112
|
+
when "]"
|
113
|
+
@board.rotate_selected_right
|
114
|
+
when "\e"
|
115
|
+
@force_quit = true
|
116
|
+
end
|
117
|
+
nil
|
118
|
+
end
|
119
|
+
|
120
|
+
def over?
|
121
|
+
force_quit? || @board.over? || over_time? || over_lines?
|
122
|
+
end
|
123
|
+
|
124
|
+
def over_time?
|
125
|
+
@time_limit && (@last_advanced - @start_time) >= @time_limit
|
126
|
+
end
|
127
|
+
|
128
|
+
def over_lines?
|
129
|
+
@line_limit && @board.completed_lines >= @line_limit
|
130
|
+
end
|
131
|
+
|
132
|
+
def add_win_condition(condition, value)
|
133
|
+
case condition
|
134
|
+
when "Timed"
|
135
|
+
@time_limit = value * 60
|
136
|
+
when "Lines"
|
137
|
+
@line_limit = value
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubtris
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ben Henderson
|
@@ -36,6 +36,7 @@ files:
|
|
36
36
|
- bin/rubtris
|
37
37
|
- lib/block.rb
|
38
38
|
- lib/board.rb
|
39
|
+
- lib/game.rb
|
39
40
|
- lib/menu.rb
|
40
41
|
- lib/pattern.rb
|
41
42
|
- lib/rubtris.rb
|