铁血丹心

 找回密码
 我要成为铁血侠客
搜索
查看: 1745|回复: 12

(11.12)由C入LUA,比较不靠谱的语法基础教程。

  [复制链接]
发表于 2012-11-11 01:58 | 显示全部楼层 |阅读模式

马上注册,结交更多侠友!

您需要 登录 才可以下载或查看,没有账号?我要成为铁血侠客

x
本帖最后由 姚麦 于 2012-11-12 22:45 编辑

  #这篇教程的主旨不是让你学过了,就可以去DIY了,更不是主讲DIY,我甚至可以说这个帖子和DIY仅有很小的关联,那为神马需要这个帖子的存在?在你看过DIY教程后,你是否只是知道怎么去改极易,特效的几率,而不知道是怎样实行成功,背后原理。对头,我的目的就是如此,让大家除了会DIY,还要懂DIY。当然了,如果你不需要,认为没必要,自然不用看。

  另外,本教程也不会完整的讲C,只是讲一些浅显,常用的,跟DIY,LUA能联系到一起常用的语法。事实上,你想掌握C,光看我这一个教程没有用,那是需要大量的信息,实战,书籍去攻克的。

为神马要写这么一贴教程?

呃,好吧,刚才翻了翻DIY教程贴,各位大侠们写的都很实用,也很贴切,只是关于基础的东西都是写的懵懵懂懂,一笔带过,新人们上手是可以很快,可对于基础知识的缺乏,是很难避免犯错的。

于是,LZ在这里自以为是的写一点语法知识,那么,先开始好了。

  众所周知,LUA是基于C衍生的脚本语言。

虽说LUA在语法上的一些应用有区别于C,但是大部分的思想,以及结构,都是与C一脉相承的。

例如变量,常量,分支语句,顺序结构,数组,函数等等,如果你想做好DIY,C的基础不用多学,包括C的真正精华指针都不用学,只学会这些基础的语法,然后看一些LUA与C的具体区别,然后,你就可以开动了。

今天先讲变量与常量的区别。

我先拿一段C的程序来举例子,再讲与LUA的区别。

#include<stdio.h>      /*程序开始,头文件调用stdio.h,也就是标准输出输出库,这个我们以后讲,现在不必深究*/

  int main ()     /*声明主函数为空函数*/

  {
      int a,b,c;     /*定义三个变量a,b,c*/
      a=1;           /*给a赋值为1*/
      b=2;           /*给b赋值为2*/
      c=a+b;      /*c是a和c的和*/
      printf("a和b的和是%d",c);       /*调用stdio.h文件中的printf,也就是输出函数*/
      return 0;
  }

  这就是一段完整的小程序了,他用来做什么呢?

  也许没什么实用性,他仅仅是算出A+B的和,一道最简单的加法算数程序。

  那么里面都包含了一些什么东西呢?我们逐步来讲。

  #include<stdio.h>  这段是关于库函数调用,这个比较深,暂且不必管,以后会讲到,眼前我们只需要知道,C的程序开头,凡是你想要在程序当中让用户看到一段字符,或者是打入一段字符,必须要用#include<stdio.h> 做开头,大部分程序也都是用#include<stdio.h> 做开头,除却一些不需要输出输入的小单片机产品。

  int main ()     /*声明主函数为空函数*/这段是每一个程序都需要的,我们可以暂且这样理解程序,程序是由一个接一个不同公  用的函数组成,每个函数实行不同的功能,他们之间也许有交叉,也许没交叉。程序里可以有许多函数,也可以一个函数都没有,但惟独必须有的,就是这段主函数。

  补充内容 int main后面跟了一对括号(),为神马需要这段括号呢?因为每个函数都需要函数参数,函数过程中最后会产生一个值,也就是函数返回值,这个暂时大家不用学习,了解下就可以,至于()里面什么都没有,就是证明这段函数是空函数,不接受任何返回值,实际上,我们空函数还有一种表达方式,int main(void),void是空的意思,也就是说没有函数参数,不接受返回值,不过在日常程序当中,这句void可以直接省略,日后讲到函数,会陆续讲函数参数,大家不要着急。 补充结束

  举一个例子,一套完整的程序是一颗大树,那么函数就是他的分叉树枝,那谁是他的树杆呢?就是主函数,主函数就像人体的大脑,没有大脑,我们有再好的计划,也无法实施。

  如果你还不懂的话,没关系,我们暂且跳过,只需要知道,程序当中必须要有主函数既可。

  接下来是一段
  {
      int a,b,c;     /*定义三个变量a,b,c*/
      a=1;           /*给a赋值为1*/
      b=2;           /*给b赋值为2*/
      c=a+b;      /*给ab相加的和赋值给c*/
      printf("a和b的和是%d",c);       /*调用stdio.h文件中的printf,也就是输出函数*/
      return 0;
  }
  这段话也就是主函数的内容,你可能注意到了,内容在开始前后,有{}这样的两个字符,他代表着一段程序的开始与结尾(有时复合语句也用{}花括号包起来,不过暂时不用管),而在LUA里,也就是我们的DIY,函数的内容开始结尾不再用{}来表示,而是DO,END,这个大家可以去注意一下。

  接下来,iint a,b,c;     /*定义三个变量a,b,c*/,是什么意思呢?int是声明的意思,每次你想用一个变量,并不是可以随意创造的,你必须先声明他,通知你的编译器和程序,这有一个变量,变量的数值不能固定,所以变量要有一个名字,好让你去找到他,分辨他。这里的a,b,c就是三个变量的名字。

  int a,b,c;的意思也就是说定义,通知程序这里有名字叫做,a,b,c的三个变量。

  接下来,既然程序已经知道有a,b,c三个变量了,但是要这三个变量有什么用呢?可以这样说,程序就是算法,算法就是各种数学加减乘数,我们用数学来解决各种问题。

  这个程序的作用就是要这个程序去计算,两个数值相加起来会有多少。下面,就需要赋值了,赋值,给变量一个值,他们才能计算,所以后面就引发出了,a=1;b=2;c=a+b;这段。

  请记住,赋值也就是=,和我们平常说的“等于”绝不相同,赋值大概的意思是说,给这个变量一个值,但是并不固定,所以叫做赋值,C也好,LUA也好,真正的“等于”,也就是我们日常的=,实际上的表达符号是==,这个我们以后再讲,现在只是要分清楚就好,不要在DIY的过程当中犯下等于和赋值的概念错误。

   printf("a和b的和是%d",c); 这一段函数说的是要让在程序向屏幕输出一段字符,实际上,运行此程序后,程序输出的字符该是:a和b的和是3。

  补充内容 因为LZ现在手里的电脑没安装编译器,所以不给大家示范了,有兴趣的可以下载一个VC++编译器自己运行下程序试试。“""”里的内容是实际上要输出的,而后面的%d是格式控制符,是代表和变量的类型相对应,%d代表着十进制整形数(就是我们正常说的数字,1,2,3,4等),%d要覆盖的内容则是""号外面的那个C,所以输出的并不是%d,而是变量c的值。 C的数据类型是日后的内容。

  return 0;这句就要联合我们上面讲的函数返回值,大家已经知道了,函数是需要返回值的,那么这个值要怎么返回?就要通过return这个关键字,你想返回哪个值,就在return 后面写上,这个的具体细节也要留到函数里讲,大家暂时写小程序的时候,只暂时记得用return 0;就好。

  有一点要注意的,C的每一个语句结束时都要加上;,而lua则不用。


