jueves, 12 de marzo de 2015

Excel Rolero: Simulación de Series de Tiradas

Hoy voy a empezar una sección sobre Excel y Juegos de Rol. Os pongo en antecedentes.

¡Volveré cabrones!


Yo estudié un Ciclo Superior de Informática y Telecomunicaciones y mi primer trabajo fue en una empresa que tenía tres academias de formación. Entre otras cosas, tuve que aprender VBA (Visual Basic for Access) y muchos temas relacionados con la ofimática, la programación y las redes. Además de eso, desde muy pequeño siempre me ha gustado la programación, aunque nunca he sido un especialista en ningún lenguaje.

Todos estos conocimientos siempre termino aplicándolos cuando necesito alguna historia relacionada con el rol. Así que cada cierto tiempo termino creando alguna cosa en excel y me gustaría compartir estos conocimientos con la comunidad rolera.

Esta sección no tendrá una periodicidad concreta, iré creando entradas según se me vayan presentando problemas nuevos que resolver con esta herramienta. Si alguién necesita de algún excel para un juego y es factible, también crearía una nueva entrada. Ahora, vayamos al meollo del asunto. La versión de Office que uso es la 2003, para ejecutar los ejemplos hay que bajar el nivel de seguridad de las macros porque Office las bloqueará por defecto. Estos ajustes están en : "Herramientas", "Opciones", pestaña "Seguridad", botón "Seguridad de Macros". Seleccionaremos "Medio" que nos preguntará si queremos ejecutarlas al iniciar el excel o en "Bajo" (No recomendado si no sabes que estás haciendo). Si quieres estar más seguro, siempre puedes volver a este menu y reestablecer la seguridad por defecto cuando termines las pruebas.
Al final del artículo, pondré un enlace con el archivo Excel para descargar.

Simulación de Series de Tiradas


Problema: Estoy creando un reglamento rolero, cuando un PJ es herido de gravedad y queda inconsciente en el suelo (es decir, se le acaba la vida, hablando en plata), hay que determinar si muere o se estabiliza (puesto que quiero que se resuelva mediante una mecánica). La regla es muy simple, está basada en D&D 5, pero con un Dado Fate. En el siguiente turno y los sucesivos, el jugador lanza un Dado Fate, tiene que anotar si sale "+" o si sale "-", los espacios en blanco no cuentan. Con 2 positivos el jugador se salva, con dos negativos se muere. La pregunta es: ¿Cuantos turnos tardará, de media, en decidirse el destino del PJ? ¿Harán falta 10 turnos tirando por lo general? Y todo este tipo de cosas.
Solución: Hay que hacer series de tiradas para simular esta mecánica. ¿Cuantas? Mientras más mejor, pero esto es aburrido, además de que puedes cometer errores. Para ello, he programado un excel que hace la simulación tantas veces como quieras.

Lo primero que hay que hacer, es una función que lanze un dado fate. Es decir, un generador de números aleatorios del -1 al 1. Después crearemos una función que realice la simulación.

Entramos a Excel y vamos a "Herramientas", "Macro" y "Editor de Visual Basic". Si no existe el Módulo 1, lo creamos en "Insertar" y "Módulo".
Ahora copiaremos el siguiente código:

Public Function TiradaFate(aleatorizacion As Integer)
Dim Resultado As Integer

Randomize
Resultado = Int((1 - -1 + 1) * Rnd + -1)

TiradaFate = Resultado
End Function

Public Function Simulacion()
Dim Celda_Inicial As String
Dim Hoja As String
Dim ResultadosPositivos As Integer
Dim ResultadosNegativos As Integer
Dim Resultado_Tirada As Integer
Dim Contador As Integer
Dim N_Simulaciones As Integer


Hoja = "Hoja1"
Celda_Inicial = "B2"
Sheets(Hoja).Select
Range("A2", "W2000") = ""
Range(Celda_Inicial).Select
ResultadosPositivos = 0
ResultadosNegativos = 0
Resultado = 0
Contador = 1

