O TEMA DO FÓRUM ESTÁ EM MANUTENÇÃO. FEEDBACKS AQUI: ACESSAR

[Unity] Comparação de variaveis

Iniciado por Aurora, 07/06/2018 às 13:45

07/06/2018 às 13:45 Última edição: 09/06/2018 às 04:06 por Corvo
Olá pessoal

Eu tenho 4 variaveis, onde cada uma dessas variaveis dependendo do valor passaria para uma Scene diferente. O problema é que eu não sei como fazer para que ele não considere a ordem e sim a variavel de maior quantidade.

Por exemplo,

var1 = 5
var2 = 3
var3 = 7
var4 = 4

Ele vai para a tela da var1 e var2 no lugar de ir para a tela da var1 e var3.


    public void Comparacao()
    {

        if (botr > 2)
        {
            if (laque < 4)
            {
                if (crot < 4)
                {
                    if (elap < 4)
                    {
                        Debug.Log("botr");
                        Botropico();
                    }
                    else { Debug.Log("botr e elap"); ElapBotr(); }
                }
                else { Debug.Log("botr e crot"); CrotBotr(); }
            }
            else { Debug.Log("botr e laque"); LaqueBotr(); }
        }
        else
        {
            if (laque > 2)
            {
                if (botr < 4)
                {
                    if (crot < 4)
                    {
                        if (elap < 4)
                        {
                            Debug.Log("laque");
                            Laquetico();
                        }
                        else { Debug.Log("laque e elap"); ElapLaque(); }
                    }
                    else { Debug.Log("laque e crot"); CrotLaque(); }
                }
                else { Debug.Log("laque e botr"); LaqueBotr(); }
            }
            else
            {
                if (crot > 2)
                {
                    if (botr < 4)
                    {
                        if (laque < 4)
                        {
                            if (elap < 4)
                            {
                                Debug.Log("crot");
                                Crotalico();
                            }
                            else { Debug.Log("crot e elap"); ElapCrot(); }
                        }
                        else { Debug.Log("crot e laque"); CrotLaque(); }
                    }
                    else { Debug.Log("crot e botr"); CrotBotr(); }
                }
                else
                {
                    if (elap > 2)
                    {
                        if (botr < 4)
                        {
                            if (laque < 4)
                            {
                                if (crot < 4)
                                {
                                    Debug.Log("elap");
                                    Elapidico();
                                }
                                else { Debug.Log("elap e crot"); ElapCrot(); }
                            }
                            else { Debug.Log("elap e laque"); ElapLaque(); }
                        }
                        else { Debug.Log("elap e botr"); ElapBotr(); }
                    }
                    else { Erro(); }
                }
            }
        }

    }

07/06/2018 às 14:01 #1 Última edição: 07/06/2018 às 14:28 por Sotelie
Use [emphasys]Arrays[/emphasys] e [emphasys]Linq[/emphasys].

using System;
using System.Linq;

public class Test
{
     public static void Main()
     {
         var values = new int[] { 7, 8, 15, 3, 18 };
         var result = values.Max(); // 18
     }
}

Como eu faria pra pegar o segundo maior valor e fazer uma condição usando as duas?

Tem algo de muito estranho aí. Deixa eu ver se entendi direito... dessas 4 variáveis você sempre quer as duas com maior valor para ir para uma cena específica.
Isso significa que existem 6 combinações de duas dessas 4 variáveis. Então são um total de 6 telas possíveis também?

:math:

08/06/2018 às 11:18 #4 Última edição: 08/06/2018 às 11:20 por Sotelie
A maneira mais confiável e simples nesse caso seria [emphasys]Array.Sort(array)[/emphasys] e [emphasys]Array.Reverse(array)[/emphasys].

using System;

class MainClass {
    public static void Main (string[] args) {
        int[] items = { 5, 7, 28, 2, 1, 34 };
        Array.Sort(items);
        Array.Reverse(items);
        var item1 = items[0];
        var item2 = items[1];
    }
}


No entanto o uso constante disso pode causar um certo impacto no desempenho, então recomendo evitar.

Shiro: De qualquer forma, usar números desorganizados a menos que você receba-os de outra fonte geralmente né boa prática ¯\_(ツ)_/¯

