Tengo un poco de juego escrito en C#. Utiliza una base de datos de back-end. Es
un juego de cartas coleccionables, y yo quería para implementar la función de las cartas como una secuencia de comandos.

Lo que quiero decir es que me tienen esencialmente una interfaz, ICard, que una tarjeta de clase implementa (public class Card056: ICard) y que contiene la función que es llamada por el juego.

Ahora, para hacer la cosa que se puede mantener/moddable, me gustaría tener la clase para cada tarjeta como el código fuente en la base de datos y, esencialmente, compilarlo en el primer uso. Así que cuando tengo que agregar o cambiar una tarjeta, sólo voy a añadir a la base de datos y decirle a mi aplicación para actualizar, sin necesidad de recurrir a la asamblea de implementación (especialmente ya que estaríamos hablando de 1 de la asamblea por carta lo que significa que cientos de asambleas).

Es eso posible? Registro de una clase a partir de un archivo de código fuente y, a continuación, crear instancias de ella, etc.

ICard Cards[current] = new MyGame.CardLibrary.Card056();
Cards[current].OnEnterPlay(ref currentGameState);

El lenguaje es C#, pero bono extra si es posible escribir la secuencia de comandos en cualquier .NET lenguaje.

  • Que curioso, yo y un amigo estaban pensando en escribir un juego de cartas coleccionables en C# hace un tiempo, no suponga que usted todavía tiene la fuente de esto? Interesado en cómo se había acercado a este.
  • No, no tiene nada de izquierda, era en la realidad primeras etapas y, esencialmente, estaba trabajando como he descrito. Hoy en día, me gustaría ver en Roslyn hacer C# compilación: blogs.msdn.com/b/csharpfaq/archive/2011/10/19/… – Alternativamente, JavaScript usando Jint – jint.codeplex.com
  • ah, gracias, pero yo estaba buscando más la aplicación del juego de cartas coleccionables de sí mismo y de la estructura que había utilizado, como se opuso a que el motor de secuencias de comandos. Gracias de todos modos 🙂
InformationsquelleAutor Michael Stum | 2008-08-01

