gmod吧 关注:88,429贴子:1,903,298

[wire-E2]E2基础教程——语法篇

只看楼主收藏回复

前言:
对于接触过编程的玩家,E2的语法是相对简单的,类似于简化的C语言,所以学起来是非常快的。对于没接触过编程的玩家,刚接触的时候会感觉无从下手,但只要仔细琢磨,很快就能理解。因为内容简单,很适合用来启蒙编程思想,对未来接触编程专业有一定帮助。
我尽量从编程最基础的知识点讲起,希望能让没编过程的玩家掌握编程的基本思想。对于早已接触过编程的人,可以选择跳过本篇很多部分的内容。我会在每节进行注释表示哪些是必看的,哪些是选看的。
希望能在此帮到各玩家,并且将E2发扬光大。
下面的内容我以教科书为参考,自己就自己的经验来写教程,如果有更好的想法或者发现我的问题,请尽快与我联系。
编程(选读)
计算机的程序说到底就是一系列数学计算的结果,通过不同类型的数据的不同操作计算得到需要的结果并输出,便是一个程序的基本运行方式。构成程序的基本单位是函数,函数就是一个计算过程,输入数据,输出计算结果。通过很多不同的函数实现某些功能,这便是一个程序。
(一)数据类型和表达式(必读,与C语言大致相同)
1、基本字符和标识符
E2的基本字符包括:字母、数字、空白符、标点和特殊字符。
字母:小写字母a~z共26个,大写字母A~Z共26个。
数字:0~9共10个。
空白符:空格符、水平制表符和换行符统称为空白符。空白符只在字符常量和字符串常量中起作用,在其他地方出现时只起间隔作用。在程序中适当添加空白符,提高程序清晰性和可读性。
标点和特殊字符:主要有, “” ‘’ ! | & ^ $ % / * - + < > { } ( ) [ ] #等。
2、关键字
E2的关键字都为小写,具有严格的定义。
数据类型关键字:
number(数字),string(字符串),entity(实体),vector(三维向量),vector2(二维向量),vector4(颜色),angle(角度),array(数组),table(表),wirelink(数据线),ranger(测距器),bone(骨头)。
还有Matrix(矩阵)和Complex number(复数)还有Quaternion(四元数)这三个我也没用过,新手就不提了,希望有大佬来补充这三个
流程控制关键字
跳转结构:return,continue,break
分支结构:if,else,switch,case,default
循环语句:for,while
3、标识符
E2的标识符全部由大写字母开头,后面只能接英文字母,下划线及数字组成。
(二)常量和变量(必读)
1、常量没什么好说的,最多说一个字符串要用英语双引号包起来。
2、变量
通俗的讲,变量就是程序运行过程中其值发生变化的量。
变量的定义方式有两种 全局变量 和 局部变量
全局变量通过代码开头的@persist来定义
在@persist后面写上全局变量的变量名和数据类型来定义
定义格式 变量1:数据类型 变量2:数据类型 变量3:数据类型 中间由空格隔开
多个变量是同一数据类型也可以这样 [变量1 变量2 变量3]:数据类型
注意 变量名就是前面的标识符
变量名全部由大写字母开头,后面只能接英文字母,下划线及数字组成。
所以完全的写法就是
@persist 变量1:数据类型 变量2:数据类型 [变量3 变量4 变量5]:数据类型
@persistX:number E:entity [A_1 A_2]:angle
局部变量就很方便了 随便给它赋值就行了
如 A=123 A就会自动变成数字类型 一旦 定义后数据类型不能再改变
但局部变量有其作用域
一旦程序用不到A后 A便消失
故局部变量是一次性的 程序运行一次后,其内部数据就消失了
(三)数据类型(必读)
1、number(数字):单纯的数字,用于计算,不区分是整数还是小数,数据大小极限我不清楚,但一般情况都够用。
2、vector(三维向量):内容包括x y z三个轴的数据,常用于储存坐标数据。也用来表示颜色。用vec(x,y,z)来生成一个三维向量常量。对于颜色,x y z分别对应RGB色彩模式的R G B 三个值。
3、vactor2(二维向量):比前者少一个z轴数据。
4、vector4(颜色):比vector的颜色多了一个值来表示透明度。
5、entity(实体):用于储存游戏内的实体信息,作为实体操作的接口。
6、angle(角度):内容包括pitch yaw roll 三个轴的数据 用angn(n,n,n)表示角度常量。
7、string(字符串):用于储存字符串数据,用双引号表示字符串常量,如”abcd”
8、array(数组):用于储存数据组,通过 数组名[位置编号,数据类型]来进行对数组内单个元素的读取和赋值
9、table(表):和数组大同小异,可以用字符串来给内部元素命名
10、ranger(测距器):这个以后再开另一个帖子讲
11、bone(骨头):同上
12、wirelink(数据线):同上
还有Matrix(矩阵)和Complex number(复数)还有Quaternion(四元数)这三个我也没用过,新手就不提了,希望有大佬来补充这三个
由于E2没有内存操作,故不用在意数据类型的储存空间大小。
(四)算数运算和算数表达式
算数是程序的运行基础
编程的算数有三种分别是数据计算、关系运算和逻辑计算
数据计算
基本的计算有 +、-、*(乘)、/(除)、%(取余)
加减乘除不说了 关键是取余
取余得到的是除法的剩余数
如 9除2等于4余1
1便是取余得到的结果,故9%2=1
注意 取余只能用在整数上
我们还需了解赋值这个概念
我们定义的变量默认值都是0,什么也没有,我们需要不断的进行计算和赋值来输入计算数据和储存计算结果
如定义数字变量A B C
A=2 这样就是给A赋了一个2的值
B=3 这样就是给B赋了一个3的值
C=A+B 那么很C便是A和B的和也就是5 ,C被赋值5。
关系运算
常用的逻辑计算有 ==(等于),<(小于),>(大于),<=(小于等于)、>=(大于等于)、!=(不等于)
比较两者的关系 输出1或0,1代表真,0代表假
如 1<2 输出的是1 这是对的是“真”的
又如 1==2 输出的是0 这是错的是“假”的
逻辑运算
程序是有逻辑性的,通过比较和判断,得到相应的操作。
这便要用到逻辑计算
逻辑运算包括三个:&(与)、|(或)、!(非)
与或非 三个逻辑运算的关系用真值表表示便是
(1真、0假)
*逻辑运算里面非0的值都代表真 只有0代表假
我这里就粗略讲讲,详细内容请自行百度。
4、算数表达式
我们都只知道,当计算式子很长时,我们要注意计算的先后顺序
先乘除取余,后加减,再赋值
这种顺序被称为优先级
优先级高的先计算,优先级相同的从左到右计算
相信上过小学的都知道一条算式要怎么写怎么算
在这里我就不细说了,单纯举几个例子看看就能懂
(1+2)*3/5的结果为1.8
(4*5*6)%7的结果为1
((5*20)==100)的结果为1
(1+3>2+2)的结果为0
(((5*20)==100)&(1+3>2+2))的结果为0
A=5B=10 C=(A<B) C的值为1
5、条件运算符
条件运算符我基本不用,但是用起来很方便。
例子如下
条件表达式 ? : N
如果表达式的值为真(非零)则输出1
如果表达式的值为假(零)则输出N

