Tengo un problema, quiero hacer un Switch Case que diga quién ganó, quién perdió o si empataron (Venceu, Perdeu e Empatou).
Primero lo hice con valores enteros, con int valueA y valueB, donde si alguien gana vale 1, el que pierde vale 0 y empate, ambos valen 1.
Sin embargo, terminó dando el error:
error CS0029: no se puede convertir implícitamente el tipo 'bool' a '(int valueA, int valueB)'
Así que lo rehice usando valores booleanos, 1 = verdadero y 0 = falso.
Pero el error aún persiste y no sé cómo solucionarlo.
Este es mi código:
if(Input.GetKey(key1)) // Vence { animBlue.SetBool("AzulTiro", true); valorA = true; } else if(animRed.GetBool("VermelhoTiro") == true) // Perde { animBlue.SetBool("AzulMorte", true); valorA = false; } if(Input.GetKey(key2)) // Vence { animRed.SetBool("VermelhoTiro", true); valorB = true; } else if(animBlue.GetBool("AzulTiro") == true) // Perde { animRed.SetBool("VermelhoMorte", true); valorB = false; } switch (valorA, valorB) { case (valorA == true && valorB == false): Debug.Log("Azul Venceu"); break; case (valorA == false && valorB == true): Debug.Log("Vermelho Venceu"); break; case (valorA == true && valorB == true): Debug.Log("Empatou"); break; }Estoy bastante seguro de que el error está en el Switch, pero no sé qué es.
sintaxis incorrecta, necesita
switch (valorA, valorB) { case (true ,false): Debug.Log("Azul Venceu"); break; case (false , true): Debug.Log("Vermelho Venceu"); break; case (true, true): Debug.Log("Empatou"); break; }¿Qué hay de la coincidencia de patrones si su C# es lo suficientemente moderno?
var msg = (valorA, valorB) switch { (true, false) => "Azul Venceu", (false, true) => "Vermelho Venceu", _ => "Empatou" }; Debug.Log(msg);Razoné que un falso/falso no ocurriría o también sería un empate. Si no es así, puede modificar la declaración:
var msg = (valorA, valorB) switch { (true, false) => "Azul Venceu", (false, true) => "Vermelho Venceu", (false, true) => "Empatou", _ => null }; if(msg != null) Debug... Recuerde que esta es una declaración que proporciona valor en lugar de una acción; recibirá quejas del compilador si no es exhaustivo (no cubre todos los valores de entrada posibles) y la forma más fácil de hacerlo es proporcionar el caso "else" _ . Además, debido a que proporciona valores en lugar de ejecutar código, es posible que deba inspeccionar el valor si está tomando una decisión de "hacer/no hacer".
No puede usar esto para ejecutar acciones que son nulas (suponiendo que Debug.Log devuelva void) de la misma manera que no puede poner vacíos en un ternario; el ternario produce valores:
//no someBoolean? Debug.Log("yes") : Debug.Log ("no"); //yes Debug.Log(someBoolean? "yes" : "no");Sin embargo, un truco que puede usar es usar un interruptor (o un ternario) para devolver una lambda que luego ejecuta
Action a = (valorA, valorB) switch { (true, false) => () => Debug.Log("Azul Venceu"), (false, true) => () => Debug.Log("Vermelho Venceu"), (true, true) => () => Debug.Log("Empatou") _ => () => {} }; a(); //execute the returned action, which may be the do-nothing actionEstos interruptores devuelven un valor; cada uno devuelve una Acción y luego se puede invocar para realizar el registro
También se puede formar y ejecutar en una sola línea, aunque empieza a ponerse un poco "wtf?":
((valorA, valorB) switch { (true, false) => (Action)(() => Debug.Log("Azul Venceu")), (false, true) => () => Debug.Log("Vermelho Venceu"), (true, true) => () => Debug.Log("Empatou") _ => () => {} })();