9 Comentarios

  1. 40

    Oleg Shilo C# solución de secuencia de Comandos (en El Proyecto de Código) realmente es una gran introducción a la prestación de secuencia de comandos de habilidades en la aplicación.

    Un enfoque diferente sería considerar la posibilidad de un lenguaje que está específicamente construido para secuencias de comandos, tales como IronRuby, IronPython, o Lua.

    IronPython y IronRuby están disponibles hoy en día.

    Para una guía de la incrustación de IronPython leer
    Cómo incrustar IronPython secuencia de comandos de apoyo en su aplicación existente en 10 sencillos pasos.

    Lua es un lenguaje de secuencias de comandos comúnmente utilizados en los juegos. Hay un Lua compilador .NET, disponible en CodePlex — http://www.codeplex.com/Nua

    Que codebase es una gran lectura, si usted desea aprender acerca de la construcción de un compilador .NET.

    Un ángulo diferente por completo es tratar PowerShell. Hay numerosos ejemplos de la integración de PowerShell en una aplicación — he aquí un exhaustivo proyecto sobre el tema:
    Powershell Túnel

    • Por cierto, he elegido este como el aceptado contestar, porque yo quería loo en Python y IronPython de todos modos, por lo que el IronPython enfoque funciona mejor para yo.
    • LuaInterface es un intérprete lua que funciona fantástica.
    • He implementado en C# de secuencia de Comandos en un sistema de flujo de trabajo en 09 de Noviembre. Se ha realizado realmente bien para nosotros.
  2. 7

    Usted podría ser capaz de utilizar IronRuby para que.

    De lo contrario te sugiero que tiene un directorio donde se coloca precompilado asambleas. Entonces usted podría tener una referencia en la base de datos a la asamblea y a la clase, y el uso de la reflexión para cargar el correcto asambleas en tiempo de ejecución.

    Si usted realmente desea compilar en tiempo de ejecución se podría utilizar el CodeDOM, entonces usted podría utilizar la reflexión para cargar la dinámica de la asamblea. La documentación de Microsoft artículo que podría ser de ayuda.

  3. 6

    Si usted no desea utilizar el DLR puede el uso de Boo (que tiene un intérprete) o usted podría considerar la posibilidad de el Script.NET (S#) proyecto en CodePlex. Con el Boo solución puede elegir entre compilado secuencias de comandos o mediante el intérprete, y Boo hace un buen lenguaje de secuencias de comandos, tiene una sintaxis flexible y un lenguaje extensible a través de su compilador de la arquitectura. Script.NET se ve muy bien también, sin embargo, y usted puede fácilmente extender ese idioma, así como un proyecto de código abierto y utiliza una muy agradable Compilador Generador (Irony.net).

  4. 5

    Usted podría utilizar cualquiera de los lenguajes DLR, que proporcionan una forma para organizar fácilmente su propia plataforma de secuencias de comandos. Sin embargo, usted no tiene que usar un lenguaje de script para esta. Usted podría utilizar C# y compilarlo con el código C# de proveedor. Mientras se carga en su propio dominio de aplicación, usted puede cargar y descargar el contenido de su corazón.

  5. 5

    Me gustaría sugerir el uso de LuaInterface como se ha implementado totalmente Lua donde parece que Nua no está completa y es probable que no implementa algunas muy útil funcionalidad (corrutinas, etc).

    Si quieres utilizar algunas de las afueras preenvasados Lua módulos, me gustaría sugerir el uso de algo a lo largo de las líneas de 1.5.x en comparación con los 2.la serie x que se construye totalmente de código administrado y no se puede exponer a la necesaria API de C.

  6. 5

    Estoy usando LuaInterface1.3 + Lua 5.0 de un NET 1.1 aplicación.

    El problema con Boo es que cada vez que analizar/compile/eval su código sobre la marcha, se crea un conjunto de boo clases por lo que se obtiene pérdidas de memoria.

    Lua en el otro lado, no hacer eso, así que es muy muy estable y funciona de maravilla (me pueden pasar objetos de C# a Lua y hacia atrás).

    Hasta el momento no se han puesto en PROD todavía, pero parece muy prometedor.

    Yo tenía fugas de memoria, problemas en PROD utilizando LuaInterface + Lua 5.0, por lo tanto he usado Lua 5.2 y vinculados directamente en C# con DllImport. Las pérdidas de memoria se encontraban dentro de la LuaInterface biblioteca.

    Lua 5.2: desde http://luabinaries.sourceforge.net y http://sourceforge.net/projects/luabinaries/files/5.2/Windows%20Libraries/Dynamic/lua-5.2_Win32_dll7_lib.zip/download

    Una vez que hice esto, todas mis pérdidas de memoria se habían ido y la aplicación es muy estable.

  7. 4

    La aplicación principal que mi división vende hace algo muy similar a proveer el cliente personalizaciones (lo que significa que no puedo publicar cualquier fuente). Tenemos una aplicación en C# que carga dinámica VB.NET secuencias de comandos (aunque cualquiera .NET lenguaje podría ser fácilmente – VB fue elegido debido a la personalización del equipo de vino a partir de un ASP de fondo).

    Utilizando .NET CodeDom compilar los scripts de la base de datos, el uso de la VB CodeDomProvider (molesto es la predeterminada .NET 2, si usted desea apoyar a 3.5 características que usted necesita para pasar un diccionario con «CompilerVersion» = «v3.5» a su constructor). El uso de la CodeDomProvider.CompileAssemblyFromSource método para compilarlo (puede pasar configuración para forzar a compilar solo en la memoria.

    Esto podría resultar en cientos de asambleas en la memoria, pero usted puede poner toda la dinámica de clases de código’ juntos en una sola asamblea, y volver a compilar la totalidad del lote cuando cualquier cambio. Esto tiene la ventaja de que usted puede agregar una marca a compilar en el disco con un AP para cuando tienes que probar, lo que permite depurar a través de la dinámica de código.

  8. 4

    Sí, pensé acerca de eso, pero pronto me di cuenta de que otro Dominio Específico de Lenguaje (DSL), sería un poco demasiado.

    Esencialmente, ellos necesitan para interactuar con mi gamestate posiblemente de manera impredecible. Por ejemplo, una tarjeta puede tener una regla de «Al este de las tarjetas de entrar en juego, todos tus muertos vivientes esbirros de ganancia de +3 de ataque contra enemigos voladores, excepto cuando el enemigo está bendecido». Como el comercio de los juegos de cartas son por turnos, el GameState Administrador de fuego OnStageX eventos y deje las tarjetas de modificar otras tarjetas o el GameState en cualquier forma las necesidades de la tarjeta.

    Si intento crear una conexión de DSL, tengo que implementar un amplio conjunto de características y, posiblemente, en constante actualización, que los turnos de los trabajos de mantenimiento a la otra parte sin la eliminación de la.

    Es por eso que quería quedarse con un «real» .NET lenguaje esencialmente en ser capaz de disparar el evento y dejar la tarjeta de manipular la gamestate de la forma que sea (dentro de los límites de la seguridad de acceso del código).

    • (No hay necesidad de bandera de este; mientras que este debe ser un comentario/respuesta de la actualización, pero es protegido desde antes de que esas eran las opciones)
  9. 3

    La próxima versión de .NETO (5.0?) se ha hablado mucho acerca de la apertura del compilador «como servicio», que haría las cosas como directo de la secuencia de comandos de evaluación posible.

Dejar respuesta

Please enter your comment!
Please enter your name here