Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: JohnW en Octubre 27, 2017, 11:42:20 PM

Título: Dividir variables
Publicado por: JohnW en Octubre 27, 2017, 11:42:20 PM
Hola familia!
Estoy intentando crear un mini programa de calculo que calcule de manera automatica unas operaciones basandose en la ley de ohms y la ley de Watts.

El problema viene en que cuando quiero asignar una division al estar la variable en 0 pues me da error de division.

Yo tengo puesto en Create:

vatios = 0
intensidad = 0
resistencia = 0
potencia = 0

vatios = intensidad*resistencia
intensidad = vatios/resistencia
resistencia = vatios/intensidad
potencia = vatios*intensidad

Entonces yo lo que quiero con esto es que si por ejemplo tengo un problema matematico tipo este:
Tengo una lampara de 100potencia a 230vatios, ¿cual es la intensidad y la resistencia?

Pues que yo le ponga en potencia 230 y en vatios 100 y automaticamente me saque lo demas.

No se si me he explicado, espero que alguien entienda lo que quiero y me pueda ayudar.


Para los que no sepan como va la ley ohms y watts os pongo aqui las operaciones para poder entender lo que quiero hacer.

Ley ohms:

vatios = intensidad * resistencia
intensidad = vatios / resistencia
resistencia = vatios / intensidad

Ley watts:

potencia = vatios * intensidad
intensidad = potencia / vatios
vatios = potencia / intensidad

Muchas gracias a todos y espero que alguien consiga ayudarme!
Título: Re:Dividir variables
Publicado por: 3dgeminis en Octubre 28, 2017, 12:38:42 AM
Podrias comprobar antes de hacer la operacion de dividir, si ambas variables no son igual a cero, si no lo son se hace la operacion.
Para la de intensidad seria algo asi
[gml]
if (vatios!=0 and resistencia!=0) {intensidad=vatios/resistencia} else {intensidad=0}
[/gml]
Título: Re:Dividir variables
Publicado por: JohnW en Octubre 28, 2017, 09:13:13 AM
Cita de: 3dgeminis en Octubre 28, 2017, 12:38:42 AM
Podrias comprobar antes de hacer la operacion de dividir, si ambas variables no son igual a cero, si no lo son se hace la operacion.
Para la de intensidad seria algo asi
[gml]
if (vatios!=0 and resistencia!=0) {intensidad=vatios/resistencia} else {intensidad=0}
[/gml]

No me funciona exactamente como quiero... porque con esa linea de codigo lo que le digo es que si no cumple tal condicion pues que sea igual a cero siempre, por lo tanto a la hora de hacer una operacion en el mismo codigo si le pongo una intensidad para que me calcule vatios y resistencia pues no lo hace porque como estan a cero intensidad siempre sera cero.

Se entiende lo que digo?

Gracias
Título: Re:Dividir variables
Publicado por: bygdle en Octubre 28, 2017, 10:27:43 AM
Según lo que entendí, quieres ingresar algunos de los datos, y que el programa calcule el resto, ¿verdad?

Si es así, el código que tienes en el evento Create es algo ilógico, pues requieres conocer los cuatro valores para hacer los cálculos.

Para solucionarlo, se me ocurre que podrías usar un script al que le puedas ingresar sólo los valores que tienes (deben ser como mínimo 2), y dependiendo de cuáles sean, calcular el resto despejándolos a partir de los conocidos.

Hice este script, que utiliza mapas para pasar la información de lado a lado:
[gml]
///ley_ohms_watts(mapa);

var mapa = argument0;
if(!ds_exists(mapa, ds_type_map))
    return false;
   
var vatios = 0;
var resist = 0;
var potenc = 0;
var intens = 0;

if(ds_map_exists(mapa, "vatios") and ds_map_exists(mapa, "resistencia"))
//Si se conocen los vatios y la resistencia, calcular los demás a partir de ahí.
{
    vatios = mapa[? "vatios"];
    resist = mapa[? "resistencia"];
   
    //Aquí hacemos los cálculos
    if(resist <> 0) //Si la resistencia no es 0
        intens = vatios / resist; //Calcular la intensidad
    else
        intens = 0; // De lo contrario, la intencidad es 0
       
    potenc = vatios * intens;
}

