[gosuhunt] little bit less crude

This commit is contained in:
Gwenhael Le Moine 2023-02-09 16:10:28 +01:00
parent 27b65a409b
commit e6bb987641
No known key found for this signature in database
GPG key ID: FDFE3669426707A7

View file

@ -7,40 +7,64 @@ require 'minehunt'
class GosuHunt < Gosu::Window class GosuHunt < Gosu::Window
def initialize( number_of_mines = 20 ) def initialize( number_of_mines = 20 )
super 640, 480 super 325, 180
self.caption = "Gosu Hunt" self.caption = "Gosu Hunt"
@number_of_mines = number_of_mines @number_of_mines = number_of_mines
@field = MineHunt::Board.new( @number_of_mines ) @field = MineHunt::Board.new( @number_of_mines )
@finished = false @finished = false
@state = { dead: false, victory: false } @state = { dead: false, victory: false }
@images = { explorer: Gosu::Image.from_text( '()', 20 ),
dead_explorer: Gosu::Image.from_text( '☠ ', 20 ),
door: Gosu::Image.from_text( '=>', 20 ),
mine: Gosu::Image.from_text( '<>', 20 ),
cell: Gosu::Image.from_text( '██', 20 ),
visited_cell: Gosu::Image.from_text( ' ', 20 ) }
end
def new_level
@field = MineHunt::Board.new( @number_of_mines )
@finished = false
@state = { dead: false, victory: false }
end end
def button_up(id) def button_up(id)
case id if @finished
when Gosu::KB_ESCAPE, Gosu::KB_Q case id
close when Gosu::KB_ESCAPE, Gosu::KB_Q
when Gosu::KB_R close
@field = MineHunt::Board.new( @number_of_mines ) when Gosu::KB_R
@state = { dead: false, victory: false } new_level
when Gosu::KB_NUMPAD_1 else
@state = @field.move 'down-left' super
when Gosu::KB_NUMPAD_2, Gosu::KB_DOWN end
@state = @field.move 'down'
when Gosu::KB_NUMPAD_3
@state = @field.move 'down-right'
when Gosu::KB_NUMPAD_4, Gosu::KB_LEFT
@state = @field.move 'left'
when Gosu::KB_NUMPAD_6, Gosu::KB_RIGHT
@state = @field.move 'right'
when Gosu::KB_NUMPAD_7
@state = @field.move 'up-left'
when Gosu::KB_NUMPAD_8, Gosu::KB_UP
@state = @field.move 'up'
when Gosu::KB_NUMPAD_9
@state = @field.move 'up-right'
else else
super case id
when Gosu::KB_ESCAPE, Gosu::KB_Q
close
when Gosu::KB_R
new_level
when Gosu::KB_NUMPAD_1
@state = @field.move 'down-left'
when Gosu::KB_NUMPAD_2, Gosu::KB_DOWN
@state = @field.move 'down'
when Gosu::KB_NUMPAD_3
@state = @field.move 'down-right'
when Gosu::KB_NUMPAD_4, Gosu::KB_LEFT
@state = @field.move 'left'
when Gosu::KB_NUMPAD_6, Gosu::KB_RIGHT
@state = @field.move 'right'
when Gosu::KB_NUMPAD_7
@state = @field.move 'up-left'
when Gosu::KB_NUMPAD_8, Gosu::KB_UP
@state = @field.move 'up'
when Gosu::KB_NUMPAD_9
@state = @field.move 'up-right'
else
super
end
end end
@finished = @state[:dead] || @state[:victory] @finished = @state[:dead] || @state[:victory]
@ -57,27 +81,21 @@ class GosuHunt < Gosu::Window
self.caption = "#{@field.number_of_mines} mines, #{@field.count_nearby_mines} nearby, score #{@field.score}" self.caption = "#{@field.number_of_mines} mines, #{@field.count_nearby_mines} nearby, score #{@field.score}"
end end
theme = { explorer: '()', Gosu::Font.new( 20 ).draw_text( self.caption, 0, 0, 0 )
dead_explorer: '☠ ',
door: '=>',
mine: '<>',
cell: '██',
visited_cell: ' ' }
@field.height.times do |y| @field.height.times do |y|
@field.width.times do |x| @field.width.times do |x|
Gosu::Image.from_text( if [@field.explorer_x, @field.explorer_y] == [x, y] ( if [@field.explorer_x, @field.explorer_y] == [x, y]
@state[:dead] ? theme[:dead_explorer] : theme[:explorer] @state[:dead] ? @images[:dead_explorer] : @images[:explorer]
elsif [@field.width, @field.height] == [x + 1, y + 1] elsif [@field.width, @field.height] == [x + 1, y + 1]
theme[:door] @images[:door]
elsif @field.field[[x, y]].open elsif @field.field[[x, y]].open
theme[:visited_cell] @images[:visited_cell]
elsif @field.field[[x, y]].mine && ( @state[:dead] || @state[:victory] ) elsif @field.field[[x, y]].mine && ( @state[:dead] || @state[:victory] )
theme[:mine] @images[:mine]
else else
theme[:cell] @images[:cell]
end, 20 ) end ).draw( x * 2 * 10, (y * 20) + 20, 0 )
.draw( x * 2 * 10, y * 20, 0 )
end end
end end
end end