Meu ponto não é esse, Sotelie. Independente de você obter os dois maiores valores de um array o que você realmente quer nesse caso são os índices de onde estes dois valores estão porque são eles que vão importar na hora de escrever a comparação.
Mesmo assim, como não tenho um vislumbre total do problema é inútil para mim matematizar (que normalmente é o que faria pra obter todas as saídas independente do número de entradas em uma única condição com saída única). )o) 

Fazer isso não vai fazer eu perder qual array é qual?

Veja bem, coloquei para cada array ser referente a um tipo.

Array[0]//botropico
Array[1]//laquetico
Array[2]//crotalico
Array[3]//elapidico

O que eu quero fazer é que por exemplo eu pegue as duas arrays de maior valor ex, Array[1] e Array[3] e eu vá para uma scene especifica dessa array, nesse caso chamando o ElapBotr();. Do modo que você colocou parece que misturaria as arrays e eu perderia a referencia de qual array é de quê, serio, eu não posso misturar, cada array dessa é especifico de uma coisa.

É como o Shiro falou.

08/06/2018 às 12:37 #7 Última edição: 08/06/2018 às 12:39 por Sotelie
Você não precisa perder a array original se fizer uma cópia, nesse caso eu usaria listas ao invés de arrays :batrick:

var items = new int[] { 1, 5, 10 };
var copy = new List<int>(items);


Listas possuem vários métodos pra se achar o Index de alguma coisa.

copy.IndexOf(15); // Retorna o index do primeiro elemento que for 15.


Mas xô ver se entendi, tu quer:
1 - Checar qual array é a maior (em questão de número de elementos)
2 - Checar qual array é a maior (qual array tem o maior número)
3 - Checar qual array é a maior (qual array tem a maior soma de números)

:batrick:

Eu quero o 2, e comparar duas arrays se tiver mais de uma com um valor alto, chamar uma scene especifica das arrays selecionadas.

Exemplo, se a array de crotalico tiver o maior valor, chamo a scene da tela de crotalico, mas se tiver a array de crotalico e a de laquetico com os maiores valores, vou chamar uma scene de crotalico & laquetico, mas pra isso eu preciso separar as arrays de valores altos, e saber como vou criar uma condição usando elas.

Se tiver complicado de entender, eu explico o que eu to fazendo melhor. >.<

Acho que entendi. Xô fazer uns experimentos aqui e daqui a pouco retorno \o/

Bom, pelo que eu entendi, você quer definir os maiores valores de 2 variáveis dentre 4 variáveis possíveis, certo? Se for isso, acredito que não precisa de um array, é algo um pouco mais simples, de qualquer forma, eu fiz um aqui, veja se é isso que estava querendo.

  private int var1,var2,var3,var4;

    void Start()
    {
        //Defina aqui os valores de cada variável
        var1 = 5;
        var2 = 3;
        var3 = 7;
        var4 = 4;
        Comparacao();
    }

    void Update()
    {

    }

    void Comparacao()
    {
        if (var1 > var2)
        {
            if (var1 > var3)
            {
                if (var1 > var4)
                {
                    print(var1);
                    //Obteve aqui o número maior na variável 1

                    if( var2 > var3 && var2 > var4)
                    {
                        print(var2);
                        //Obteve aqui o segundo maior na variável 2

                    }
                    else if (var3 > var2 && var3 > var4)
                    {
                        print(var3);
                        //Obteve aqui o segundo maior na variável 3


                    }
                    else if (var4 > var2 && var4 > var3)
                    {
                        print(var4);
                        //Obteve aqui o segundo maior na variável 4

                    }
                }
            }
        }

        if (var2 > var1)
        {
            if (var2 > var3)
            {
                if (var2 > var4)
                {
                    print(var2);
                    //Obteve aqui o número maior na variável 2

                    if (var1 > var3 && var1 > var4)
                    {
                        print(var1);
                        //Obteve aqui o segundo maior na variável 1

                    }
                    else if (var3 > var1 && var3 > var4)
                    {
                        print(var3);
                        //Obteve aqui o segundo maior na variável 3


                    }
                    else if (var4 > var1 && var4 > var3)
                    {
                        print(var4);
                        //Obteve aqui o segundo maior na variável 4

                    }
                }
            }
        }
        if (var3 > var1)
        {
            if (var3 > var2)
            {
                if (var3 > var4)
                {
                    print(var3);
                    //Obteve aqui o número maior na variável 3

                    if (var1 > var2 && var1 > var4)
                    {
                        print(var1);
                        //Obteve aqui o segundo maior na variável 1

                    }
                    else if (var2 > var1 && var2 > var4)
                    {
                        print(var2);
                        //Obteve aqui o segundo maior na variável 2


                    }
                    else if (var4 > var1 && var4 > var2)
                    {
                        print(var4);
                        //Obteve aqui o segundo maior na variável 4

                    }
                }
            }
        }
        if (var4 > var1)
        {
            if (var4 > var2)
            {
                if (var4 > var3)
                {
                    print(var4);
                    //Obteve aqui o número maior na variável 4

                    if (var1 > var2 && var1 > var3)
                    {
                        print(var1);
                        //Obteve aqui o segundo maior na variável 1

                    }
                    else if (var2 > var1 && var2 > var3)
                    {
                        print(var2);
                        //Obteve aqui o segundo maior na variável 2


                    }
                    else if (var3 > var1 && var3 > var2)
                    {
                        print(var3);
                        //Obteve aqui o segundo maior na variável 3

                    }
                }
            }
        }
    }