补充结束

  各位大侠总是在教程里说着变量,大家可能觉得很高深,事实上变量是程序源码当中最常见的,为神马他不叫定量,不叫量,非得叫变量呢?

  因为变量并不是固定的数值,他是可以随之改变的,至于变量的定义,在至今的标准C当中都没有过,不过为了大家,我可以勉强解释一下什么是变量。

  变量是暂时储存在内存当中的一段数值,他有可能会随着其他变量数值的改变而改变,就好比说,a+b的和是3,那么c的值暂时是3,如果a和b的值变化了呢?变量C就不再是3了。

  所以说,变量,常量,等于,赋值,这几个概念,一定要弄清楚。

  (未完待续,明天继续)

  今天更新主要讲常量,运算符还有补充一下上次讲的不到位的知识点,上次没讲好的,我会在上面补充,请从新阅读下上面的段落,下面的内容是完全的新东西,等教程完成一定规模后,我会重新整理分贴,让大家有个好的阅读体验。

  这段程序开始前,我先不写注释,大家尽量先自己思考下,思考不出来再往下看,下面会有详尽的解释,不过我希望大家最好能自己先思考一下,这样有助于你的学习习惯。

  #include <stdio.h>
  #define MI 2

  int main()

  {
     printf("%d的二次幂为%d",MI,MI*MI);
     return 0;
  }
  
  这段的程序是做什么的呢?好吧,如果你没猜到的话,我会告诉你,这是一段计算幂的程序。

  相比之前的例题,我们这里少了一段赋值语句,多了一句不知所谓的#define MI 2。

  为神马呢?因为今天的主题是常量,所以,我们暂且把变量扔到一边,来用常量。

  神马是常量呢?常量顾名思义,就是经常,固定,不改变的量。那常量要如何定义呢?其实常量有几种定义方式,不过我们现在只挑最简单,最好理解的来讲。也就是用define!

  我先试图模仿一下这段程序运行出来的效果:2的二次幂为4。

  你会想了,不对阿?明明那段字符里写的是%d的一次幂是%d,怎么会出来2了呢?好吧,如果你有这个疑问,我只能先说一点,上面新补充的关于%d的内容希望你先看一下。%d是格式控制符,是替代同等类型常量,变量名在输出函数当中的格式控制符,也就是说,第一个%d,对应的是后面的第一个常量MI,第二个%d的代替的是后面的第二个常量算数MI*MI。

  对的,你想对了,常量变量不只可以单用名字调用,表达式也可以(也就是MI*MI的这个乘法运算)。

  之前讲过,变量的声明是用int+变量名来表示(注意,实际中没有+这个符号,Int 和变量之间用空格隔开,而且Int只是C的数据类型的其中一种,用来表示整数,其他的还有小数点float等,下一章会讲),那么常量如何表示呢?就是在文件预处理命令的下面加上这么一段#define 常量名 数值.

  例子:#define SHENGRI 1988

  这就代表着用一段SHENGRI的字符代替了1998这段数值,常量和变量的储存方式并不一致,这个以后会讲,暂且知道定义常量是这么定义就好了。

  常量的名随便起,(规范叫法是标识符)除了关键字外,但是最好用大写英文字母来代替,以区别变量,这个没有明文规定要求,但却是一个好的习惯,像我上面示例的两个常量,MI,SHENGRI.

  那么我们也就好理解下面的输出函数了。

  printf("%d的二次幂为%d",MI,MI*MI);

  第一个%d代表和后面的那个MI对应,第二个%d和后面的MI*MI对应,所以输出就是2的二次幂为4.

  下面我们完整的捋一下这段程序。

