Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

¿Me ayudáis con mi proyecto?

Iniciado por Dani01, Marzo 14, 2018, 10:51:37 PM

Tema anterior - Siguiente tema
Marzo 14, 2018, 10:51:37 PM Ultima modificación: Marzo 15, 2018, 10:09:37 AM por pioj
Buenas noches.
 
 
 
En primer lugar comentar que hasta hace un mes mis conocimientos sobre unity y c# eran nulos. Ahora son mínimos.
 
 
 
Estoy embarcado en un proyecto de bachillerato que consiste en el uso de la gamificación en las aulas. El proyecto consiste en crear un juego para que los alumnos de 1 ESO practiquen el orden en que se deben aplicar las operaciones de +, -, * y / en una operación compleja.
 
 
 
En un primer lugar mis pasos a seguir para después irlos complicando son:
 
 
 
1.- Generar 2 número aleatorios entre 1 y 10, p ej. 4 y 3
 
 
 
2.- Generar una operación aleatoria de +, -, + o /, p. ej. 4+3
 
 
 
3.- Devolver a unity en una caja de texto la operación: 4 + 3
 
 
 
4.- El signo debería ir en un botón para que al pulsar sobre él con el ratón se genere el resultado.
 
 
 
He creado un script con solo la operación suma y he conseguido devolver la información y que funcione de una manera muy sencilla.
 
 
 
El problema lo tengo ahora, pues por más que he buscado no se como generar aleatoriamente las operaciones.
 
 
 
Además antes de seguir adelante me gustaría enseñaros el script, pues es probable que no esté bien diseñado y me vaya a crear problemas más adelante:
 
 
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Aleatorio03 : MonoBehaviour
{
    public GameObject TextBox;
    public int num1;
    public int num2;
    public int suma, resta;
        public void RandomGenerate()
    {
        num1 = Random.Range(1, 11);
        num2 = Random.Range(1, 11);
        TextBox.GetComponent<Text>().text = "" + num1 + "    -    " + num2;
    }
   
    public void Suma()
    {
        suma = num1 + num2;
       
        TextBox.GetComponent<Text>().text = "" + suma ;
    }

 
    //Update is called once per frame
 
 



   
       
   
   
        void Update () {
   
   
          }
      }
   
   
       
   

[/quote]
 
 

Marzo 15, 2018, 01:38:15 AM #1 Ultima modificación: Marzo 15, 2018, 10:10:45 AM por pioj
No se si te entendí bien, pero podrías hacer esto.
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Aleatorio03 : MonoBehaviour
{
        public GameObject TextBox;
        public int num1;
        public int num2;
        public int suma, resta;
        public int Ti***eracion;
            public void RandomGenerate()
        {
        num1 = Random.Range(1, 10); //Te cambie esto porque generar un numero del 1 al 10 es de esa manera.
        num2 = Random.Range(1, 10);
        int resultado = 0;      
        Ti***eracion = Random.Range(1, 4); //Teniendo en cuenta que si queda 1 = suma, 2 = resta, 3 = Division, 4 = Multiplicación
        switch (Ti***eracion) {
        case 1:
            resultado = num1 + num2;
            break;
        case 2:
            resultado = num1 - num2;
            break;
        case 3:
            resultado = num1 / num2;
            break;
        case 4:
            resultado = num1 * num2;
            break;
        }
               
        TextBox.GetComponent<Text>().text = resultado.ToString(); //Usa el ToString() para evitar la concatenación cuando no la necesites
            }
       
        public void Suma()
        {
                suma = num1 + num2;
               
                TextBox.GetComponent<Text>().text = "" + suma ;
            }
       
 
        void Update () {
            }
}

 
Perdona si no entendí bien, pero cualquier cosa estoy para ayudar! :)

Hola. En UnitySpain estamos totalmente en contra de hacerle los deberes a nadie, por lo que no podemos darte respuestas de forma oficial. Se trata de que te sepas mover un poco por tu cuenta y ganes intuición e iniciativa por hacer tú las cosas y no esperar siempre a que alguien te lo dé todo hecho...
 
Dicho ésto, tal vez encuentres algo útil si buscas por Google palabras clave cómo: " C# aleatorio numero random", y cosas similares. Todo es saber buscar con las palabras clave adecuadas...
 
