[RESOLVIDO] Como fazer uma calculadora recebendo o resultado do jogador? UNITY
3 participantes
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
[RESOLVIDO] Como fazer uma calculadora recebendo o resultado do jogador? UNITY
Boa tarde, estou com um problema, não estou conseguindo finalizar uma questão aqui, eu necessito fazer uma calculadora para confirmar se o jogador poderá continuar no jogo, então a forma que eu pensei em fazer isso seria fazer um array com textmesh de umas 4 ou 5 operações matemáticas que iria aparecer para o usuário de forma aleatória, sendo assim gravando o resultado de cada operação em uma variável e depois teria que comparar o resultado com que o jogador colocasse no mobile, não sei como seria a melhor maneira de fazer isso receber o resultado do usuário, como posso fazer isso e comparando com a operação certa no momento e como fazer aparecer o textmesh aleatório?? a base dessa calculadora tá sendo feito tudo no UI com canvas, o teclado númerico que aparece para o jogador é tudo botão, teria que definir cada valor de cada botão tb ne??
lucaspoiob- Membro
- PONTOS : 2851
REPUTAÇÃO : 0
Respeito as regras :
Re: [RESOLVIDO] Como fazer uma calculadora recebendo o resultado do jogador? UNITY
Bem, lembre-se que texto não faz operação matemática, portanto todo o seu texto que representa os valores na UI sempre vão ser convertidos para int ou float (se desejar trabalhar com valores decimais).
Para sortear uma operação matemática, existem várias formas, mas um jeito fácil é primeiro sortear os números que farão parte dessa operação (creio que sejam dois né?) e depois sortear a operação.
Por exemplo: randomizar entre o número 0 e o número 99 e guardar esse valor numa variável chamada "firstNumber" e então fazer o mesmo para uma outra variável chamada "secondNumber".
Depois vc pode criar um array de char contendo as operações:
char[] operators = {'+', '-', '*', '/'};
E sortea um índice aleatório desse array para escolher uma operação, guardando numa variável:
var op = operators[Random.Range(0, operators.Length)];
Para o resultado, vc o guarda em outra variável, pode ser chamada de "result", fazendo uma verificação de qual operação foi realizada com um switch:
switch (op){
case '+':
result = firstNumber + secondNumber;
break;
case '-':
result = firstNumber - secondNumber;
break;
}
e assim para as outras operações....
Para mostrar essa conta no textmesh você pode criar uma string chamada "showOperation" e concatenar tudo:
string showOperation = firstNumber.ToString() + " " + op.ToString() + " " + secondNumber.ToString();
E aí vc usa a variável "showOperation" para ser mostrada no TextMesh.
Então se por exemplo firstNumber receber o valor randômico de 67 e secondNumber receber 15, e op for de subtração, o TextMesh vai exibir exatamente o seguinte:
67 - 15
E por dentro, o resultado será 52.
Pronto, tem agora a primeira parte do sistema feita.
Para receber o input do usuário, também existem várias formas, como vc optou para ser por botões, acredito q vc crie eles com cada um tendo o texto de cada número correspondente, né? Por exemplo: o botão do número 2 tem como texto o 2.
Se for assim, fica simples:
Cria uma classe estática e nela um campo estático chamado "userInput" do tipo string:
public static class Controller{
public static string userInput;
}
Agora para o botão, ele terá um script que quando ele for clicado, vc incrementa dentro do userInput o valor do seu texto,assim:
public void OnClick(){
Controller.userInput += GetComponentInChildren<Text>().text;
}
Então se você clicar no 4, depois no 9, e aí no 3, a variável userInput vai ser 493, por exemplo.
Agora para ver se o usuário acertou a conta ou não, dentro do botão de confirmação faz o seguinte:
public void OnClick(){
var userResult = System.ConvertToInt32(Controller.userInput);
if(userResult == result){
// Acertou
} else {
// Errou
}
Para sortear uma operação matemática, existem várias formas, mas um jeito fácil é primeiro sortear os números que farão parte dessa operação (creio que sejam dois né?) e depois sortear a operação.
Por exemplo: randomizar entre o número 0 e o número 99 e guardar esse valor numa variável chamada "firstNumber" e então fazer o mesmo para uma outra variável chamada "secondNumber".
Depois vc pode criar um array de char contendo as operações:
char[] operators = {'+', '-', '*', '/'};
E sortea um índice aleatório desse array para escolher uma operação, guardando numa variável:
var op = operators[Random.Range(0, operators.Length)];
Para o resultado, vc o guarda em outra variável, pode ser chamada de "result", fazendo uma verificação de qual operação foi realizada com um switch:
switch (op){
case '+':
result = firstNumber + secondNumber;
break;
case '-':
result = firstNumber - secondNumber;
break;
}
e assim para as outras operações....
Para mostrar essa conta no textmesh você pode criar uma string chamada "showOperation" e concatenar tudo:
string showOperation = firstNumber.ToString() + " " + op.ToString() + " " + secondNumber.ToString();
E aí vc usa a variável "showOperation" para ser mostrada no TextMesh.
Então se por exemplo firstNumber receber o valor randômico de 67 e secondNumber receber 15, e op for de subtração, o TextMesh vai exibir exatamente o seguinte:
67 - 15
E por dentro, o resultado será 52.
Pronto, tem agora a primeira parte do sistema feita.
Para receber o input do usuário, também existem várias formas, como vc optou para ser por botões, acredito q vc crie eles com cada um tendo o texto de cada número correspondente, né? Por exemplo: o botão do número 2 tem como texto o 2.
Se for assim, fica simples:
Cria uma classe estática e nela um campo estático chamado "userInput" do tipo string:
public static class Controller{
public static string userInput;
}
Agora para o botão, ele terá um script que quando ele for clicado, vc incrementa dentro do userInput o valor do seu texto,assim:
public void OnClick(){
Controller.userInput += GetComponentInChildren<Text>().text;
}
Então se você clicar no 4, depois no 9, e aí no 3, a variável userInput vai ser 493, por exemplo.
Agora para ver se o usuário acertou a conta ou não, dentro do botão de confirmação faz o seguinte:
public void OnClick(){
var userResult = System.ConvertToInt32(Controller.userInput);
if(userResult == result){
// Acertou
} else {
// Errou
}
Re: [RESOLVIDO] Como fazer uma calculadora recebendo o resultado do jogador? UNITY
Hmmm entendi, você está correto está forma pode dar certo mesmo, mas a minha questão é bem mais fácil acho tb, pois as operações já vão vim prontas nos códigos, então praticamente irei colocar 4 operações la( 4x2,5x5,2x7,8x3) ai só irá aparecer essas operações com o resultado de cada uma ai para comparar com o que o usuario colocou, então essas 4 só iriam estar dentro de um array randômico, por isso pensei em fazer como um texto mesmo, e no final compara se é verdadeiro ou falso o resultado do usuário, esse jeito que eu pensei está certo tb não??MayLeone escreveu:Bem, lembre-se que texto não faz operação matemática, portanto todo o seu texto que representa os valores na UI sempre vão ser convertidos para int ou float (se desejar trabalhar com valores decimais).
Para sortear uma operação matemática, existem várias formas, mas um jeito fácil é primeiro sortear os números que farão parte dessa operação (creio que sejam dois né?) e depois sortear a operação.
Por exemplo: randomizar entre o número 0 e o número 99 e guardar esse valor numa variável chamada "firstNumber" e então fazer o mesmo para uma outra variável chamada "secondNumber".
Depois vc pode criar um array de char contendo as operações:
char[] operators = {'+', '-', '*', '/'};
E sortea um índice aleatório desse array para escolher uma operação, guardando numa variável:
var op = operators[Random.Range(0, operators.Length)];
Para o resultado, vc o guarda em outra variável, pode ser chamada de "result", fazendo uma verificação de qual operação foi realizada com um switch:
switch (op){
case '+':
result = firstNumber + secondNumber;
break;
case '-':
result = firstNumber - secondNumber;
break;
}
e assim para as outras operações....
Para mostrar essa conta no textmesh você pode criar uma string chamada "showOperation" e concatenar tudo:
string showOperation = firstNumber.ToString() + " " + op.ToString() + " " + secondNumber.ToString();
E aí vc usa a variável "showOperation" para ser mostrada no TextMesh.
Então se por exemplo firstNumber receber o valor randômico de 67 e secondNumber receber 15, e op for de subtração, o TextMesh vai exibir exatamente o seguinte:
67 - 15
E por dentro, o resultado será 52.
Pronto, tem agora a primeira parte do sistema feita.
Para receber o input do usuário, também existem várias formas, como vc optou para ser por botões, acredito q vc crie eles com cada um tendo o texto de cada número correspondente, né? Por exemplo: o botão do número 2 tem como texto o 2.
Se for assim, fica simples:
Cria uma classe estática e nela um campo estático chamado "userInput" do tipo string:
public static class Controller{
public static string userInput;
}
Agora para o botão, ele terá um script que quando ele for clicado, vc incrementa dentro do userInput o valor do seu texto,assim:
public void OnClick(){
Controller.userInput += GetComponentInChildren<Text>().text;
}
Então se você clicar no 4, depois no 9, e aí no 3, a variável userInput vai ser 493, por exemplo.
Agora para ver se o usuário acertou a conta ou não, dentro do botão de confirmação faz o seguinte:
public void OnClick(){
var userResult = System.ConvertToInt32(Controller.userInput);
if(userResult == result){
// Acertou
} else {
// Errou
}
lucaspoiob- Membro
- PONTOS : 2851
REPUTAÇÃO : 0
Respeito as regras :
Re: [RESOLVIDO] Como fazer uma calculadora recebendo o resultado do jogador? UNITY
Da certo, mas o jeito da @MayLeone é muitooo melhor, vai por mim.
Tenta fazer um esforço e implementar o que ela explicou, o código vai ficar mais aleatório e vai requerir menos trabalho depois para gerar novas operações... E como a Unity entende operações matemáticas, vai dar pra fazer muitas outras coisas, expandindo as funcionalidadades com algumas pequenas edições.
Tenta fazer um esforço e implementar o que ela explicou, o código vai ficar mais aleatório e vai requerir menos trabalho depois para gerar novas operações... E como a Unity entende operações matemáticas, vai dar pra fazer muitas outras coisas, expandindo as funcionalidadades com algumas pequenas edições.
Re: [RESOLVIDO] Como fazer uma calculadora recebendo o resultado do jogador? UNITY
[quote="MarcosSchultz"]Da certo, mas o jeito da @MayLeone é muitooo melhor, vai por mim.
Tenta fazer um esforço e implementar o que ela explicou, o código vai ficar mais aleatório e vai requerir menos trabalho depois para gerar novas operações... E como a Unity entende operações matemáticas, vai dar pra fazer muitas outras coisas, expandindo as funcionalidadades com algumas pequenas edições.[/quote]
Obrigadoo, vou tentando fazer aqui, Qualquer coisa posso peço ajuda de novo, ta bom?? Valeu
Tenta fazer um esforço e implementar o que ela explicou, o código vai ficar mais aleatório e vai requerir menos trabalho depois para gerar novas operações... E como a Unity entende operações matemáticas, vai dar pra fazer muitas outras coisas, expandindo as funcionalidadades com algumas pequenas edições.[/quote]
Obrigadoo, vou tentando fazer aqui, Qualquer coisa posso peço ajuda de novo, ta bom?? Valeu
lucaspoiob- Membro
- PONTOS : 2851
REPUTAÇÃO : 0
Respeito as regras :
Re: [RESOLVIDO] Como fazer uma calculadora recebendo o resultado do jogador? UNITY
MarcosSchultz escreveu:Da certo, mas o jeito da @MayLeone é muitooo melhor, vai por mim.
Tenta fazer um esforço e implementar o que ela explicou, o código vai ficar mais aleatório e vai requerir menos trabalho depois para gerar novas operações... E como a Unity entende operações matemáticas, vai dar pra fazer muitas outras coisas, expandindo as funcionalidadades com algumas pequenas edições.
Eu fiz alguns scripts que deram certo, agora só falta converter o textMeshPro para int para assim eu poder verificar o valor e fazer as condições, por favor me ajudem, estou empacado nisso agora, os códigos estão abaixo;
CODIGO 1 - Calculadora
- Código:
[size=14]using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
using UnityEngine.UI;
public class Calculadora : MonoBehaviour
{
public int PrimeiroNumero;
public int SegundoNumero;
public char[] operators = {'+' , '*'};
public int resultado;
private string ShowOP;
public TextMeshProUGUI textDisplay;
public int textResultado;
public int ResultadoFinal;
// Start is called before the first frame update
void Start()
{
PrimeiroNumero = Random.Range (0,9);
SegundoNumero = Random.Range (0,9);
var op = operators[Random.Range(0, operators.Length)];
switch (op){
case '+':
resultado = PrimeiroNumero + SegundoNumero;
break;
case '*':
resultado = PrimeiroNumero * SegundoNumero;
break;
}
Debug.Log(op);
ShowOP = PrimeiroNumero.ToString() + " " + op.ToString() + " " + SegundoNumero.ToString() + " = ";
textDisplay.text = ShowOP;
Debug.Log(ShowOP);
}
// Update is called once per frame
void Update()
{
}
}[/size]
CODIGO 2 - Botaotexto, eu tentei fazer por esse covert32 mas nao funciona ou da erro no textmeshprougui
- Código:
[size=14]using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
using UnityEngine.UI;
public class BotaoTexto : MonoBehaviour
{
public TextMeshProUGUI texto;
public int resultado;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
public void AddDigito(string digito){
if(texto.text.Length < 2){
texto.text = texto.text + digito;
Debug.Log(digito);
resultado = System.Convert.ToInt32(texto);
Debug.Log(resultado);
Debug.Log(texto);
}
}
}[/size]
lucaspoiob- Membro
- PONTOS : 2851
REPUTAÇÃO : 0
Respeito as regras :
Re: [RESOLVIDO] Como fazer uma calculadora recebendo o resultado do jogador? UNITY
Entendo. Não tenho como testar agora os erros que o Convert.ToInt32 podem causar, talvez tenha que usar o TryParse.
De qualquer forma, tente fazer o caminho inverso: Converta o "resultado" para string e compare os valores como string mesmo, sem ser número:
Não tenho como testar agora porque estou num PC sem Unity, qualquer dúvida ou erro, só falar.
De qualquer forma, tente fazer o caminho inverso: Converta o "resultado" para string e compare os valores como string mesmo, sem ser número:
- Código:
resultado = texto;
//Acessando a variável "resultado" dentro da calculadora:
Calculadora calculadora = GameObject.Find("Nome do objeto que tem a calculadora na cena").GetComponent<Calculadora>();
if(resultado == calculadora.resultado.ToString())
// Acertou
else
// Errou
Não tenho como testar agora porque estou num PC sem Unity, qualquer dúvida ou erro, só falar.
Re: [RESOLVIDO] Como fazer uma calculadora recebendo o resultado do jogador? UNITY
MayLeone escreveu:Entendo. Não tenho como testar agora os erros que o Convert.ToInt32 podem causar, talvez tenha que usar o TryParse.
De qualquer forma, tente fazer o caminho inverso: Converta o "resultado" para string e compare os valores como string mesmo, sem ser número:
- Código:
resultado = texto;
//Acessando a variável "resultado" dentro da calculadora:
Calculadora calculadora = GameObject.Find("Nome do objeto que tem a calculadora na cena").GetComponent<Calculadora>();
if(resultado == calculadora.resultado.ToString())
// Acertou
else
// Errou
Não tenho como testar agora porque estou num PC sem Unity, qualquer dúvida ou erro, só falar.
Eu tentei esses dois aqui mas nao deu certo
- Código:
resultado = texto;
//Acessando a variável "resultado" dentro da calculadora:
Calculadora calculadora = GameObject.Find("Nome do objeto que tem a calculadora na cena").GetComponent<Calculadora>();
if(resultado == calculadora.resultado.ToString())
// Acertou
else
// Errou
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class BotaoTexto : MonoBehaviour
{
public TextMeshProUGUI texto;
public int resultado;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
resultado = texto;
//Acessando a variável "resultado" dentro da calculadora:
Calculadora calculadora = GameObject.Find("Calculo").GetComponent<Calculadora>();
if (resultado == calculadora.resultado.ToString())
// Acertou
else
// Errou
}
public void AddDigito(string digito)
{
if (texto.text.Length < 2)
{
texto.text = texto.text + digito;
textoString = texto;
}
}
}
lucaspoiob- Membro
- PONTOS : 2851
REPUTAÇÃO : 0
Respeito as regras :
Re: [RESOLVIDO] Como fazer uma calculadora recebendo o resultado do jogador? UNITY
Ops esse daqui na real escreveu:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class BotaoTexto : MonoBehaviour
{
public TextMeshProUGUI texto;
public string textoString;
public int resultado;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
public void AddDigito(string digito)
{
if (texto.text.Length < 2)
{
texto.text = texto.text + digito;
textoString = texto;
resultado = int.Parse(textoString);
}
}
}
lucaspoiob- Membro
- PONTOS : 2851
REPUTAÇÃO : 0
Respeito as regras :
Re: [RESOLVIDO] Como fazer uma calculadora recebendo o resultado do jogador? UNITY
A variável "resultado" do script BotaoTexto precisa ser do tipo string.
Que erro que está dando?
Que erro que está dando?
Re: [RESOLVIDO] Como fazer uma calculadora recebendo o resultado do jogador? UNITY
O erro que ele dá é na hora de compilar o código!! Não precisa ser string, pode ser tb int ou alguma forma de pegar e verificar se o valor que o usuário digitou é igual o que está salvo na variavel resultado da CALCULADORA, mas o valor que o usuario colocou está em forma de textMeshProUGUI, nao sei se collocar como inputfield seria melhor ou algum outro tipo para receber o resultado que o usuario colocou???MayLeone escreveu:A variável "resultado" do script BotaoTexto precisa ser do tipo string.
Que erro que está dando?
ERRO quando tento trocar o textmeshprougui para int: Cannot implicity convert type 'TMPro.TextMeshProUGUI' to 'int' e o outro erro quando tento trocar o textmeshprougui para string: Cannot implicity convert type 'TMPro.TextMeshProUGUI' to 'string'
lucaspoiob- Membro
- PONTOS : 2851
REPUTAÇÃO : 0
Respeito as regras :
Re: [RESOLVIDO] Como fazer uma calculadora recebendo o resultado do jogador? UNITY
Vc precisa converter a propriedade "text" de TextMeshProUGUI, e não a classe em si.
Re: [RESOLVIDO] Como fazer uma calculadora recebendo o resultado do jogador? UNITY
Hmmmm e de que forma eu consigo fazer isso no meu código??MayLeone escreveu:Vc precisa converter a propriedade "text" de TextMeshProUGUI, e não a classe em si.
lucaspoiob- Membro
- PONTOS : 2851
REPUTAÇÃO : 0
Respeito as regras :
Re: [RESOLVIDO] Como fazer uma calculadora recebendo o resultado do jogador? UNITY
Faz assim:
Quando vc tentou fazer:
textoString = texto;
Vc estava tentando armazenar dentro de uma string um objeto do tipo TextMeshProUI, então acarretava esse erro.
O objeto TextMesh possui muitas informações, não é uma string. A string do TextMesh vc acessa da forma como vc estava fazendo: texto.text.
Era essa propriedade q vc deveria usar para armazenar dentro de textoString:
textoString = texto.text;
Daí não daria erros.
Mas pq colocar essa propriedade dentro de uma variável para ser usada só uma vez para fazer uma verificação?
Nesse caso é preferível usar a propriedade directamente no if como eu te mostro mais acima.
- Código:
string resultado = GameObject.Find("Calculo").GetComponent<Calculadora>().resultado.ToString();
if(resultado == texto.text){
// Acertou
}else{
// Errou
}
Quando vc tentou fazer:
textoString = texto;
Vc estava tentando armazenar dentro de uma string um objeto do tipo TextMeshProUI, então acarretava esse erro.
O objeto TextMesh possui muitas informações, não é uma string. A string do TextMesh vc acessa da forma como vc estava fazendo: texto.text.
Era essa propriedade q vc deveria usar para armazenar dentro de textoString:
textoString = texto.text;
Daí não daria erros.
Mas pq colocar essa propriedade dentro de uma variável para ser usada só uma vez para fazer uma verificação?
Nesse caso é preferível usar a propriedade directamente no if como eu te mostro mais acima.
Re: [RESOLVIDO] Como fazer uma calculadora recebendo o resultado do jogador? UNITY
Olha eu tentei fazer desse jeito ai mas está dando outro erro agora, vou mandar os dois códigos para você verMayLeone escreveu:Faz assim:
- Código:
string resultado = GameObject.Find("Calculo").GetComponent<Calculadora>().resultado.ToString();
if(resultado == texto.text){
// Acertou
}else{
// Errou
}
Quando vc tentou fazer:
textoString = texto;
Vc estava tentando armazenar dentro de uma string um objeto do tipo TextMeshProUI, então acarretava esse erro.
O objeto TextMesh possui muitas informações, não é uma string. A string do TextMesh vc acessa da forma como vc estava fazendo: texto.text.
Era essa propriedade q vc deveria usar para armazenar dentro de textoString:
textoString = texto.text;
Daí não daria erros.
Mas pq colocar essa propriedade dentro de uma variável para ser usada só uma vez para fazer uma verificação?
Nesse caso é preferível usar a propriedade directamente no if como eu te mostro mais acima.
Codigo Calculadora
- Código:
[size=14]using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
using UnityEngine.UI;
public class Calculadora : MonoBehaviour
{
public int PrimeiroNumero;
public int SegundoNumero;
public char[] operators = {'+' , '*'};
public int resultado;
private string ShowOP;
public TextMeshProUGUI textDisplay;
// Start is called before the first frame update
void Start()
{
PrimeiroNumero = Random.Range (0,9);
SegundoNumero = Random.Range (0,9);
var op = operators[Random.Range(0, operators.Length)];
switch (op){
case '+':
resultado = PrimeiroNumero + SegundoNumero;
break;
case '*':
resultado = PrimeiroNumero * SegundoNumero;
break;
}
Debug.Log(op);
ShowOP = PrimeiroNumero.ToString() + " " + op.ToString() + " " + SegundoNumero.ToString() + " = ";
textDisplay.text = ShowOP;
Debug.Log(ShowOP);
}
// Update is called once per frame
void Update()
{
}
}[/size]
Código BOTAOTEXTO
- Código:
[size=14]using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
using UnityEngine.UI;
public class BotaoTexto : MonoBehaviour
{
public TextMeshProUGUI texto;
public int resultado;
public float timer;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
string resultado = GameObject.Find("Calculo").GetComponent<Calculadora>().resultado.ToString();
if(resultado == texto.text){
UnityEngine.SceneManagement.SceneManager.LoadScene("Menu");
}else{
timer += Time.deltaTime;
if(timer >= 3){
UnityEngine.SceneManagement.SceneManager.LoadScene("Calculadora");
}
}
}
public void AddDigito(string digito){
if(texto.text.Length < 2){
texto.text = texto.text + digito;
}
}
}[/size]
O ERRO QUE ESTÁ DANDO AGORA É: NullReferenceException: Object reference not set to an instance of an object. BotaoTexto.Update()(at Assets/Telas Iniciais/BotaoTexto.cs:21)
lucaspoiob- Membro
- PONTOS : 2851
REPUTAÇÃO : 0
Respeito as regras :
Re: [RESOLVIDO] Como fazer uma calculadora recebendo o resultado do jogador? UNITY
No script do botão tem duas variáveis chamadas resultado, deleta aquela lá de cima do tipo int e só deixa a string dentro do Update.
Re: [RESOLVIDO] Como fazer uma calculadora recebendo o resultado do jogador? UNITY
MayLeone escreveu:No script do botão tem duas variáveis chamadas resultado, deleta aquela lá de cima do tipo int e só deixa a string dentro do Update.
Funcionouuu Obrigado, valeu pelas ajudas!!
lucaspoiob- Membro
- PONTOS : 2851
REPUTAÇÃO : 0
Respeito as regras :
Re: [RESOLVIDO] Como fazer uma calculadora recebendo o resultado do jogador? UNITY
Eu só queria saber como fazer para esperar o jogador digitar o resultado e depois ir para os if de verificação,pois está indo pro if direto sem esperar o jogador colocar o resultado, ai já ta aparecendo outra operação na hora, pois eu coloquei um timer de um tempo se o jogador errar para recarregar o level de novo para vim uma operação nova para ele, mas já está indo para o else direto sem ele ter colocado nada, tem que criar outro if para pegar a digitação do jogador??MayLeone escreveu:No script do botão tem duas variáveis chamadas resultado, deleta aquela lá de cima do tipo int e só deixa a string dentro do Update.
lucaspoiob- Membro
- PONTOS : 2851
REPUTAÇÃO : 0
Respeito as regras :
Re: [RESOLVIDO] Como fazer uma calculadora recebendo o resultado do jogador? UNITY
Vc está colocando a verificação se o jogador acertou ou não dentro do Update, então realmente nem vai dar tempo pra pessoa digitar o número, ele já vai pro else.
Para corrigir isso sugiro que você crie um IEnumerator e passe pra ele um tempo pra pessoa digitar, por exemplo, 5 segundos... Se a pessoa não digitar em 5 segundos o tempo acaba e aí faz a verificação.
Apaga o Update e cria um IEnumerator assim:
Agora a pessoa terá tempo para digitar o número (5 segundos, mas vc pode mudar ali no WaitForSeconds) e quando o tempo acabar, verifica se a pessoa acertou ou não o resultado.
Para corrigir isso sugiro que você crie um IEnumerator e passe pra ele um tempo pra pessoa digitar, por exemplo, 5 segundos... Se a pessoa não digitar em 5 segundos o tempo acaba e aí faz a verificação.
Apaga o Update e cria um IEnumerator assim:
- Código:
IEnumerator WaitTime(){
yield return new WaitForSeconds(5);
string resultado = GameObject.Find("Calculo").GetComponent<Calculadora>().resultado.ToString();
if(resultado == texto.text){
UnityEngine.SceneManagement.SceneManager.LoadScene("Menu");
}else{
UnityEngine.SceneManagement.SceneManager.LoadScene("Calculadora");
}
}
- Código:
void Start(){
StartCoroutine("WaitTime");
}
Agora a pessoa terá tempo para digitar o número (5 segundos, mas vc pode mudar ali no WaitForSeconds) e quando o tempo acabar, verifica se a pessoa acertou ou não o resultado.
Re: [RESOLVIDO] Como fazer uma calculadora recebendo o resultado do jogador? UNITY
MayLeone escreveu:Vc está colocando a verificação se o jogador acertou ou não dentro do Update, então realmente nem vai dar tempo pra pessoa digitar o número, ele já vai pro else.
Para corrigir isso sugiro que você crie um IEnumerator e passe pra ele um tempo pra pessoa digitar, por exemplo, 5 segundos... Se a pessoa não digitar em 5 segundos o tempo acaba e aí faz a verificação.
Apaga o Update e cria um IEnumerator assim:Daí dentro do Start desse script você coloca o seguinte:
- Código:
IEnumerator WaitTime(){
yield return new WaitForSeconds(5);
string resultado = GameObject.Find("Calculo").GetComponent<Calculadora>().resultado.ToString();
if(resultado == texto.text){
UnityEngine.SceneManagement.SceneManager.LoadScene("Menu");
}else{
UnityEngine.SceneManagement.SceneManager.LoadScene("Calculadora");
}
}
- Código:
void Start(){
StartCoroutine("WaitTime");
}
Agora a pessoa terá tempo para digitar o número (5 segundos, mas vc pode mudar ali no WaitForSeconds) e quando o tempo acabar, verifica se a pessoa acertou ou não o resultado.
Aeeeee deu certo obrigado, só mais uma coisa que eu gostaria de saber se funciona, queria que só aparecesse operações que o resultado for positivo ou zero e que fossem inteiros tb, pois tipo por exemplo nas operações de divisão quase sempre vai dar um numero float eu acho ne?? igual se for sorteado por exemplo 10-20, ai iria dar negativo. teria alguma forma de resolver isso?
lucaspoiob- Membro
- PONTOS : 2851
REPUTAÇÃO : 0
Respeito as regras :
Re: [RESOLVIDO] Como fazer uma calculadora recebendo o resultado do jogador? UNITY
Sim.
Dentro do case da subtração:
No caso aqui usaria um pouco de recursão: Se o resultado for um valor menor que zero, ou seja, um valor negativo, ele chama o Start de novo para sortear novos valores, e vai fazendo isso até result ser um valor positivo ou igual a zero. Caso ele encontre result como positivo, ele procede o código como antes.
Pode-ser fazer o mesmo sem usar recursão com o laço while que se mantém false até encontrar um valor positivo, mas acho que assim como eu fiz acima já resolve.
Para a divisão não acredito que dê valores flutuantes porque você está trabalhando com Int, isso quer dizer que o C# vai arredondar o valor flutuante para um inteiro, por exemplo: 4 dividido por 9 daria 0.45, mas vai ser arredondado para 0 se não me engano.
Então sim, existe um problema se o primeiro número ser menor que o segundo, obrigatoriamente o valor seria arredondado sempre pra zero, o que não traria desafio.
Outro fator da matemática: Nunca dividirás por zero, ou seja, o segundo número NUNCA pode ser zero.
Sobre essa perspectiva eu evitaria esse tipo de situação:
Existe também o caso das divisões não serem exatas, por exemplo: 97/8 = 12,125.
Mas como eu disse, o resultado não vai ser flutuante porque você está trabalhando com inteiros, nesse caso a resposta correta seria apenas 12.
Mas se quiser evitar isso, faça com que os números sejam sempre múltiplos de si, que aí as divisões serão sempre exatas:
Acho que da forma acima melhora demais e evita divisões com resto, mas por ter uma recursão pode ser que pese na performance.
Dentro do case da subtração:
- Código:
case '-':
result = firstNumber - secondNumber;
if( result < 0)
Start();
break;
No caso aqui usaria um pouco de recursão: Se o resultado for um valor menor que zero, ou seja, um valor negativo, ele chama o Start de novo para sortear novos valores, e vai fazendo isso até result ser um valor positivo ou igual a zero. Caso ele encontre result como positivo, ele procede o código como antes.
Pode-ser fazer o mesmo sem usar recursão com o laço while que se mantém false até encontrar um valor positivo, mas acho que assim como eu fiz acima já resolve.
Para a divisão não acredito que dê valores flutuantes porque você está trabalhando com Int, isso quer dizer que o C# vai arredondar o valor flutuante para um inteiro, por exemplo: 4 dividido por 9 daria 0.45, mas vai ser arredondado para 0 se não me engano.
Então sim, existe um problema se o primeiro número ser menor que o segundo, obrigatoriamente o valor seria arredondado sempre pra zero, o que não traria desafio.
Outro fator da matemática: Nunca dividirás por zero, ou seja, o segundo número NUNCA pode ser zero.
Sobre essa perspectiva eu evitaria esse tipo de situação:
- Código:
case '/':
if(firstNumber < secondNumber || secondNumber == 0){
Start();
} else {
result = firstNumber / secondNumber;
}
break;
Existe também o caso das divisões não serem exatas, por exemplo: 97/8 = 12,125.
Mas como eu disse, o resultado não vai ser flutuante porque você está trabalhando com inteiros, nesse caso a resposta correta seria apenas 12.
Mas se quiser evitar isso, faça com que os números sejam sempre múltiplos de si, que aí as divisões serão sempre exatas:
- Código:
// Melhorando a divisão para sempre mútiplos:
case '/':
if(firstNumber < secondNumber || secondNumber == 0){
Start();
} else if (firstNumber % secondNumber == 0) {
result = firstNumber / secondNumber;
} else {
Start();
}
break;
Acho que da forma acima melhora demais e evita divisões com resto, mas por ter uma recursão pode ser que pese na performance.
Re: [RESOLVIDO] Como fazer uma calculadora recebendo o resultado do jogador? UNITY
Outra alternativa sem a recursão é utilizando a instrução "goto" dentro do "switch":
- Código:
var op = operators[Random.Range(0, operators.Length)];
SortearNovosValores:
PrimeiroNumero = Random.Range (0,9);
SegundoNumero = Random.Range (0,9);
switch (op){
case '+':
resultado = PrimeiroNumero + SegundoNumero;
break;
case '*':
resultado = PrimeiroNumero * SegundoNumero;
break;
case '-':
resultado = PrimeiroNumero - SegundoNumero;
if (resultado < 0)
goto SortearNovosValores;
break;
case '/':
if (PrimeiroNumero < SegundoNumero || SegundoNumero == 0)
goto SortearNovosValores;
else if (PrimeiroNumero % SegundoNumero == 0)
resultado = PrimeiroNumero / SegundoNumero;
else
goto SortearNovosValores;
}
Re: [RESOLVIDO] Como fazer uma calculadora recebendo o resultado do jogador? UNITY
Eu Coloquei desssa forma mas está dando um erro: ...\Calculadora.cs(35,13): error CS8070: Control cannot fall out of switch from final case lavel('case '/':')MayLeone escreveu:Outra alternativa sem a recursão é utilizando a instrução "goto" dentro do "switch":
- Código:
var op = operators[Random.Range(0, operators.Length)];
SortearNovosValores:
PrimeiroNumero = Random.Range (0,9);
SegundoNumero = Random.Range (0,9);
switch (op){
case '+':
resultado = PrimeiroNumero + SegundoNumero;
break;
case '*':
resultado = PrimeiroNumero * SegundoNumero;
break;
case '-':
resultado = PrimeiroNumero - SegundoNumero;
if (resultado < 0)
goto SortearNovosValores;
break;
case '/':
if (PrimeiroNumero < SegundoNumero || SegundoNumero == 0)
goto SortearNovosValores;
else if (PrimeiroNumero % SegundoNumero == 0)
resultado = PrimeiroNumero / SegundoNumero;
else
goto SortearNovosValores;
}
- Código:
[size=14]using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
using UnityEngine.UI;
public class Calculadora : MonoBehaviour
{
public int PrimeiroNumero;
public int SegundoNumero;
public char[] operators = {'+' , '*'};
public int resultado;
private string ShowOP;
public TextMeshProUGUI textDisplay;
// Start is called before the first frame update
void Start()
{
var op = operators[Random.Range(0, operators.Length)];
SortearNovosValores:
PrimeiroNumero = Random.Range (0,9);
SegundoNumero = Random.Range (0,9);
switch(op){
case '+':
resultado = PrimeiroNumero + SegundoNumero;
break;
case '*':
resultado = PrimeiroNumero * SegundoNumero;
break;
case '-':
resultado = PrimeiroNumero - SegundoNumero;
if (resultado < 0){
goto SortearNovosValores;
}
break;
case '/':
if (PrimeiroNumero < SegundoNumero || SegundoNumero == 0){
goto SortearNovosValores;
}
else if (PrimeiroNumero % SegundoNumero == 0){
resultado = PrimeiroNumero / SegundoNumero;
}else{
goto SortearNovosValores;
}
}
Debug.Log(op);
ShowOP = PrimeiroNumero.ToString() + " " + op.ToString() + " " + SegundoNumero.ToString() + " = ";
textDisplay.text = ShowOP;
Debug.Log(ShowOP);
}
// Update is called once per frame
void Update()
{
}
}[/size]
lucaspoiob- Membro
- PONTOS : 2851
REPUTAÇÃO : 0
Respeito as regras :
Re: [RESOLVIDO] Como fazer uma calculadora recebendo o resultado do jogador? UNITY
Faltou uma instrução break embaixo da chave do último goto da estrutura.
Re: [RESOLVIDO] Como fazer uma calculadora recebendo o resultado do jogador? UNITY
Pronto agora está tudo finalizado, obrigado pela ajudaMayLeone escreveu:Faltou uma instrução break embaixo da chave do último goto da estrutura.
lucaspoiob- Membro
- PONTOS : 2851
REPUTAÇÃO : 0
Respeito as regras :
Tópicos semelhantes
» [RESOLVIDO] Como fazer o canvas ficar atrás do personagem? Unity 2D
» Como posso fazer o carro da policia seguir o jogador
» [RESOLVIDO] Como Fazer uma Mira ( Com zoom ) Unity 5
» [RESOLVIDO] Como Fazer Agregação via script do Unity?
» [RESOLVIDO] Como fazer um efeito Parallax com o Canvas no Unity?
» Como posso fazer o carro da policia seguir o jogador
» [RESOLVIDO] Como Fazer uma Mira ( Com zoom ) Unity 5
» [RESOLVIDO] Como Fazer Agregação via script do Unity?
» [RESOLVIDO] Como fazer um efeito Parallax com o Canvas no Unity?
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos