#!/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 "#{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] Curses.addstr 'O' elsif [field.width, field.height] == [x + 1, y + 1] Curses.addstr '^' elsif field.field[[x, y]].open || state[:dead] || state[:victory] Curses.addstr field.field[[x, y]].mine ? '*' : ' ' else 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 )