Unity编程之简易计算机

这篇具有很好参考价值的文章主要介绍了Unity编程之简易计算机。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Unity编程之简易计算机

效果如下

Unity编程之简易计算机







实现计算器的主要思路:

将(点击按键)输入的式子存储起来并计算



计算式子

输入:式子的字符串

输出:计算结果


这是一个经典的队列数据结构应用的问题,具体的解法无需赘述(网络上有很多资源)

核心思想:用两个队列分别维护数字和运算符,对于不同优先级的运算符进行不同的出对入队操作直至队列为空


具体代码:
double Cal(string str){
    Stack<char> s = new Stack <char>();
    Stack<double> num = new Stack <double>();
    double a, b;
    char ch;
    for(int i = 0 ; i < str.Length; i++){
        if(str[i] >= '0' && str[i] <= '9'){
            a = 0;
            while(str[i] >= '0' && str[i] <= '9'){
                a = a*10+(str[i]-'0');
                i++;
            }
            if(str[i] == '.'){
                i++;
                double pow = 0.1;
                while(str[i] >= '0' && str[i] <= '9'){
                    a = a+ pow*(str[i]-'0');
                    pow*=0.1;
                    i++;
                }
            }
            i--;
            num.Push(a);
        }

        else if(str[i] == '*'){
            b = 0;
            i++;
            while(str[i] >= '0' && str[i] <= '9'){
                b = b*10+(str[i]-'0');
                i++;
            }
            i--;
            a = num.Pop();
            a *= b;
            num.Push(a);
        }

        else if(str[i] == '/'){
            b = 0;
            i++;
            while(str[i] >= '0' && str[i] <= '9'){
                b = b*10+(str[i]-'0');
                i++;
            }
            i--;
            a = num.Pop();
            a /= b;
            num.Push(a);
        }

        else if(str[i] == '+' || str[i] == '-'){
            if(s.Count > 0){
                ch = s.Pop();
                a = num.Pop();
                b = num.Pop();
                
                if(ch == '+'){
                    a += b;
                }
                else{
                    a = b-a;
                }
                num.Push(a);
            }
            s.Push(str[i]);
        }
    }
    while(s.Count > 0){
        ch = s.Pop();
        a = num.Pop();
        b = num.Pop();
        
        if(ch == '+'){
            a += b;
        }
        else{
            a = b-a;
        }
        num.Push(a);
    }

    return num.Peek();
}



利用IMGUI控件画计算器

主要利用IMGUI中的几种控件:

  1. GUI.Label

    GUI.Label (new Rect (85, 20, 100, 30), "简易计算器");
    
  2. GUI.Box

    GUI.Box(new Rect(180, 15, 260, 285), " ");
    
  3. GUI.TextField

    string text = GUI.TextField(new Rect(210, 30, 200, 40), " ");
    


如何画出计算器:用一个二维数组存储计算机各个位置的数字或运算符:

private char[, ] num = new char[4, 4]{
    {'7', '8', '9', '/'},
    {'4', '5', '6', '*'},
    {'1', '2', '3', '-'},
    {'0', '.', '=', '+'}
};


通过for循环画出每一个Button并绑定相应事件

  1. =:调用 Cal 函数计算输入的式子。
  2. 非=:存储按钮对应的元素。

具体代码:文章来源地址https://www.toymoban.com/news/detail-429303.html

void OnGUI(){
    GUI.Label (new Rect (85, 20, 100, 30), "简易计算器");
    GUI.Box(new Rect(180, 15, 260, 285), " ");
    string text = GUI.TextField(new Rect(210, 30, 200, 40), " ");
    
    for(int i = 0; i < 4; i++){
        for(int j = 0; j < 4; j++){
            // int num = 9-(3*j+i+1);
            if (GUI.Button (new Rect (210 + i * 50, 80 + j * 50, 50, 50), num[j,i].ToString())) 
            {
                
                GUI.Label (new Rect (25, 25, 100, 30), num[j,i].ToString());
                str += num[j,i];
                str1 = str;
                if(num[j,i] == '='){
                    Debug.Log(str);

                    if(str.Length > 1){
                        Debug.Log(Cal(str));
                        a = Cal(str);
                    }
                    str1 = a.ToString();
                    str = "";
                }
            }
        }
    }
    string text1 = GUI.TextField(new Rect(210, 30, 200, 40), str1);
}



