-
Notifications
You must be signed in to change notification settings - Fork 6
/
breakout.rb
114 lines (97 loc) · 2.16 KB
/
breakout.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
require_relative 'bricks.rb'
require_relative 'paddle.rb'
module GetKey
# Check if Win32API is accessible or not
USE_STTY = begin
require 'Win32API'
KBHIT = Win32API.new('crtdll', '_kbhit', [ ], 'I')
GETCH = Win32API.new('crtdll', '_getch', [ ], 'L')
false
rescue LoadError
# Use Unix way
true
end
# Return the ASCII code last key pressed, or nil if none
#
# Return::
# * _Integer_: ASCII code of the last key pressed, or nil if none
def self.getkey
if USE_STTY
char = nil
begin
system('stty raw -echo') # => Raw mode, no echo
char = (STDIN.read_nonblock(1).ord rescue nil)
ensure
system('stty -raw echo') # => Reset terminal mode
end
return char
else
return KBHIT.Call.zero? ? nil : GETCH.Call
end
end
end
class Stage
WIDTH = 40
HEIGHT = 30
DEFAULT_LIVES = 3
DEFAULT_POINTS = 0
PADDLE_START_X = WIDTH / 2
PADDLE_START_Y = HEIGHT
BLANK = ' . '
attr_accessor :grid, :brickset, :paddle
def initialize
@brickset = Brickset.new.set
@paddle = Paddle.new(PADDLE_START_X, PADDLE_START_Y)
# @ball = Ball.new
@lives = DEFAULT_LIVES
@points = DEFAULT_POINTS
@grid = make_grid
place_bricks
place_paddle
end
def display
#loop do
# clear_paddle
# update_paddle
# `clear`
grid.each { |line| line.each { |element| print element }; puts }
# end
end
private
def update_grid
end
def update_paddle
k = GetKey.getkey
if k == 97
Paddle.move_left
elsif k == 115
Paddle.move_right
end
end
def clear_paddle
x = paddle.x_pos
y = paddle.y_pos
grid[y][x] = BLANK
end
def make_grid
line = -> { Array.new(WIDTH, BLANK) }
g = []
HEIGHT.times { g.push(line.call.push(' |').unshift('| ')) }
g.unshift(Array.new(WIDTH + 2, '___'))
g
end
# Initializers
def place_bricks
brickset.each do |brick|
x = brick[:xcoord]
y = brick[:ycoord]
grid[y][x] = Brickset::BRICK_SPRITE
end
end
def place_paddle
x = paddle.x_pos
y = paddle.y_pos
grid[y][x] = Paddle::PADDLE_SPRITE
end
end
Stage.new.display