N_Simulaciones = InputBox("Número de simulaciones")
'N_Simulaciones = 10

For i = 1 To N_Simulaciones
    
    ActiveCell.Offset(0, -1) = i

    While Not Contador = 21
        ActiveCell = TiradaFate(Contador)
        Resultado_Tirada = ActiveCell.Value
        Range("W" & ActiveCell.Row) = Contador
        If Resultado_Tirada = 1 Then
            ResultadosPositivos = ResultadosPositivos + 1
            If ResultadosPositivos = 2 Then
                Contador = 20
            End If
        End If
        If Resultado_Tirada = -1 Then
            ResultadosNegativos = ResultadosNegativos + 1
            If ResultadosNegativos = 2 Then
                Contador = 20
            End If
        End If

        ActiveCell.Offset(0, 1).Select
        Resultado_Tirada = 0
        Contador = Contador + 1
    Wend

    Range("V" & ActiveCell.Row).Select
    If ResultadosPositivos = 2 Then
        ActiveCell = "Vive"
    End If
    If ResultadosNegativos = 2 Then
        ActiveCell = "Muerte"
    End If
  
    Range("B" & ActiveCell.Row + 1).Select
    ResultadosPositivos = 0
    ResultadosNegativos = 0
    Contador = 1
Next

End Function

La función "Simulacion()", a grandes rasgos, lo que hace es borrar el área que vamos a usar, pide mediante una caja de texto cuantas simulaciones vamos ha crear y repite mediante la instrucción "For".
La instrucción "While" es otro bucle que se repite en cada simulación, hace una tirada, la escribe en la primera casilla, si es positiva, incrementa 1 en ResultadosPositivos o si es negativa aumenta ResultadosNegativos.
Lo repetirá un máximo de 20 veces, pero en cuanto halla 2 resultados, positivos o negativos, para el bucle, escribe en la columna de "Destino" si vive o muere. Y en la columna "W" el número de tiradas que se necesitó para resolverse. Salta a la siguiente línea y repite el proceso hasta que llegue al nº de veces que hemos indicado mediante el cuadro de texto (variable N_Simulaciones).
Para ejecutar nuestra función, lo mejor es asignarla a un botón de formulario.

Activaremos la barra de formularios en "Ver", "Barra de Herramientas", "Formularios".
Le damos al botón "Botón", haremos un recuadro que será el tamaño y forma de nuestro botón.
Nos saldrá un asistente llamado "Asignar Macro". Pulsamos el botón "Nuevo". Esto nos creará una macro con lo siguiente:

Sub Botón1_AlHacerClic()
 
End Sub

Quizás nos lo cree en otro módulo, cortamos y lo pegamos al final del Módulo 1. Y lo dejamos así:

Sub Botón1_AlHacerClic()
    Call Simulacion
End Sub

Por lo que al pulsar el botón, ejecutará la función Simulación().
El resto del Excel son fórmulas de estadística que analizarán los datos que me hacen falta para comprobar la mecánica que estoy probando.

Al escribir estas líneas he realizado una serie de ¡1.000 Simulaciones! Un total de 3.737 tiradas en total. Estos son los resultados, vemos la cantidad y porcentaje de veces que se resolvió la mecánica con 2, 3, 4 o más tiradas. Como podéis comprobar, en unos minutos podemos ahorrarnos un tedioso trabajo que pordría abarcar días.


Cantidad de tiradas
          %
2 226 22,6
3 295 29,5
4 225 22,5
5 125 12,5
6 73 7,3
7 30 3
8 16 1,6
9 7 0,7
10 0 0
11 1 0,1
12 1 0,1
13 1 0,1
 
Excel Rolero 01: Simulacion de Series de Tiradas

Y hasta aquí el primer artículo de Excel Rolero, que espero no sea el último. Para cualquier consulta o petición, no dudéis en contactar conmigo en los comentarios o mediante G+.

No hay comentarios: