minehunt 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +15 -0
- data/bin/gosuhunt +134 -0
- data/bin/minehunt +14 -6
- data/lib/minehunt.rb +1 -1
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5b6cc2262a4efc0a78975d9eb6ae56475257ac95341b77dae5061529bf5b2529
|
4
|
+
data.tar.gz: f4051ab48addc96711bc88c3f84aa50d320a96678f62be6674a269dd90bae213
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c9647d12b11e8140c312aad1b2790684b8aeff3359a17b77213bcbd42de7073837ad7ebd8f2d49b5964b65653397eebd5d1590ca6e1cc3eee32c071f1dee6304
|
7
|
+
data.tar.gz: b5aa966df36b583b4bd1af5328e6ee8814af96bc4cf9e0f1feaa770f9c18b6ee67db0d4a370ed6f0c3227397daa01c174b37f2061644c42eea12c306a2e1bdf0
|
data/README.md
CHANGED
@@ -1 +1,16 @@
|
|
1
1
|
Implementing HP {48,49,50} minehunt game
|
2
|
+
|
3
|
+
You start on the top-left corner and your goal is to reach the bottom0right corner without blowing-up a mine.
|
4
|
+
|
5
|
+
You can move using
|
6
|
+
↑
|
7
|
+
← ↓ →
|
8
|
+
|
9
|
+
or (better) the keypad which moves as
|
10
|
+
7 8 9 ↖ ↑ ↗
|
11
|
+
4 6 ← →
|
12
|
+
1 2 3 ↙ ↓ ↘
|
13
|
+
|
14
|
+
You can quit at any time using 'q'
|
15
|
+
|
16
|
+
You can replay at the end using 'r'
|
data/bin/gosuhunt
ADDED
@@ -0,0 +1,134 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'gosu'
|
5
|
+
require 'optparse'
|
6
|
+
|
7
|
+
require 'minehunt'
|
8
|
+
|
9
|
+
class GosuHunt < Gosu::Window
|
10
|
+
def initialize( number_of_mines, scale )
|
11
|
+
@scale = scale
|
12
|
+
@sprite_size = 6
|
13
|
+
|
14
|
+
@number_of_mines = number_of_mines
|
15
|
+
@field = MineHunt::Board.new( @number_of_mines )
|
16
|
+
@finished = false
|
17
|
+
@state = { dead: false, victory: false }
|
18
|
+
|
19
|
+
@font = Gosu::Font.new( 20 )
|
20
|
+
@images = { explorer: Gosu::Image.from_blob( @sprite_size * @scale, @sprite_size * @scale, bits_to_rgbas( '000000001100011110011110001100000000' ) ),
|
21
|
+
dead_explorer: Gosu::Image.from_blob( @sprite_size * @scale, @sprite_size * @scale, bits_to_rgbas( '100001010010001100001100010010100001' ) ),
|
22
|
+
door: Gosu::Image.from_blob( @sprite_size * @scale, @sprite_size * @scale, bits_to_rgbas( '010101101010' * ( @sprite_size / 2 ) ) ),
|
23
|
+
mine: Gosu::Image.from_blob( @sprite_size * @scale, @sprite_size * @scale, bits_to_rgbas( '111111110011100001100001110011111111' ) ),
|
24
|
+
cell: Gosu::Image.from_blob( @sprite_size * @scale, @sprite_size * @scale, bits_to_rgbas( '1' * @sprite_size * @sprite_size ) ),
|
25
|
+
visited_cell: Gosu::Image.from_blob( @sprite_size * @scale, @sprite_size * @scale, bits_to_rgbas( '0' * @sprite_size * @sprite_size ) ) }
|
26
|
+
|
27
|
+
super ( ( @sprite_size + 1 ) * @field.width * @scale ) + @scale,
|
28
|
+
( ( @sprite_size + 1 ) * @field.height * @scale ) + @scale + 20
|
29
|
+
|
30
|
+
self.caption = 'Gosu Hunt'
|
31
|
+
end
|
32
|
+
|
33
|
+
def bits_to_rgbas( bits )
|
34
|
+
bits.scan(/.{#{@sprite_size}}/).map do |line|
|
35
|
+
line.gsub( '0', "\0\0\0\0" * @scale ).gsub( '1', "\255\255\255\255" * @scale ) * @scale
|
36
|
+
end.join
|
37
|
+
end
|
38
|
+
|
39
|
+
def new_level
|
40
|
+
@field = MineHunt::Board.new( @number_of_mines )
|
41
|
+
@finished = false
|
42
|
+
@state = { dead: false, victory: false }
|
43
|
+
end
|
44
|
+
|
45
|
+
def button_up(id)
|
46
|
+
if @finished
|
47
|
+
case id
|
48
|
+
when Gosu::KB_ESCAPE, Gosu::KB_Q
|
49
|
+
close
|
50
|
+
when Gosu::KB_R
|
51
|
+
new_level
|
52
|
+
else
|
53
|
+
super
|
54
|
+
end
|
55
|
+
else
|
56
|
+
case id
|
57
|
+
when Gosu::KB_ESCAPE, Gosu::KB_Q
|
58
|
+
close
|
59
|
+
when Gosu::KB_R
|
60
|
+
new_level
|
61
|
+
when Gosu::KB_NUMPAD_1
|
62
|
+
@state = @field.move 'down-left'
|
63
|
+
when Gosu::KB_NUMPAD_2, Gosu::KB_DOWN
|
64
|
+
@state = @field.move 'down'
|
65
|
+
when Gosu::KB_NUMPAD_3
|
66
|
+
@state = @field.move 'down-right'
|
67
|
+
when Gosu::KB_NUMPAD_4, Gosu::KB_LEFT
|
68
|
+
@state = @field.move 'left'
|
69
|
+
when Gosu::KB_NUMPAD_6, Gosu::KB_RIGHT
|
70
|
+
@state = @field.move 'right'
|
71
|
+
when Gosu::KB_NUMPAD_7
|
72
|
+
@state = @field.move 'up-left'
|
73
|
+
when Gosu::KB_NUMPAD_8, Gosu::KB_UP
|
74
|
+
@state = @field.move 'up'
|
75
|
+
when Gosu::KB_NUMPAD_9
|
76
|
+
@state = @field.move 'up-right'
|
77
|
+
else
|
78
|
+
super
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
@finished = @state[:dead] || @state[:victory]
|
83
|
+
end
|
84
|
+
|
85
|
+
def update; end
|
86
|
+
|
87
|
+
def draw
|
88
|
+
self.caption = if @state[:dead]
|
89
|
+
"You blew up!! :(, score: #{@field.score} "
|
90
|
+
elsif @state[:victory]
|
91
|
+
"You won!! :), score: #{@field.score} "
|
92
|
+
else
|
93
|
+
"Near #{@field.count_nearby_mines} mines, score: #{@field.score}"
|
94
|
+
end
|
95
|
+
|
96
|
+
@font.draw_text( caption, 0, 0, 0 )
|
97
|
+
|
98
|
+
@field.height.times do |y|
|
99
|
+
@field.width.times do |x|
|
100
|
+
( if [@field.explorer_x, @field.explorer_y] == [x, y]
|
101
|
+
@state[:dead] ? @images[:dead_explorer] : @images[:explorer]
|
102
|
+
elsif [@field.width, @field.height] == [x + 1, y + 1]
|
103
|
+
@images[:door]
|
104
|
+
elsif @field.field[[x, y]].open
|
105
|
+
@images[:visited_cell]
|
106
|
+
elsif @field.field[[x, y]].mine && ( @state[:dead] || @state[:victory] )
|
107
|
+
@images[:mine]
|
108
|
+
else
|
109
|
+
@images[:cell]
|
110
|
+
end ).draw ( ( @sprite_size + 1 ) * x * @scale ) + @scale,
|
111
|
+
( ( @sprite_size + 1 ) * y * @scale ) + @scale + 20,
|
112
|
+
0
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
options = { number_of_mines: 20,
|
119
|
+
scale: 3 }
|
120
|
+
OptionParser.new do |opts|
|
121
|
+
opts.banner = 'Usage: gosuhunt <options>'
|
122
|
+
|
123
|
+
opts.on( '-m', '--mines INT' ) do |nb_mines|
|
124
|
+
options[:number_of_mines] = nb_mines.to_i
|
125
|
+
end
|
126
|
+
|
127
|
+
opts.on( '-s', '--scale INT' ) do |scale|
|
128
|
+
options[:scale] = scale.to_i
|
129
|
+
end
|
130
|
+
end
|
131
|
+
.parse!
|
132
|
+
|
133
|
+
GosuHunt.new( options[:number_of_mines], options[:scale] )
|
134
|
+
.show
|
data/bin/minehunt
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
require 'curses'
|
5
|
+
require 'optparse'
|
5
6
|
|
6
7
|
require 'minehunt'
|
7
8
|
|
@@ -16,11 +17,11 @@ def display_curses( field,
|
|
16
17
|
Curses.setpos 0, 0
|
17
18
|
|
18
19
|
if state[:dead]
|
19
|
-
Curses.addstr "You
|
20
|
+
Curses.addstr "You blew up!!, score: #{field.score} "
|
20
21
|
elsif state[:victory]
|
21
|
-
Curses.addstr "You won!! :), score #{field.score} "
|
22
|
+
Curses.addstr "You won!! :), score: #{field.score} "
|
22
23
|
else
|
23
|
-
Curses.addstr "
|
24
|
+
Curses.addstr "Near #{field.count_nearby_mines} mines, score: #{field.score}"
|
24
25
|
end
|
25
26
|
|
26
27
|
field.height.times do |y|
|
@@ -108,7 +109,14 @@ def ncurses_main( number_of_mines )
|
|
108
109
|
exit!
|
109
110
|
end
|
110
111
|
|
111
|
-
|
112
|
-
|
112
|
+
options = { number_of_mines: 20 }
|
113
|
+
OptionParser.new do |opts|
|
114
|
+
opts.banner = 'Usage: minehunt <options>'
|
113
115
|
|
114
|
-
|
116
|
+
opts.on( '-m', '--mines INT' ) do |nb_mines|
|
117
|
+
options[:number_of_mines] = nb_mines.to_i
|
118
|
+
end
|
119
|
+
end
|
120
|
+
.parse!
|
121
|
+
|
122
|
+
ncurses_main( options[:number_of_mines] )
|
data/lib/minehunt.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: minehunt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gwenhael Le Moine
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-03-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: curses
|
@@ -28,11 +28,13 @@ description: Mine hunting game inspired by the HP 48
|
|
28
28
|
email: gwenhael@le-moine.org
|
29
29
|
executables:
|
30
30
|
- minehunt
|
31
|
+
- gosuhunt
|
31
32
|
extensions: []
|
32
33
|
extra_rdoc_files:
|
33
34
|
- README.md
|
34
35
|
files:
|
35
36
|
- README.md
|
37
|
+
- bin/gosuhunt
|
36
38
|
- bin/minehunt
|
37
39
|
- lib/minehunt.rb
|
38
40
|
homepage: https://src.le-moine.org/gwh/myhunt/src/branch/main/ruby
|
@@ -54,7 +56,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
54
56
|
- !ruby/object:Gem::Version
|
55
57
|
version: '0'
|
56
58
|
requirements: []
|
57
|
-
rubygems_version: 3.
|
59
|
+
rubygems_version: 3.4.6
|
58
60
|
signing_key:
|
59
61
|
specification_version: 4
|
60
62
|
summary: Mine hunting game
|