1인 개발/숫자의 신

숫자의 신 개인 프로젝트 2일차

잼잼재미 2024. 7. 23. 00:30

구현 내용


1. GameScene 기본 UI 생성


 

 

2. 숫자 버튼 구현


 

  • 클릭 시, 계산식 UI에 차례대로 입력
  • C 클릭 시, 초기화

 

 

CalculationFormula 스크립트

public void EnterNumber(int num)
{
    if (_fillNumberFrames == _numberFramesCount) return;

    _numberFrames.transform.GetChild(_fillNumberFrames).GetChild(0).GetComponent<TextMeshProUGUI>().text = num.ToString();
    _fillNumberFrames++;
}

public void ClearNumber()
{
    ResetNumberFrames();
    _fillNumberFrames = 0;
}

 

 

CalculationButton 스크립트

 public void NumberButton()
{
    for (int i = 0; i < _calculationFormulaes.transform.childCount; i++)
    {
        if(_calculationFormulaes.transform.GetChild(i).gameObject.activeSelf)
        {
            _calculationFormula = _calculationFormulaes.transform.GetChild(i).GetComponent<CalculationFormula>();
            break;
        }
    }

    _calculationFormula.EnterNumber(Number);
}

 

 

ClearButton 스크립트

public void ClearNumberButton()
{
    for (int i = 0; i < _calculationFormulaes.transform.childCount; i++)
    {
        if (_calculationFormulaes.transform.GetChild(i).gameObject.activeSelf)
        {
            _calculationFormula = _calculationFormulaes.transform.GetChild(i).GetComponent<CalculationFormula>();
            break;
        }
    }

    _calculationFormula.ClearNumber();
}

 

 

3. 계산 구현


 

 

CalculationFormula 스크립트

public void CalculateNumber()
{
    if (_fillNumberFrames != _numberFramesCount) return;

    string cal = "";
    int frameCount = 0;
    int calCount = 0;

    for (int i = 0; i < _numberFramesCount + _calculationsCount; i++)
    {
        if(i % 2 == 0)
        {
            cal += _numberFrames.transform.GetChild(frameCount).GetChild(0).GetComponent<TextMeshProUGUI>().text;
            frameCount++;
        }
        else
        {
            cal += _calculations.transform.GetChild(calCount).GetChild(0).GetComponent<TextMeshProUGUI>().text;
            calCount++;
        }
    }
}

 

위와 같이 입력한 숫자와 계산 기호를 순서대로 string 값으로 받아왔다. 

 

 

 

이와 같은 string 값의 ÷ 와 ×는 각각 / 와 * 로 변경해야 한다.

 

 

public void CalculateNumber()
{
    if (_fillNumberFrames != _numberFramesCount) return;

    string cal = "";
    int frameCount = 0;
    int calCount = 0;

    for (int i = 0; i < _numberFramesCount + _calculationsCount; i++)
    {
        if(i % 2 == 0)
        {
            cal += _numberFrames.transform.GetChild(frameCount).GetChild(0).GetComponent<TextMeshProUGUI>().text;
            frameCount++;
        }
        else
        {
            cal += _calculations.transform.GetChild(calCount).GetChild(0).GetComponent<TextMeshProUGUI>().text;
            calCount++;
        }
    }

    string newCal = cal.Replace("×", "*");
    string newCal2 = newCal.Replace("÷", "/");
}

 

Replace 함수를 통해, string 값을 대체했다. 대체한 string 값은 "2/4/8*7" 이다. 이 문자열을 그대로 계산하면 결과값을 구할 수 있다.

 

 

public void CalculateNumber()
{
    if (_fillNumberFrames != _numberFramesCount) return;

    string cal = "";
    int frameCount = 0;
    int calCount = 0;

    for (int i = 0; i < _numberFramesCount + _calculationsCount; i++)
    {
        if(i % 2 == 0)
        {
            cal += _numberFrames.transform.GetChild(frameCount).GetChild(0).GetComponent<TextMeshProUGUI>().text;
            frameCount++;
        }
        else
        {
            cal += _calculations.transform.GetChild(calCount).GetChild(0).GetComponent<TextMeshProUGUI>().text;
            calCount++;
        }
    }

    string newCal = cal.Replace("×", "*");
    string newCal2 = newCal.Replace("÷", "/");
    float result = Evaluate(newCal2);
}

private float Evaluate(string expression)
{
    DataTable table = new DataTable();
    table.Columns.Add("expression", typeof(string), expression);
    DataRow row = table.NewRow();
    table.Rows.Add(row);
    float result = float.Parse((string)row["expression"]);
    return result;
}

 

DataTable class의 table.Columns.Add 함수를 통해 간단히 string 문자열을 계산할 수 있다.

 

 

https://kkln2486.tistory.com/460

 

문자열로 된 수식 계산

using System.Data;string cal = "8×2÷2";string newCal = cal.Replace("×", "*");string newCal2 = newCal.Replace("÷", "/");float result = Evaluate(newCal2);Debug.Log(result); // 계산 결과private float Evaluate(string expression){ DataTable table = new

kkln2486.tistory.com

 

 

회고


오늘은 기본적인 계산 로직을 완성했다. 이제 떨어지는 Number를 구현해서 계산 결과와 동일한 Number을 지우도록 구현만 하면 기본적인 프로토 타입이 완성이다. 2D 게임이고, 간단한 퍼즐 디펜스 게임이다 보니, 생각보다 개발 시간이 많이 걸리지 않을 것 같다. 내일은 적 Number를 구한하도록 하겠다.