MVC(Model-View-Controller)是一种软件设计模式,用于将应用程序的逻辑分离成三个主要组件:模型(Model),视图(View)和控制器(Controller)。这种分离有助于提高代码的可维护性、可扩展性和重用性。
下面是每个组件的简要说明:
模型(Model):模型表示应用程序的数据和业务逻辑。它负责处理数据的获取、存储、验证和处理。模型组件通常包含与数据相关的方法、类和数据结构。
视图(View):视图负责向用户显示数据和信息。它们呈现模型中的数据以供用户查看,并且通常是模型的可视化表示。视图不包含业务逻辑,其主要职责是在用户界面上呈现信息并接收用户输入。
控制器(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
updateBoard的参数是按钮的坐标,经过简单计算可以得到相应的button数组的索引,从而获取按钮的文本。根据文本类型的不同,执行相应操作。如果是数字,则更新lastnum;如果是算符,则将lastnum和算符分别添加到num和calculate;如果是等于号,则计算出算式的结果,添加到待显示的文本中,并标记flush使得用户的下次操作会刷新计算器。
效果图:
代码链接:作业3.cs · 许永佳/unity游戏开发学习 - 码云 - 开源中国 (gitee.com)
运行视频:unity使用cs脚本实现简易计算器(低技术力)_哔哩哔哩_bilibili