НПДВ-1. Урок 14. Виселица v.3.0

[М] Михаил Беркович, 5 ноября 2018, 17:58 , 2 подписчика

Вопрос сюда, потому что RubyMine. Всё-таки победил русские буквы в терминале, а вот Майн - не хочет.

Описание виселицы пишет крокозябрами. Вот код:

if (Gem.win_platform?)
  Encoding.default_external = Encoding.find(Encoding.locale_charmap)
  Encoding.default_internal = __ENCODING__

  [STDIN, STDOUT].each do |io|
    io.set_encoding(Encoding.default_external, Encoding.default_internal)
  end
end

require_relative  "game.rb"
require_relative  "resultprinter.rb"
require_relative  "word_reader.rb"
require  "unicode_utils/upcase"
current_path = File.dirname(__FILE__)

printer = ResultPrinter.new

word_reader = WordReader.new

words_file_name = current_path + "/data/words.txt"

game = Game.new(word_reader.read_from_file(words_file_name))

while game.status == 0 do
  printer.print_status(game)

  game.ask_next_letter
end

printer.print_status(game)

Вот код куда добавлял чтение ещё и по верхнему регистру.

class Game

  def initialize(slovo)
    @letters = get_letters(slovo)

    @errors = 0
    @status = 0

    @good_letters = []
    @bad_letters = []
  end

  def get_letters(slovo)
    if (slovo == nil || slovo == "")
      abort "Вы не ввели слово для игры"   
    end

    return UnicodeUtils.upcase(slovo).split("")
  end

  def ask_next_letter
    puts "\n Введите следующую букву"

    letter = ""

    while letter == "" do #пока пользователь не ввёл букву,просить её ввести
        letter = STDIN.gets.encode("UTF-8").chomp
    end

    next_step(letter)
  end

  def next_step(bukva)
    bukva = UnicodeUtils.upcase(bukva)
    if @status == -1 || 
       @status == 1
        return
    end

    if @good_letters.include?(bukva) || 
       @bad_letters.include?(bukva)
        return
    end

    if @letters.include?(bukva)

        @good_letters << bukva

        if @good_letters.uniq.sort == @letters.uniq.sort
            @status = 1
        end

    else
        @bad_letters << bukva
        @errors += 1

        if @errors >= 7
            status = -1
        end 
    end     
  end

  def letters
    return @letters # фишка Ruby - можно не писать return на последнюю строчку. Ruby сам поймёт и подставит его.
  end

  def good_letters
    @good_letters
  end

  def bad_letters
    @bad_letters
  end

  def status
    @status
  end

  def errors
    @errors
  end
end 

А вот скриншот настроек Майна

Обсуждение (3)


Michael Butlitsky Учитель

[M]

Да, с рубимайном проблема известная. Кстати в подобных репортах всегда прилагай версии ОС и руби.

Тут можно попробовать Global Encoding сделать UTF-8 тоже, или забить на задания с кириллицей внутри рубимайна (у него свой запускатель кода, в винде он работает с русским нестабильно, рецепты из гугла иногда помогают иногда нет).


Михаил Беркович

[М]

Ах да, пардон. Ось же надо.

RubyMine 2018.2.4 Build #RM-182.4505.55, built on October 8, 2018 JRE: 1.8.0_152-release-1248-b8 amd64 JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o Windows 10 10.0


Michael Butlitsky Учитель

[M]

Ну если именно с раннером проблема не победилась, то такие приложения (если нужна кирилица) лучше в консоли запускать.