2015-08-15 5 views
2

Я хочу обновить конструкцию на экране при изменении ввода. Конструкция будет выглядеть так:Обновление статического выхода в качестве изменений ввода

puts " | | " 
puts " | | " 
puts "----+----+----" 
puts "make an input (1/2/3/4/5/6)" 
selection = gets.chomp 
#process selection, returns value, value to be updated in construct. 

Я определил пространства для значений как массив 2x3. Возвращаемое значение, например, может быть '2' для хранения в пространстве [0][1] (строка 1, col 2). Результат должен выглядеть так:

| 2 | 
    | |  
----+----+---- 

Это должно произойти без повторной печати конструкции. Когда пользователю предлагается (в цикле) сделать другой выбор, снова необходимо обновить конструкцию без повторной печати.

+0

Что вы, – sawa

+0

Не совсем дубликат этого [вопроса] (http://stackoverflow.com/questions/4762843/writing-over-previously-output-lines-in-the-command-prompt-with-ruby), поскольку это просто изменяется вывод одной строки, но может быть хорошим местом для начала. – Exupery

+0

Благодаря @Exupery, но \ r только перемещает курсор назад на одну строку, в этом случае переписывание должно происходить в определенном месте (из 2D-массива). – codescribble

ответ

0

Что вы спрашиваете, не представляется возможным с помощью technique of \r, но вы можете использовать трюк очистки экрана, как показано ниже

matrix = [ ["", "", ""], ["", "", ""]] 
pos_to_index = [[0, 0], [0, 1], [0, 2], [1,0], [1,1], [1,2]] 

system("cls") 

begin 
    print "make an input (1/2/3/4/5/6)\n" 
    selection = gets.chomp 
    system("cls") 

    if (selection.to_i <= pos_to_index.size) 

     pos = pos_to_index[selection.to_i - 1] 
     matrix[pos[0]][pos[1]] = selection 

     matrix.each { |a| a.each { |i| print " #{i.empty? ? ' ' : i} |" }; puts } 
     puts "---+---+----" 
    end 

end while (not selection.empty?) 

PS: system("cls") работает на окнах, если он не работает для вас, попробуйте system("clear"), как объяснено here

+0

спасибо, в этом случае для каждого выбора конструкция перепечатывается на выходе. Поэтому, если я сделаю 3 выбора, я вижу 3 конструкции. То, что я хочу сделать, это иметь только одну конструкцию для любого количества сделанных выборов, однако выбор динамически обновляется внутри конструкции без распечатки конструкции для каждого выбора ввода. Конструкция должна оставаться неподвижной на экране, только значения должны меняться в зависимости от выбора входа. – codescribble

+0

привет! 'система 'clear'' помогает! Благодарю. – codescribble

3

Могу ли я вас заинтересовать, прекрасный джентльмен, в битве между good и evil? Сильно вдохновлено TTT:

require 'dispel' 

class Lucky6 
    BOARD = <<-BOARD.gsub /^\s+/, '' 
    | X | X | X | 
    | X | X | X | 
    ----+---+---- 
    BOARD 

    attr_reader :position 

    def initialize 
    @fields = Array.new(6) { ' ' } 
    @position = 0 
    end 

    def board 
    index = -1 
    BOARD.gsub(" X ") do 
     index += 1 
     field = @fields[index] 
     @position == index ? "[#{field}]" : " #{field} " 
    end 
    end 

    def set(position) 
    @position = position.pred 
    @fields[@position] = position 
    end 
end 

def draw(l6) 
    [l6.board, "1..6=Set r=Reset q=Quit"].join("\n") 
end 

Dispel::Screen.open do |screen| 
    l6 = Lucky6.new 
    screen.draw draw(l6) 

    Dispel::Keyboard.output do |key| 
    case key 
    when ('1'..'6') then l6.set(key.to_i) 
    when "r" then l6 = Lucky6.new 
    when "q" then break 
    end 
    screen.draw draw(l6) 
    end 
end 
+0

Хороший материал! но могу ли я попросить подход без ООП и с ограничениями, которые я показал. :) – codescribble

+0

@codescribble, что вы имеете в виду? Изменить '" 1..6 = Установить "' to '" сделать ввод (1/2/3/4/5/6) "'? Переход от 'Lucky6' к регулярному' Array' и методам несколько тривиален. Также почему вам не нравится подход «OOP» *? – ndn

+1

Отличное решение! –

Смежные вопросы