else if(ds_map_exists(mapa, "vatios") and ds_map_exists(mapa, "potencia"))
//Si se conocen los vatios y la potencia, calcular los demás a partir de ahí
{
    vatios = mapa[? "vatios"];
    potenc = mapa[? "potencia"];
   
    if(vatios <> 0)
    {
        intens = potenc / vatios;
        resist = vatios / intens;
    }
    else
    {
        intens = 0;
        resist = 0;
    }
}
else if(ds_map_exists(mapa, "vatios") and ds_map_exists(mapa, "intensidad"))
//Lo mismo pero diferente
{
    vatios = mapa[? "vatios"];
    intens = mapa[? "intensidad"];
   
    if(vatios <> 0)
        resist = intens / vatios;
    else
        resist = 0;
       
    potenc = vatios * intens;
}
else if(ds_map_exists(mapa, "resistencia") and ds_map_exists(mapa, "potencia"))
{
    resist = mapa[? "resistencia"];
    potenc = mapa[? "potencia"];
   
    if(resist <> 0)
        intens = sqrt(potenc / resist);
    else
        intens = 0;
       
    vatios = intens * resist;
}
else if(ds_map_exists(mapa, "resistencia") and ds_map_exists(mapa, "intensidad"))
{
    resist = mapa[? "resistencia"];
    intens = mapa[? "intensidad"];
    vatios = resist * intens;
    potenc = vatios * intens;
}
else if(ds_map_exists(mapa, "potencia") and ds_map_exists(mapa, "intensidad"))
{
    intens = mapa[? "intensidad"];
    potenc = mapa[? "potencia"];
    if(intens <> 0)
    {
        vatios = potenc/intens;
        resist = vatios/intens;
    }
    else
    {
        resist = 0;
        vatios = 0;
    }
}



var resultado = ds_map_create();
resultado[? "vatios"]      = vatios;
resultado[? "resistencia"] = resist;
resultado[? "potencia"]    = potenc;
resultado[? "intensidad"]  = intens;

return resultado;
[/gml]
Se puede usar, por ejemplo, así:
[gml]
var datos = ds_map_create();

datos[? "potencia"] = 2;
datos[? "resistencia"] = 1.45;

var resultado = ley_ohms_watts(datos);

var potencia = resultado[? "potencia"];
var resistencia = resultado[? "resistencia"];
var intensidad = resultado[? "intensidad"];
var vatios = resultado[? "vatios"];


ds_map_destroy(resultado); //Liberar de la memoria
[/gml]
Título: Re:Dividir variables
Publicado por: JohnW en Octubre 28, 2017, 05:41:43 PM
Hola de nuevo y gracias por la ayuda!

He creado un script con el codigo que has puesto y luego el segundo codigo en un objeto y en el evento "Create". (No se si asi esta bien)

¿Como puedo hacer que ahora las 4 variables me aparezcan en la pantalla con el valor final de cada una de ellas?
Es decir, que en la pantalla me salga:

voltios = XX
resistencia = XX
intensidad = XX
potencia = XX

He probado de crear un evento "draw" y en el dibujar la variable con sus nombres segun el script pero no me sale nada.

Gracias de nuevo!
Título: Re:Dividir variables
Publicado por: bygdle en Octubre 28, 2017, 10:44:54 PM
Eso es porque las variables están declaradas localmente. Elimina la palabra var de la izquierda de las variables (no las del script). Quedaría así:
[gml]
///Evento Create
var datos = ds_map_create();

datos[? "potencia"] = 2;
datos[? "resistencia"] = 1.45;

var resultado = ley_ohms_watts(datos);

potencia = resultado[? "potencia"];
resistencia = resultado[? "resistencia"];
intensidad = resultado[? "intensidad"];
vatios = resultado[? "vatios"];


