diff --git a/ruby/myhunt-curses.rb b/ruby/myhunt-curses.rb new file mode 100755 index 0000000..170c14e --- /dev/null +++ b/ruby/myhunt-curses.rb @@ -0,0 +1,110 @@ +#!/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] + Curses.addstr 'You died! :(' + elsif state[:victory] + Curses.addstr 'You won!! :)' + else + Curses.addstr "nearby: #{field.count_nearby_mines}" + 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] + Curses.addch 'o' + elsif [field.width, field.height] == [x + 1, y + 1] + Curses.addch '_' + elsif field.field[[x, y]].open + Curses.addch field.field[[x, y]].mine ? '*' : ' ' + else + Curses.addch 'H' + end + end + end + + Curses.refresh +end + +def ncurses_main + field = MyHunt::Board.new + 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 + 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 + +ncurses_main diff --git a/myhunt.rb b/ruby/myhunt.rb similarity index 59% rename from myhunt.rb rename to ruby/myhunt.rb index 89152d2..1ae2e38 100755 --- a/myhunt.rb +++ b/ruby/myhunt.rb @@ -1,6 +1,5 @@ #!/usr/bin/env ruby - -require 'curses' +# frozen_string_literal: true module MyHunt class Cell @@ -109,92 +108,3 @@ module MyHunt end end end - -field = MyHunt::Board.new - -def display_curses( field, state = { dead: false, victory: false } ) - Curses.setpos 0, 0 - - if state[:dead] - Curses.addstr 'You died! :(' - elsif state[:victory] - Curses.addstr 'You won!! :)' - else - Curses.addstr "nearby: #{field.count_nearby_mines}" - end - - field.height.times do |y| - field.width.times do |x| - Curses.setpos y + 2, x - if [field.explorer_x, field.explorer_y] == [x, y] - Curses.addch 'o' - elsif [field.width, field.height] == [x + 1, y + 1] - Curses.addch '_' - elsif field.field[[x, y]].open - Curses.addch field.field[[x, y]].mine ? '*' : ' ' - else - Curses.addch 'H' - end - end - end - - Curses.refresh -end - -Curses.init_screen -Curses.cbreak -Curses.noecho -Curses.stdscr.keypad = true -at_exit do - Curses.close_screen -end -finished = false - -display_curses( field ) - -loop do - direction = '' - ch = Curses.getch - if finished - begin - case ch - when 'r' - field = MyHunt::Board.new - 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