Si has estudiado Matemáticas en clase, tal vez sepas que para invertir el signo de un número positivo y/o negativo, basta con multiplicarlo por -1...
 
En el manual de scripting para Unity, te indican que hay un comando dentro de la clase Mathf. que sirve para devolver si un número es positivo o negativo, para que puedas conocer e imprimir dicho símbolo por pantalla...
 
 
 
Creo que ya te he dado bastantes pistas. Buena Suerte!

El consejo que te puedo dar, es que aproveches la aleatoriedad de los números para ofrecer operaciones.
 
Por ejemplo con un switch.
 
Generas numeros aleatorios del 1-10
 
Si es 1, pues ofreces operacion suma, del tipo a+b, y te generas a y b de forma aleatoria tambien.
 
Si es 2, pues ofreces operacion resta, y así sucesivamente.
 
No sé si te podrá servir o buscas otra cosa

Bueno arriba ya te lo dejaron bien listo y funcional, pero solo para agregar (y proyectar un poco), si en algún futuro pensás en agregar una funcionalidad cualquiera, no digo que necesariamente en este proyecto, pero quizás para otra situación en la que no querés meter switchs, enums, ni escribir toda posible combinación desde cero (ej querés un caso que salga suma + mult, o log + suma , o mult + potencia + log, etc), podés recurrir a los delegados, con estos para esta aplicación en particular podés meterle métodos dentro y usarlos como quieras.
 
En este Ej meto todas los operaciones (Suma, Resta, Mult, Div, Log , Potencia) en un delegado ("operacion") y en un momento dado (Al apretar "K") se realiza una operación aleatoria.
 

public class TestRANDOMOp : MonoBehaviour {
//Declaración del Delegado
delegate float OperacionDelegate(float a, float b);
OperacionDelegate operacion;   
float Suma(float a , float b){   return a + b; }
float Resta(float a , float b){ return a - b; }
float Multiplicacion(float a , float b){return a * b ; }
float Division(float a , float b){ return a / b ; }
float Logaritmo(float a , float b){ return Mathf.Log(a , b); }
float Potencia(float a , float b) { return Mathf.Pow(a,b); }
 
void Start()
{      
   //metés todos los métodos dentro del delegado
   operacion += Suma;
   operacion += Resta;
   operacion += Multiplicacion;
   operacion += Division;
   operacion += Potencia;
   operacion += Logaritmo;
}

    void HacerOp(float a , float b)
    {
   //Elegís un método random
   int random = Random.Range(0, operacion.GetInvocationList().Length);
   OperacionDelegate elegida = (OperacionDelegate)operacion.GetInvocationList()[random];      
   
   float result = (float)elegida.DynamicInvoke( a , b );
        print("Result = " + result);
    }
   
    //De prueba para testearlo
    void Update(){      
   float a = 5;
   float b = -2;
   if(Input.GetKeyDown(KeyCode.K))
      HacerOp(a,b);
}
}

 
O si te ponés creativo podés tener X delegados (en vez de 1) y cada uno que sea una combinación de métodos .... o tener uno solo (como en el ej) pero en vez de elegir uno ("elegida") elegir varias operaciones (siguiendo el random, por ej).

Muchísimas gracias por vuestras respuestas.
 
Me pongo con ellas a la carga ...
 
Solo una cosa y sin querer entrar en polémicas pioj, creo que no has leído bien mi consulta. En ningún momento he pedido que me resuelvan el proyecto. He dejado claro que mis conocimientos son muy mínimos y estos los he logrado de manera autodidacta. Tengo un problema a la hora de generar aleatoriamente operaciones aritméticas y es para lo que he solicitado ayuda después de buscar mucho pero como no he encontrado nada me he decidido a pedir ayuda en el foro. Durante este último mes ha habido mucho trabajo para conocer unity y c# te lo puedo asegurar. Si miras mi script puedes ver que se como crear números aleatorios y por supuesto que también se "que para invertir el signo de un número positivo y/o negativo, basta con multiplicarlo por -1..."
 
De nuevo gracias a todos y espero seguir contando con vosotros.

Etiquetas: