2015-07-09 2 views
1

Я пишу простую игру в командной строке. У меня есть класс Game, который запускает цикл и использует класс Board для отображения движений игрока. Я хочу написать класс игры в файл YAML, когда пользователи хотят сохранить состояние игры и загрузить YAML, когда игрок возобновит игру. Моя проблема в том, что я не знаю, как воссоздать объект, как только я открою файл YAML.Ruby Serializing Games Classes

def save_game 
    yaml = YAML::dump(self) 
    file = File.open("../data/Game.yml", 'w') {|file| file.write yaml.to_yaml} 
    exit 
end 

def load_game 
    data = File.open("../data/Game.yml", "r") {|file| file.read} 
    yaml = YAML::load(data) 
end 

Метод сохранения игры отлично работает, и мой объект сериализуется в правильном каталоге. Load_file отображает объект yaml, но я не знаю, куда идти отсюда.

Это первый проект, который я предпринял для сериализации и десериализации, поэтому, если есть дополнительные ресурсы, которые вы бы рекомендовали мне получить дополнительные знания по предмету, пожалуйста, дайте мне знать.

+0

Это потрясающе, поэтому позвольте мне написать хороший пример, чтобы помочь. – wurde

+0

решил проблему, это связано с тем, как вы пишете и читаете YAML – wurde

ответ

0

Я написал asciitrails.rb как игру, чтобы продемонстрировать сохранение и загрузку состояния игры.

#!/usr/bin/env ruby -w 
# asciitrails.rb 
# Author: Andy Bettisworth 
# Description: Walk the ASCII trails 

module AsciiTrails 
    require 'io/console' 
    require 'yaml' 

    attr_accessor :history 

    class Game 
    def start 
     puts 'You are now walking the ASCII trails.' 
     load_game 
     game_loop 
    end 

    private 

    def game_loop 
     loop do 
     move = get_move 
     case move 
     when "\e[A" 
      @history << "MOVE UP" 
      puts "[#{@history.count}] MOVE ARROW" 
     when "\e[B" 
      @history << "MOVE DOWN" 
      puts "[#{@history.count}] MOVE DOWN" 
     when "\e[C" 
      @history << "MOVE RIGHT" 
      puts "[#{@history.count}] MOVE RIGHT" 
     when "\e[D" 
      @history << "MOVE LEFT" 
      puts "[#{@history.count}] MOVE LEFT" 
     when "\u0003" 
      @history << "PAUSE" 
      puts "[#{@history.count}] PAUSE" 
      save_game 
      exit 0 
     end 
     end 
    end 

    def get_move 
     STDIN.echo = false 
     STDIN.raw! 

     input = STDIN.getc.chr 
     if input == "\e" then 
     input << STDIN.read_nonblock(3) rescue nil 
     input << STDIN.read_nonblock(2) rescue nil 
     end 
    ensure 
     STDIN.echo = true 
     STDIN.cooked! 

     return input 
    end 

    def save_game 
     File.open("./asciitrails.yml", 'w') { |f| YAML.dump([] << self, f) } 
     exit 
    end 

    def load_game 
     begin 
     yaml = YAML.load_file("./asciitrails.yml") 
     @history = yaml[0].history 
     rescue 
     @history = [] 
     end 
    end 
    end 
end 

if __FILE__ == $0 
    include AsciiTrails 

    game = Game.new 
    game.start 
end 

Сохранение состояния игры:

File.open("./asciitrails.yml", 'w') { |f| YAML.dump([] << self, f) } 

Загрузка игры состояние:

begin 
    yaml = YAML.load_file("./asciitrails.yml") 
    @history = yaml[0].history 
rescue 
    @history = [] 
end 

Когда вы загружаете состояние игры просто тянуть переменные вы используете.

+1

Спасибо @wurde, одна из проблем была связана с тем, как я сериализовал свои объекты, как только я сериализовал их так, как вы объяснили, что я получил еще один тип ошибок который после изучения, я обнаружил, что проблема с моим YAML заключалась в том, что я сериализую procs, которые вызвали ошибку. После переделки процессов я теперь могу сохранить состояние игры. Еще раз спасибо. –

+0

Рад помочь, это было весело. Можете ли вы проголосовать за это как ваш любимый ответ? – wurde