#include <stdio.h>   /*程序开始,调用标准输入输出IO库,这个应该不用讲了吧?偷笑*/
  #define MI 2      /*定义名为MI的常量,MI的值代替成为2*/##注意,常量也不能用等于,而是代替,以后会具体提到。

  int main()    /*主函数开始,为空函数*/

  {
     printf("%d的二次幂为%d",MI,MI*MI);     /*输出计算*/
     return 0;                                  /*返回值为0,主函数结束*/
  }
  

这样完整的一看,大家就该懂了吧。可能大家依然有的问题是存在于*这个字符的作用上,是的程序源码中的*代表着我们日常用的乘法符号,其实我们的加减乘除都可以直接套用在表达式当中的,如乘*除/加+减-,大家直接用就好,关于算数符号的具体用法,会在以后的实例中逐渐讲解。
  



【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-11-11 09:12 | 显示全部楼层
学习学习,留一下名。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-11-11 10:23 | 显示全部楼层
感谢lz分享,看完不负责任的,再来看比较不靠谱的。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-11-11 11:02 | 显示全部楼层
看得好昏,非专业人士果然理解有困难,还是lua好懂些= =
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-11-11 16:10 | 显示全部楼层
这个教程不错,期待后续~
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-11-11 16:50 | 显示全部楼层
感谢感谢,俺多年前粗略学过BASIC语言,同时也学了下入门级C语言,只是...只是,知道了些程序原理,却从来不会去编程,一看下LZ的讲解,就能知道了不少,望LZ再要言不烦的再讲解下去。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-11-12 01:41 | 显示全部楼层
脚本语言的特点就是易学易用。。。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-11-12 10:09 | 显示全部楼层
置顶的lua教学,用了很多实际源码作为例子,来讲解各个函数和变量的作用,显得乐学易懂。
LZ的教程在这方面,确实存在不小的劣势,尤其对新人来说,还是lua接受起来更实际。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-11-12 10:38 | 显示全部楼层
其实我想说,我看这个简单的C语言讲解觉得比置顶教程里面的lua语言讲解更简洁易懂,那些源码里面一大堆变量名称,好多都没有具体说明其涵义及如何定义的,看起来云里雾里,不知道它运算的最终结果究竟是什么,而看本贴的教程,我马上就知道了最终运算结果会是什么。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-11-12 19:04 | 显示全部楼层
看完之后,感觉从小学级直接跃升成为高中级了,哈哈哈,感谢感谢
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2012-11-13 00:08 | 显示全部楼层
回复 tvwwn 的帖子

感激你的支持阿!basic是规范的语言,学好basic再学任何语言,都可以减少自己的犯错几率,而C则是最全能,简洁,高效的语言,两种语言学哪一种,都是极好的基础,只是C的应用面更广泛。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-11-13 07:46 | 显示全部楼层
对头,关键是要讲解变量涵义、参数定义规则和涵义,其实DIY原代码真的很简单,就是里面一大堆既定的变量名称、参数名称没有得到很好的讲解,其实大家既然对DIY感兴趣,就算白菜一个,也还是懂点语法知识的,只要有一个完整的变更名称及赋值表、参数名称表,我想,DIY完全是件简单的事,我就是被那一大堆的名称弄的云里雾里了(因为苍炎里绝大多数变量名称,特别是全局变量名称是给定的,玩家是不可以随意自定义的,所以必须弄懂这些涵义)。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-11-21 03:39 | 显示全部楼层
内容高手还是很多呀!我是看了二宫大大的教程,只知道修改,要自己写一个新的,还是云里雾里不懂。一个游戏里边有很多文件,是怎么生成的,游戏运行时主要调那些文件。很多不懂,学不会
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。

本版积分规则

小黑屋|手机版|铁血丹心

GMT+8, 2024-9-29 07:42

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表