(1<2 ? : 5)结果为1
? : 5)结果为5
6、其他运算符
我这边先不讲 以后有机会再说 分别是~ $


IP属地:浙江1楼2018-07-09 17:38回复
    接下来几天断续更新 进度应该不会特别慢 有人期待一下吗


    IP属地:浙江2楼2018-07-09 17:39
    回复

      补上面逻辑运算符的真值表


      IP属地:浙江3楼2018-07-09 17:41
      回复
        支持


        IP属地:广东来自iPhone客户端4楼2018-07-09 17:42
        回复
          上面有排版的小问题
          = = 将就看看吧


          IP属地:浙江5楼2018-07-09 17:43
          回复
            支持下


            IP属地:山东6楼2018-07-09 17:50
            回复
              (五)程序控制结构
              程序控制结构分为,顺序结构、选择结构、循环结构,各有各的用处,在此我就简单地教学其格式
              1、顺序结构
              顺序结构就是从前往后依次进行的语句的运行方式

              A=1
              B=2
              C=A+B
              2、选择结构
              (1)if语句
              if语句用于程序中对不同的结果进行不同的操作
              语句格式为:
              单分支选择
              if(表达式)
              {
              语句
              }
              当表达式的值为真时,执行花括号内的语句
              双分枝选择
              if(表达式)
              {
              语句1
              }
              else
              {
              语句2
              }
              当表达式的值为真时,执行花括号内的语句1
              否则执行花括号内的语句2
              在if语句内嵌套if语句 实现多分支选择
              if(表达式)
              {
              if(表达式)
              {
              语句1
              }
              else
              {
              语句2
              }
              }
              else
              {
              语句3
              }
              注意 这边不管语句有多少条,都要用花括号括起来,并不能像C语言一样忽略花括号
              其他的语句也一样,有用花括号的便一定要用花括号
              (2)switch语句
              当分支较多时用if语句便过于麻烦,用switch语句能更好解决问题
              switch(N)
              {
              case常量表达式1,语句 break
              case常量表达式2,语句 break
              case常量表达式3,语句 break
              ……
              case常量表达式n,语句 break
              default,语句break
              }
              当N的值与某个常量表达式的值相同时,就会执行其后面的语句。若没有一个值是相等的时候,执行default后的语句。
              Switch语句也能和if语句一样进行嵌套
              循环结构
              当需要进行多次重复运行某语句的时候 就会用到循环结构
              如计算1+2+3+4+5+6+……+n因为n是不确定的,不用顺序结构进行计算,用循环结构会方便很多
              (1)for循环
              for(变量名=初值,结束值,间隔)
              {
              }
              例:
              A=0
              for(I=10,1,-1)
              {
              A=A+I
              }
              这相当于
              A=10+9+8+7+6+5+43+2+1
              初值和结束值是必须的,变量可以在循环的时候进行使用,但最后不要尝试改变它的值。结束值在循环开始时便确定了,在循环中通无法改变。间隔可以不填,不填默认为1。
              (2)while循环
              for循环是有规定循环次数的循环,当不清楚需要循环几次时,应当用while循环。
              while(表达式)
              {
              }
              当表达式内的值为真(非0)时 就执行循环,直到值为假(0)才结束循环

              N=1
              K=0
              while(N<=10)
              {
              K=K+N
              N=N+1
              }
              相当于K=1+2+3+4+5+6+7+8+9+10
              当N=11时 就退出循环
              跳出循环语句
              break和continue语句是用于在循环的时候跳出循环用的
              break语句一旦在循环中执行,直接跳出循环,不再执行循环内的任何内容,开始执行循环之后的语句。
              continue语句和break语句不同,它用于跳出当前次循环,跳出后继续执行下一次循环。

              N=1
              K=0w
              while(N<=10)
              {
              If(N==3)
              {N=N+1 break}
              K=K+N
              N=N+1
              }
              那么其实际相当于K=1+2
              当N=3时,if语句条件达成,执行break,跳出循环不再执行循环内任何语句

              N=1
              K=0
              while(N<=10)
              {
              If(N==3)
              {N=N+1continue}
              K=K+N
              N=N+1
              }
              相当于K=1+2+4+5+6+7+8+9+10
              只有N=3的时候被跳过,其他时候依旧执行


              IP属地:浙江7楼2018-07-09 18:19
              回复(3)
                支持大佬


                IP属地:江苏10楼2018-07-09 19:08
                回复
                  有意思,就是我太懒了


                  IP属地:内蒙古来自Android客户端11楼2018-07-09 22:47
                  回复
                    以上差不多就是E2的全部基础语法了。
                    接下来我会陆续写一些程序实例来帮助玩家学习和理解


                    IP属地:浙江13楼2018-07-10 07:18
                    回复
                      实例1 鸡兔同笼问题:
                      有若干只鸡兔同在一个笼子里,从上面数,有35个头,从下面数,有94只脚。问笼中各有多少只鸡和兔?
                      代码:
                      Head=35 35个头
                      Foot=94 94只脚
                      Rabbit=(Foot-Head*2)/2 计算兔子的数量
                      Chicken=(94-Rabbit*4)/2 计算鸡的数量
                      print("A total of"+Chicken+" chickens, a total of "+Rabbit+" rabbits") 在聊天框输出结果


                      运行结果:共23只鸡和12只兔子


                      IP属地:浙江14楼2018-07-10 07:24
                      回复(1)
                        实例2 乘法表
                        利用循环输出一张乘法表
                        代码:
                        for(I=1,9)
                        {
                        S=""
                        for(J=1,I)
                        {
                        S=S+I+" * "+J+" = "+I*J+" "
                        }
                        print(S)
                        }


                        这里使用了循环的嵌套,E2有计算限制,不能循环太多次。


                        IP属地:浙江15楼2018-07-10 07:43
                        回复
                          实例3 单双数分离求和
                          求0~100中所有 单数和 和 双数和
                          代码:
                          N=0
                          S=0 存单数和
                          D=0 存双数和
                          while(N<=100)
                          {
                          if(N%2) 取余2 能被2整除的输出0,判断为双数 不能被2整除的余1输出1(非零),判断为单数
                          {
                          S=S+N
                          }
                          else
                          {
                          D=D+N
                          }
                          N=N+1
                          }
                          print(S+" "+D)
                          结果:单数和为2500 双数和为2550


                          IP属地:浙江16楼2018-07-10 11:29
                          回复
                            飞机素材(捂嘴)


                            21楼2018-07-10 15:10
                            收起回复
                              日常顶一下


                              IP属地:浙江23楼2018-07-12 11:29
                              回复