在Unity中使用MVC模式实现简易计算器

MVC(Model-View-Controller)是一种软件设计模式,用于将应用程序的逻辑分离成三个主要组件:模型(Model),视图(View)和控制器(Controller)。这种分离有助于提高代码的可维护性、可扩展性和重用性。

下面是每个组件的简要说明:

  1. 模型(Model):模型表示应用程序的数据和业务逻辑。它负责处理数据的获取、存储、验证和处理。模型组件通常包含与数据相关的方法、类和数据结构。

  2. 视图(View):视图负责向用户显示数据和信息。它们呈现模型中的数据以供用户查看,并且通常是模型的可视化表示。视图不包含业务逻辑,其主要职责是在用户界面上呈现信息并接收用户输入。

  3. 控制器(Controller):控制器连接模型和视图,并处理用户的输入和交互。它接收用户的操作,更新相应的模型数据,并相应地更新视图。控制器还可以处理其他任务,如验证用户输入、调度其他操作和协调模型和视图之间的通信。

 在unity使用MVC模式实现简易计算器。为了简化代码,计算器只有加减乘除,只能输入整数,没有括号,乘除优先级高于加减,乘除运算同优先级,从左到右计算。

模型部分:

    private int lastnum;
    private int[] num = new int[100];
    private char[] calculate = new char[100];
    int items;
    private string[] button = new string[] { "1", "2", "3", "+", "4", "5", "6", "-", "7", "8", "9", "*", "0", "=", "=" ,"/" };
    private string Text;
    private bool flush;
    // System Handlers
    void Start () {
        Init();
    }

其中lastnum代表用户正在输入的整数,num数组记录已经输入完成的整数,calculate记录输入的算符(+-*/=)。items指向当前输入的位置(因为只有加减乘除符号和等于号,可以认为是整数和算符交替输入)。button是计算器按钮的文本,Text是计算器显示算式和运算结果的的文本。flush是一个标记,代表当前算式已经结束(输入了等于号),在下次输入时刷新计算器。

视图部分:

void OnGUI() {
        GUIStyle fontStyle = new GUIStyle();
        fontStyle.fontSize = 40;
        fontStyle.wordWrap = true;
        GUIStyle buttonStyle = new GUIStyle(GUI.skin.button);
        buttonStyle.border = new RectOffset(10, 10, 10, 10);
        buttonStyle.normal.textColor = Color.black;
        buttonStyle.fontSize = 40;
        GUI.Box(new Rect(210, 10, 600, 600), "");
        GUI.Box(new Rect(210, 10, 600, 100), Text, fontStyle);
        for (int i=0;i<4; i++)
        {
            for (int j = 0; j < 4; j++)
            {
                if (button[i * 4 + j] != "=")
                {
                    if (GUI.Button(new Rect(220 + 140 * j, 110 + 120 * i, 140, 120), button[i * 4 + j], buttonStyle))
                    {
                        updateBoard(i, j);
                    }
                }
                else if (j == 2)
                    continue;
                else
                {   
                    if (GUI.Button(new Rect(220 + 140 * j, 110 + 120 * i, 280, 120), button[i * 4 + j], buttonStyle))
                    {
                        updateBoard(i, j);
                    }
                }
            }
        }
    }

使用GUI.Button可以绘制一个按钮,如果用户点击了该按钮就会返回1,通过if语句就可以判断用户是否点击了该按钮。如果用户点击了按钮,就调用控制器部分的updateBoard函数对计算器进行更新。

控制器部分:

void Init() {
        lastnum = 0;
        items = 0;
        calculate[0] = '+';
    }

    void updateBoard(int i,int j) {
        if (flush == true)//刷新计算器
        {
            flush = false;
            items = 0;
            lastnum = 0;
            Text = "";
        }
        Text += button[i * 4 + j][0];//更新文本
        if (i<3 && j < 3)//输入1到9
        {
            lastnum *= 10;
            lastnum += i * 3 + j + 1;
        }else if(button[i * 4 + j][0] == '0')//输入0
        {
            lastnum *= 10;
        }
        else//输入运算符或等于号
        {
            num[items] = lastnum;//当前运算符对应的被操作数
            items++;
            calculate[items] = button[i * 4 + j][0];//将运算符记录到数组calculate
            lastnum = 0;
            if (button[i * 4 + j][0] == '=')//点击的是等于号
            {
                float ans = 0;
                float cur;
                float Symbol;
                for (int k = 0; k < items; )//遍历算式所有项
                {
                    if (calculate[k] == '+')//判断当前项的符号
                    {
                        Symbol = 1;
                    }
                    else
                    {
                        Symbol = -1;
                    }
                    cur = Symbol * num[k];
                    k++;
                    while (k<items)//计算当前项的值
                    {
                        if (calculate[k] == '*')
                        {
                            cur = cur * num[k];
                        }
                        else if (calculate[k] == '/')
                        {
                            cur = cur / num[k];
                        }
                        else//到了下一个加号或减号,当前项结束
                        {
                            break;
                        }
                        k++;
                    }
                    ans += cur;//将当前项的值加到结果中
                }
                Text+=ans.ToString();//将结果加到显示文本后面
                flush = true;//下次点击按钮就要刷新计算器
            }
        }
    }

        updateBoard的参数是按钮的坐标,经过简单计算可以得到相应的button数组的索引,从而获取按钮的文本。根据文本类型的不同,执行相应操作。如果是数字,则更新lastnum;如果是算符,则将lastnum和算符分别添加到num和calculate;如果是等于号,则计算出算式的结果,添加到待显示的文本中,并标记flush使得用户的下次操作会刷新计算器。

        效果图:

代码链接:作业3.cs · 许永佳/unity游戏开发学习 - 码云 - 开源中国 (gitee.com)​​​​​​​​​​​​

运行视频:unity使用cs脚本实现简易计算器(低技术力)_哔哩哔哩_bilibili 

猜你喜欢

转载自blog.csdn.net/weixin_66458735/article/details/133660524
今日推荐