完整代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Game : MonoBehaviour
{
    string str = "";
    string str1 = "";
    double a;
    // Start is called before the first frame update

    private char[, ] num = new char[4, 4]{
        {'7', '8', '9', '/'},
        {'4', '5', '6', '*'},
        {'1', '2', '3', '-'},
        {'0', '.', '=', '+'}
        };


    void Start()
    {
        // Init();
        // OnGUI();
    }

    // Update is called once per frame
    void Update()
    {
        
    }

    void OnGUI(){
        GUI.Label (new Rect (85, 20, 100, 30), "简易计算器");
        GUI.Box(new Rect(180, 15, 260, 285), " ");
        string text = GUI.TextField(new Rect(210, 30, 200, 40), " ");
        
        for(int i = 0; i < 4; i++){
            for(int j = 0; j < 4; j++){
                // int num = 9-(3*j+i+1);
                if (GUI.Button (new Rect (210 + i * 50, 80 + j * 50, 50, 50), num[j,i].ToString())) 
                {
                    
                    GUI.Label (new Rect (25, 25, 100, 30), num[j,i].ToString());
                    str += num[j,i];
                    str1 = str;
                    if(num[j,i] == '='){
                        Debug.Log(str);

                        if(str.Length > 1){
                            Debug.Log(Cal(str));
                            a = Cal(str);
                        }
                        str1 = a.ToString();
                        str = "";
                    }
                }
            }
        }
        string text1 = GUI.TextField(new Rect(210, 30, 200, 40), str1);
    }

    double Cal(string str){
        Stack<char> s = new Stack <char>();
        Stack<double> num = new Stack <double>();
        double a, b;
		char ch;
        for(int i = 0 ; i < str.Length; i++){
            if(str[i] >= '0' && str[i] <= '9'){
                a = 0;
                while(str[i] >= '0' && str[i] <= '9'){
					a = a*10+(str[i]-'0');
					i++;
				}
                if(str[i] == '.'){
                    i++;
                    double pow = 0.1;
                    while(str[i] >= '0' && str[i] <= '9'){
					    a = a+ pow*(str[i]-'0');
                        pow*=0.1;
					    i++;
				    }
                }
				i--;
				num.Push(a);
            }

            else if(str[i] == '*'){
				b = 0;
				i++;
				while(str[i] >= '0' && str[i] <= '9'){
					b = b*10+(str[i]-'0');
					i++;
				}
				i--;
				a = num.Pop();
				a *= b;
				num.Push(a);
			}

            else if(str[i] == '/'){
				b = 0;
				i++;
				while(str[i] >= '0' && str[i] <= '9'){
					b = b*10+(str[i]-'0');
					i++;
				}
				i--;
				a = num.Pop();
				a /= b;
				num.Push(a);
			}

            else if(str[i] == '+' || str[i] == '-'){
				if(s.Count > 0){
					ch = s.Pop();
					a = num.Pop();
					b = num.Pop();
					
					if(ch == '+'){
						a += b;
					}
					else{
						a = b-a;
					}
					num.Push(a);
				}
				s.Push(str[i]);
			}
        }
        while(s.Count > 0){
			ch = s.Pop();
			a = num.Pop();
			b = num.Pop();
			
			if(ch == '+'){
				a += b;
			}
			else{
				a = b-a;
			}
			num.Push(a);
		}

        return num.Peek();
    }
    
}


代码已上传到gitee仓库中 https://gitee.com/lian-zhilu/3d_assignment

