2011-04-12 9 views
5

He leído que Ruby es ideal para idiomas específicos de dominio. En los últimos meses, he estado creando un juego de navegador, un tipo de RPG. En algún momento, me gustaría que los usuarios puedan realizar y finalizar misiones. Las misiones pueden ser cualquier cosa, desde matar x cantidad de mobs, matar a un jefe de banda, tal vez reunir algunos elementos y cosas por el estilo.¿Cómo diseñaría un DSL de este tipo en Ruby?

Todo el proceso suena intrigante y propenso a errores. También estaba pensando que sería una buena idea crear una DSL para ese asunto. Una forma de describir misiones en un lenguaje simple. Pero no tengo mucha experiencia con eso.

¿Crees que es una buena idea? Y si es así, ¿tiene algún consejo/tutorial para sugerir?

Respuesta

8

Si usted está diseñando una DSL, entonces probablemente necesite tomarse un tiempo para pensar en el dominio al que está tratando de asignar el idioma. Las DSL son buenas para eliminar la repetitiva repetición que de otro modo tendrías que escribir para cada tarea, así que concéntrate en eso. Para tus ejemplos de misiones, ¿qué cosas comunes te ves necesitando entre las misiones? Obviamente, mucho dependerá de cómo las misiones se implementen "detrás de escena" también.

me puedo imaginar una búsqueda buscando algo como esto sin embargo:

Qwest "Retrieve the Grail" do 
    given_by :pope 

    description "Some hethan dragon took my cup, go get it back!" 

    condition "Slay a dragon" do 
    dragon.is_dead? 
    end 

    condition "Grab the Grail" do 
    player.inventory.contains :grail 
    end 

    reward :phat_loot 
end 

Aquí, el DSL podría utilizarse para crear una misión, darle un nombre, condiciones, recompensa, y asignarlo a un Maestro de misiones .

En cuanto a la escritura de la DSL, querrás aprender sobre la metaprogramación en ruby. Sé por qué_the_lucky_stiff ha escrito un artículo o dos al respecto, y la guía conmovedora tiene un capítulo sobre ella (Dwemthy’s Array in chapter 6). Personalmente, siempre me ha costado entender las cosas por las que escribí. Termino comprando Metaprogramming Ruby, y lo encontré realmente útil.

+0

ambas respuestas me ayudaron mucho, elegiría las dos mejores. Aunque tengo que elegir uno, elegiré este para el libro de metaprogramación, que también parece una buena referencia. – Spyros

+1

en 2012, probablemente no sea necesario reinventar la metaprogramación y superar los mismos obstáculos ... ¿tal vez revisar la gema Docile para implementar DSL? https://github.com/ms-ati/docile –

8

Aquí es un motor de arranque para usted:

module RPG 
    def quest 
    puts "starting your quest" 
    yield 
    end 

    def move direction 
    puts "moving to the #{direction.to_s}" 
    yield if block_given? 
    end 

    def door action 
    puts "#{action.to_s} door" 
    yield if block_given? 
    end 
end 

El escritor juego puede que escribir lo siguiente:

require 'rpg' 

include RPG 

quest do 
    move :left 
    move :right 
    door :open do 
    move :left 
    end 
end 

rendimientos de servicio:

> ruby game.rb 
starting your quest 
moving to the left 
moving to the right 
opening door 
moving to the left 
Cuestiones relacionadas