Você não explicou como você vai obter as variáveis, portanto, deixei eles no começo do script pré-definido, como no seu exemplo, de qualquer forma é fácil defini-los como queira, espero que seja isso que estava precisando!
Fazer mapas é uma arte, faça como se fosse o seu último.





08/06/2018 às 14:14 #12 Última edição: 08/06/2018 às 14:16 por Sotelie
Resultados dos meus experimentos.
Eu queria fazer com que você não se limitasse a um número específico de arrays, sendo assim usei listas, fica bem intuitivo por vezes.

using System.Linq;
using System;
using System.Collections.Generic;

// Lista de lista de números.
List<List<int>> variables = new List<List<int>>
{
    new List<int> { 12, 20, 1020, 102 },
    new List<int> { 12, 20, 36, 102 },
    new List<int> { 27, 603, 12, 188 },
    new List<int> { 108, 17, 103, 708 }
};
// Lista com os maiores números de cada lista.
// [Maior Número, Index do Maior Número, Número da Lista Em Que Este Número Está Contido.]
List<int[]> biggestNums = new List<int[]>();
// Preenchendo as listas.
int id;
for (int i = 0; i < variables.Count; i++)
{
    id = variables[i].Max();
    biggestNums.Add(new int[] { id, variables[i].IndexOf(id), i });
}
List<int[]> ordered = new List<int[]>(biggestNums);
// Uma lista ordenada com os maiores números em ordem crescente, e seus indexes nas listas originais.
List<int[]> orderedList = ordered.OrderBy(num => num[0]).ToList();
// O maior número (com o index) sempre será o último da lista.
// Para checar se existe duas listas com o mesmo maior número, basta ver em ordem decrescente os números repetidos.
foreach(int[] i in orderedList)
{
#if UNITY_EDITOR
    Debug.Log(string.Format("[{0},{1},{2}]", i[0], i[1], i[2]);
#else
    Console.WriteLine("[{0},{1},{2}]", i[0], i[1], i[2]);
#endif
}
// Pequeno exemplo pra testar.
for (int i = orderedList.Count - 1; i > 0; i--)
{
    if (orderedList[i][0] == orderedList[orderedList.Count - 1][0])
    {
        // O maior número é o mesmo número que o maior na lista.
    }
#if UNITY_EDITOR
    Debug.Log(string.Format("[{0},{1},{2}]", orderedList[i][0], orderedList[i][1], orderedList[i][2]));
#else
    Console.WriteLine("[{0},{1},{2}]", orderedList[i][0], orderedList[i][1], orderedList[i][2]);
#endif

    // Só para lembrar:
    // [ O maior número, o index do número na lista, a lista em que ele se encontra]
}


Você pode inserir quantas listas quiser no [emphasys]variables[/emphasys] (primeira lista ali), e quantos números quiser nela.
Os resultados se encontram em [emphasys]orderedList[/emphasys], que é uma lista de arrays em ordem crescente de 3 elementos: [maior número da array, index do número na array, a qual array ele pertence]

Eu queria ter deixado mais simples, mas tô numa situação complicada pra digitar então é tudo o que eu pude fazer ;-;

O código do Lycanimus funcionou exatamente como eu queria. Valeu também Sotelie, eu preferi o codigo do Lycanimus porque eu entendi melhor, mas agradeço MUITO a atenção que cê teve.