到了这里,关于Unity编程之简易计算机的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 51单片机实现简易计算机,Keil4代码Proteus工程一步到位

    目录  前言  Proteus硬件部分 键盘 程序部分 运算代码逻辑(代码解释) LCD屏幕显示运算结果 输入部分 键值判断部分 删除按键的实现 程序执行运算 Hello,大家好。想做关于嵌入式的一些小项目已经很久了,今天借着我们课设的机会,给大家展示我自己对代码逻辑的理解,为了方

    2024年02月08日
    浏览(45)
  • 计算机网络编程

    说起网络,相信大家都不陌生,把分散在不同地点的计算机设备,通过传输介质、通信设施和网络通信协议,实现资源共享和信息传输的系统,我们称之为: 计算机网络系统 。 计算机网络的最简单的定义是:一些 互 相 连 接的、 自治 的计算机的 集合 。 互连:是指计算机

    2024年01月21日
    浏览(54)
  • 想学计算机编程从什么学起?零基础如何自学计算机编程?中文编程开发语言工具箱之渐变标签组构件

    想学计算机编程从什么学起?零基础如何自学计算机编程? 给大家分享一款中文编程工具,零基础轻松学编程,不需英语基础,编程工具可下载。 这款工具不但可以连接部分硬件,而且可以开发大型的软件,向如图这个实例就是用这个工具开发的。 它的编程工具箱非常的丰

    2024年02月05日
    浏览(74)
  • 树莓派计算机视觉编程:1~5

    原文:Raspberry Pi Computer Vision Programming 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 计算机视觉 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 当别人说你没有底线的时候,你最好真的没有;当别人说你做过某些事的时候,你也最好真的做过。 OpenCV 是用于计算

    2024年02月13日
    浏览(39)
  • 计算机网络编程——UDP详解

    UDP(User Datagram Protocol)是一种在网络通信中使用的传输层协议。与TCP(Transmission Control Protocol)相比,UDP是一种无连接的协议,这意味着它不像TCP那样在通信的开始和结束时需要建立和终止连接。   无连接性: UDP是无连接的协议,这意味着通信的双方不需要在通信之前建立

    2024年02月05日
    浏览(47)
  • 学电脑编程零基础,计算机编程入门先学什么

    学电脑编程零基础,计算机编程入门先学什么,建议先从容易学习的语言入手,比如中文编程。 给大家分享一款中文编程工具,零基础轻松学编程,不需英语基础,编程工具可下载。 这款工具不但可以连接部分硬件,而且可以开发大型的软件,向如图这个实例就是用这个工

    2024年02月06日
    浏览(43)
  • 《OpenCV 计算机视觉编程攻略》学习笔记(一:图像编程入门)

    参考引用 OpenCV 计算机视觉编程攻略(第3版) 说明 本书结合 C++ 和 OpenCV 3.2 全面讲解计算机视觉编程 所有代码均在 Ubuntu 系统中用 g++ 编译执行 0. 安装 OpenCV 库 在Ubuntu上安装OpenCV及使用 OpenCV 库分为多个模块 ,常见模块如下 opencv_core 模块包含库的核心功能 opencv_imgproc 模块包

    2024年02月09日
    浏览(52)
  • 计算机是如何工作的??(多进程编程)

    本篇博客的重点知识是 进程+进程的调度 操作系统:像是windows,android,iOS等都是常见的操作系统 下面是关于计算机在底层工作的原理流程图 在操作系统层面: 对上,要给软件提供稳定的运行环境。 对下,要管理好各种硬件设备(如鼠标,键盘等)。 操作系统本身就是一个

    2024年02月06日
    浏览(41)
  • 编程小白如何以计算机的方式去思考

    从上大学第一天开始接触编程,老师便给我们讲过各式各样的算法。从各种查找、排序,到递归、贪心等算法,大一的时候一直在和这些算法搏斗。直到工作后,为了应付面试,仍不得不回过头去啃算法书或者去刷一些算法习题,才能够拾回一些上学时的记忆。为什么算法就

    2024年02月10日
    浏览(57)
  • 【文末送书】计算机网络编程 | epoll详解

    欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C++、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。关注公粽号 《机器和智能》 回复 “python项目

    2024年02月08日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包