#c# #unity3d #user-interface #text #type-conversion
Вопрос:
Я работаю над небольшой программой-калькулятором в Unity. Мне нужен калькулятор только для работы с двумя числами.
Функция, которую я пытаюсь реализовать: после ввода математического оператора он должен отображать второе число в третьем индексе.
Проблема: Вместо добавления второго числа первое число перезаписывается, если на клавиатуре нажата другая цифра.
Вот сценарий, который я создал:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Functions : MonoBehaviour
{
// Global Variable to display text on top panel
public Text panelText;
// Create a number variable
string num;
string num1;
string num2;
string mOpr;
string calNum;
string cbutton;
string opr;
bool isFirstNum;
// Start is called before the first frame update
void Start()
{
}
// A function with an int argument
public void NumberInputOne(string num)
{
num1 = num;
num2 = num;
if (panelText.text.Length < 1)
{
Debug.Log(num1);
panelText.text = num1;
isFirstNum = false;
}
else if (panelText.text.Length > 1 amp;amp; panelText.text.Length < 3)
{
num2 = num;
Debug.Log(num2);
panelText.text = num1 mOpr num2;
}
}
public void OperatorInput(string opr)
{
mOpr = opr;
if (panelText.text.Length > 0 amp;amp; panelText.text.Length < 2)
{
panelText.text = num1 mOpr;
}
}
// public void NumberInputTwo(int num)
//{
// ResNum2 = num;
// Debug.Log(ResNum2);
// if (panelText.text.Length > 1 amp;amp; panelText.text.Length < 3)
// {
// panelText.text = ResNum1 opr ResNum2;
// }
// }
public void RestartCal(string cButton)
{
panelText.text = "";
}
}
Я также добавил запись экрана, чтобы зафиксировать проблему:
У вас есть какие-нибудь предложения?
Спасибо
Ответ №1:
используйте функцию NumberInputOne, как показано ниже;
public void NumberInputOne(string num)
{
if (num1 is null)
{
Debug.Log(num1);
panelText.text = num1;
num1 = num
}
else
{
num2 = num;
Debug.Log(num2);
panelText.text = num1 mOpr num2;
}
}
кстати, я рекомендую вам ознакомиться с образцами кодов приложений для расчета. потому что, помимо того, о чем вы спрашиваете, есть места, которые вам нужно улучшить в целом.
Ответ №2:
Это похоже на упражнение по программированию для начинающих. Но правильный способ создания калькулятора включает в себя концепции программирования, которым вас, вероятно, еще не обучали. Что делает этот выбор неудачным в качестве задания.
Лично я бы построил калькулятор, определив простое синтаксическое дерево для представления вводимой формулы. Включая методы отображения формулы и вычисления ответа. Например;
public interface IValue
{
int Calculate();
string PrintValue();
}
public class Number : IValue
{
public int? Value;
public void AddDigit(int digit) => Value = (Value ?? 0) * 10 digit;
public int Calculate() => Value ?? 0;
public string PrintValue() => Value?.ToString();
}
public abstract class BinaryOperator : IValue
{
public IValue Left;
public IValue Right;
public abstract int Operation(int left, int right);
public abstract char Operator { get; }
public int Calculate()
{
var left = Left.Calculate();
var right = Right.Calculate();
return Operation(left, right);
}
public string PrintValue() => $"{Left?.PrintValue()} {Operator} {Right?.PrintValue()}";
}
public class Addition : BinaryOperator
{
public override char Operator => ' ';
public override int Operation(int left, int right) => left right;
}
// TODO define other operators
Затем подумайте о том, как каждая кнопка должна изменять синтаксическое дерево.
// the entire formula
public IValue Root;
// the number currently being typed
public Number Input;
public void Display() {
panelText.text = Root.PrintValue();
}
// start / clear
public void Start(){
Root = Input = new Number(){
Value = 0
};
Display();
}
public void Plus(){
// left as an exercise for the reader
Display();
}
public void Digit(int digit) {
Input.AddDigit(digit);
Display();
}
public void Calculate() {
// left as an exercise for the reader
Display();
}
Комментарии:
1.Если вам нужны все функции калькулятора, без каких-либо усилий, вы можете использовать
await CSharpScript.EvaluateAsync<int>( [user input] )
itnext.io/…2. Да, нет, я бы всегда предпочел в значительной степени ограничить пользователя, где это возможно ….
CSharpScript.EvaluateAsync
это круто и все такое, пока Пользователь не станет смешным и не наберетwhile(true){ }
:’D …. он сам виноват, конечно, но зачем вообще рисковать 😉3. В этом случае у вас есть полный контроль над тем, что может быть введено. Самое худшее, что может случиться, должно быть
/0
.