ds_map_destroy(resultado); //Liberar de la memoria
ds_map_destroy(datos); //Liberar de la memoria
[/gml]
Y ahora, para dibujarlas fácilmente, puedes usar este script: sprintf() (http://www.comunidadgm.org/index.php?topic=28815.0).

Lo usarías algo así:
[gml]
///Evento Draw
draw_text(32, 32, sprintf(
    "Resistencia: $1#Potencia: $2#Intensidad: $3#Vatios: $4",
    string_format(resistencia, 1, 6), //Para dibujar 6 cifras decimales, y no sólo 2.
    string_format(potencia, 1, 6),
    string_format(intensidad, 1, 6),
    string_format(vatios, 1, 6)
));
[/gml]
Título: Re:Dividir variables
Publicado por: JohnW en Octubre 29, 2017, 09:34:39 AM
Niuweb eres un crack! funciona perfecto y lo he usado con varios ejercicios que tengo de electricidad y es exacto!

Todo ese script me lo apuntare y lo estudiare muy bien para aprender esa manera de programar.

Una ultima cosa si no es mucha molestia, en la parte del codigo esta:

datos[? "vatios"] = 125;
datos[? "resistencia"] = 175;

Yo cuando quiero insertar los dos datos hago el cambio primero ahi asi

datos[? "potencia"] = 500;
datos[? "intensidad"] = 175;

¿Habria alguna forma de que en vez que se tenga que modificar el codigo cada vez, al entrar al programa te preguntara que 2 datos quieres insertar y su valor?

Es decir al entrar al programa que salga una ventana que diga:

Inserta el primer dato que tienes: ejemplo vatios
Inserta el segundo dato que tienes: ejemplo intensidad

Ahora inserta el valor de vatios: XX
Ahora inserta el valor de intensidad XX

Y al rellenar eso que lo calcule todo como ya haze el programa.

¿Es posible eso?

Gracias Niu!
Título: Re:Dividir variables
Publicado por: bygdle en Octubre 29, 2017, 10:00:16 AM
Puedes usar este script: split() (http://www.comunidadgm.org/index.php?topic=26286.0).
Y ahora, usa la función get_string() para ingresar la información mediante un cuadro de diálogo.
[gml]
///Evento Create
var datos = ds_map_create();

/*
Se abrirá una ventana de diálogo para ingresar el texto.
Se debe escribir por ejemplo:
potencia=3.15;vatios=9.11
*/
var entrada = get_string("Ingrese las variables:", "");
var partes  = split(entrada, ";");
for(var i = 0; i < array_length_1d(partes); i++)
{
   var assign = split(entrada, "=");
   if(array_length_1d(assign) == 2)
   {
      assign[0] = string_replace_all(assign[0], " ", "");
      assign[1] = string_replace_all(assign[1], " ", "");

      datos[? assign[0]] = real(assign[1]);
   }
}

var resultado = ley_ohms_watts(datos);

potencia    = resultado[? "potencia"];
resistencia = resultado[? "resistencia"];
intensidad  = resultado[? "intensidad"];
vatios       = resultado[? "vatios"];


ds_map_destroy(resultado); //Liberar de la memoria
ds_map_destroy(datos); //Liberar de la memoria
[/gml]

Si necesitas re-calcular los valores sin volver a ejecutar el juego, puedes agregar en algún evento de teclado la función room_restart(), que reiniciará la habitación actual del juego.

(Este código no lo he probado, avísame si tiene algún error.).
Título: Re:Dividir variables
Publicado por: JohnW en Octubre 29, 2017, 10:16:39 AM
Me salta este error:

FATAL ERROR in
action number 1
of Create Event
for object obj_variables:

trying to index a variable which is not an array
at gml_Object_obj_variables_CreateEvent_1 (line 13) -     var assign = split(entrada[i], "=");


Al arrancar el programa me pide los datos, los ingreso como en el ejemplo; potencia=3.15;vatios=9.11
y acto seguido me tira el error
Título: Re:Dividir variables
Publicado por: bygdle en Octubre 29, 2017, 10:41:56 AM
Revisa si ahora sí:
[gml]
///Evento Create
var datos = ds_map_create();

/*
Se abrirá una ventana de diálogo para ingresar el texto.
Se debe escribir por ejemplo:
potencia=3.15;vatios=9.11
*/
var entrada = get_string("Ingrese las variables:", "");
var partes  = split(entrada, ";");
for(var i = 0; i < array_length_1d(partes); i++)
{
    var assign = split(partes, "=");
    if(array_length_1d(assign) == 2)
    {
        assign[0] = string_replace_all(assign[0], " ", "");
        assign[1] = string_replace_all(assign[1], " ", "");

        datos[? assign[0]] = real(assign[1]);
    }
}

var resultado = ley_ohms_watts(datos);

potencia     = resultado[? "potencia"];
resistencia = resultado[? "resistencia"];
intensidad  = resultado[? "intensidad"];
vatios         = resultado[? "vatios"];


ds_map_destroy(resultado); //Liberar de la memoria
ds_map_destroy(datos); //Liberar de la memoria
[/gml]
Título: Re:Dividir variables
Publicado por: JohnW en Octubre 29, 2017, 10:56:50 AM
Ahora funciona perfecto!! Muchas gracias Niuweb eres un crack!!