myhunt/ruby/myhunt-curses.rb

114 lines
2.4 KiB
Ruby
Raw Normal View History

#!/usr/bin/env ruby
# frozen_string_literal: true
require 'bundler/inline'
gemfile do
source 'https://rubygems.org'
gem 'curses'
gem 'ruby-termios', require: 'termios'
end
require 'myhunt'
def display_curses( field, state = { dead: false, victory: false } )
Curses.setpos 0, 0
if state[:dead]
2022-09-14 16:25:26 +02:00
Curses.addstr 'You died! :( '
elsif state[:victory]
2022-09-14 16:25:26 +02:00
Curses.addstr 'You won!! :) '
else
Curses.addstr "#{field.number_of_mines} mines, #{field.count_nearby_mines} nearby"
end
field.height.times do |y|
Curses.setpos y + 2, 0
field.width.times do |x|
if [field.explorer_x, field.explorer_y] == [x, y]
2022-09-14 16:25:51 +02:00
Curses.addstr 'O'
elsif [field.width, field.height] == [x + 1, y + 1]
2022-09-14 16:25:51 +02:00
Curses.addstr '^'
elsif field.field[[x, y]].open || state[:dead] || state[:victory]
Curses.addstr field.field[[x, y]].mine ? '*' : ' '
else
2022-09-14 16:25:51 +02:00
Curses.addstr '-'
end
end
end
Curses.refresh
end
def ncurses_main( number_of_mines )
field = MyHunt::Board.new( number_of_mines )
finished = false
Curses.init_screen
Curses.cbreak
Curses.noecho
Curses.stdscr.keypad = true
orig_termios = Termios.tcgetattr($stdin)
at_exit do
# Curses.close_screen
Termios.tcsetattr($stdin, Termios::TCSANOW, orig_termios)
end
display_curses( field )
loop do
direction = ''
ch = Curses.getch
if finished
begin
case ch
when 'r'
field = MyHunt::Board.new( number_of_mines )
finished = false
else
break
end
rescue Curses::RequestDeniedError
'prout'
end
else
begin
case ch
when '1'
direction = 'down-left'
when '2', Curses::KEY_DOWN
direction = 'down'
when '3'
direction = 'down-right'
when '4', Curses::KEY_LEFT
direction = 'left'
when '6', Curses::KEY_RIGHT
direction = 'right'
when '7'
direction = 'up-left'
when '8', Curses::KEY_UP
direction = 'up'
when '9'
direction = 'up-right'
when 'q'
break
end
rescue Curses::RequestDeniedError
'prout'
end
end
state = field.move( direction )
finished = state[:dead] || state[:victory]
display_curses( field, state )
end
exit!
end
number_of_mines = 20
number_of_mines = ARGV.first.to_i if ARGV.length == 1
ncurses_main( number_of_mines )