上个帖子中为大家介绍了C#的基本知识,和VS2010的使用方法,并且我们就创建出了一个非常简单的小程序,
它只能弹出一个对话框.但是请不要小看它,它已经具备一个应用程序的基本框架了.
那么怎么样创建一个更复杂的程序呢?换句话说,我们怎么创建一个更绚丽的魔法世界呢?
很简单,如果看完这个系列的教程,我相信你就能创建一个实用的程序了,计算器,日历,文本处理器,甚至是一个简单的游戏.
先说一下整体的安排
在接下来的教程中,我们会以制作一个简单的Galgame程序为线索,讲解C#图形编程的相关知识.
下面我们列出我们将会接触到的内容:
1. 显示图片
2. 更换图片
3. 显示不同文字
4. 显示不同的界面
5. 接受鼠标和键盘的输入
6. 实现不同按钮相应的功能
7. 播放音频
8. 弹出不同的窗口(如读取存档,设置等等)
上面是我们要学习到的知识(相对于一个Galgame来说).相信你肯定会对其中的一项或几项感兴趣.
要学习以上的知识,首先你必须拥有最基本的编程知识,通俗的说就是编程的语法.
下面我就会简单的介绍下这些基本知识.也许会有点枯燥,但是却是很重要的一部分.
(如果你在看这篇帖子的时候,感觉到无聊并有导致你对编程失去兴趣的可能,就跳过这篇吧,只要记住在后面的帖子中有看不懂的地方,就来这篇帖子相应的地方看看)
变量与类型
变量,就是字面上的意思,在程序运行中可以变化的量.反之不能变化就是常量.
这里的变化指的是可不可以发生变化,不是会不会发生变化,这点要注意.
常量倒是用的不多.以后就不提常量了,因为除了可不可以变化外,它和变量基本没区别.
每一个变量都必须规定成一种类型的变量.类型有很多种,常用的例如,int,double,string,bool等等都是类型.
在使用一个变量前,我们必须先定义它,定义变量的语法如下:
int a;
double b;
string c;
bool d;
int[] e;
前面是变量的类型,后面是变量名.变量名就是变量的名字.为了区分不同的变量,他们就必须有不同的名字.
而且取变量名有一定的规则:只能由字母,数字,汉字,下划线_组成,且数字不能放在最前面,且不能用C#的关键字.
定义了变量后我们就能对他进行操作了.例如:
a=2;
b=2.222222;
c=”简单易懂的现代魔法”;
d=true;
e={1,2,3,4,5}
a=a+b;
b=b/2*a+e[2];
c+=”C#编程”;
这些都是通过运算符号来操作变量的值.
相信这些大家都能理解,这里我只做简单的讲解,到后面用到的时候我会仔细的说明.
其中可能对[]有些不了解,他是数组的意思,int[]表示一个里面元素是整数的数组,数组是一系列相同类型变量的集合.
访问数组中变量的时候用数组名[来访问,其中下标从0开始,如e[0] 表示上面的整数数组e的第一个元素.
语句
C#里面有以下5种语句:
控制语句,函数调用语句,表达式语句,空语句,复合语句。
先说控制语句,控制语句是用来控制程序流程的语句,分为条件,循环,分支3种.
条件语句: if语句,语法如下
if(表达式语句)
语句1;
else
语句2;
条件语句通过判断括号里面表达式语句的真假值来决定执行哪一个语句,如果为真就执行语句1,如果为假就执行语句2.
其中else 和 语句2 并不是必须有的,可以省略,表示如果表达式是假的就什么都不做.
表达式语句通常是由运算符和变量,数字,括号组成,
例如a+b,a*(b+c),(a>b) &&(a!=0),
并能得出的结果(数值或者逻辑值(真true/假false)).
其中还要用到除了算术运算符以外的逻辑运算符:>(大于),<(小于),==(等于),!=(不等于),&(与),|(或),!(非).
循环语句: for语句,语法如下:
for(表达式1;表达式2;表达式3)
语句1;
循环语句是帮助我们重复做一件事情的语句.
对于for语句,首先会执行一遍表达式1,通常我们在这里为我们的循环控制变量赋初值,
然后判断表达式2的真假,如果是真就继续执行,通常我们在这里放上我们的循环条件.
然后执行表达式3和语句1.在表达式3里面我们通常会改变我们的循环控制变量.
执行完后继续判断表达式2,如果是真就一直循环下去.
循环语句:while语句,语法如下:
while(表达式)
语句1;
顾名思义,就是当表达式成立的时候就一直执行语句1.
分支语句:switch语句
switch(表达式1)
{
case 常量表达式1: 语句1;
case 常量表达式2: 语句2;
case 常量表达式3: 语句3;
……..
default : 语句n;
}
执行的时候会根据表达式1的值来选择所执行的语句,如果case没有列出来表达式1所表达的结果,就会执行default所指定的语句n.
我们发现上面的语句中,通常只能执行一条语句.那怎么样在一个地方执行多条语句呢?
为了达到这一点,我就需要运用复合语句.符合语句是用一对大括号( { })所包裹起来的一条或多条语句的集合,
在执行的时候他们被看做是一条语句,以便插入在上面的控制语句当中.
顺便提一下注释语句,在任何语句前面打上//,计算机就认为//后面的文字是注释,在编译的时候不会去管他,同样的/*…..*/也有同样的效果.
函数
函数是由一条或者多条语句组成的语句块,
通常按照一定的逻辑组合起来,能够完成一定的任务.
计算机中的函数和数学中的函数一样,在同样的输入情况下,必定能获得相同的返回值或者效果.
函数和变量一样要先定义.下面是定义函数的语法:
[修饰符] 返回值类型 函数名(参数表)
{
/*函数所执行的语句*/
}
函数修饰符我们后面会讲.
每一个函数都有一个返回值类型,它可以是任意类型,例如int,bool,也可以是空,就是不返回任何值,我们用void表示.
函数名就是函数的名字啦,我们调用函数的时候,必须要靠函数名调用.
参数表是我们在调用函数的时候,传递给函数的一系列变量,函数按照这些变量的意义,进行各种各样的效果.
参数表可以有很多个参数,也可以没有参数.
例如我们编写一个求平方的函数:
public int 平方(int a)
{
return a*a;
}
当我们在我们自己的程序中调用平方这个函数时,就能求一个数的平方.例如
m=平方(n);
这时候m的值就是n的平方.这里就是函数调用语句.
在程序中,我们经常要调用各种各样的函数,调用的方法就是函数名(参数1,参数2…参数n).
类与对象
下面就是面向对象程序设计的关键部分了,很多人都觉得面向对象不好理解,
其实很简单的,就是把现实世界中的思想方式运用到程序设计中来.
首先,什么是对象?世界一切具体的东西(物体,能量,甚至是思想)都是对象.
在前面提到的一个变量和一个常量都是对象.一个人,一个桌子也是对象.
一个对象一般都具有一定的属性(姓名,岁数),也具有一定的行为(走路,睡觉),
相对应的,程序中的对象也拥有属性(成员变量),和行为(成员函数).
那什么是类呢?把具有相同属性和行为的对象,抽象地描述出来,就是类.
对象和类的关系就像是一个人和人类的关系.
类是对象的抽象描述,我们可以通过这个描述去创造出一个对象,这个过程叫做实例化 .
拿火球来说,火球术本身是一个类,是看不见,摸不着的,是一个并不存在实体的概念,
但是每天都会有很多的魔法师都会用火球术创造很多的火球,那么这单个的火球就是对象,火球术就一个类.
像我们前面用到的int,double,string都是类,前面我们说的是类型,其实他们就是一个类,分别抽象了整数,浮点数和字符串对象,
方便了我们利用他们创建各种变量,变量也是对象.
到这里相信大家应该对类和对象就有一个大概的了解了.下面来说编程里面是如何定义类和对象的.
下面是定义类得语法
[类修饰符] class 类名
{
成员变量1;
成员变量2;
成员函数1;
成员函数;
…………………..
}
一个类中一般包含多个变量和函数,我们把他们称为该类的成员变量和成员函数.
关于修饰符,下面我会提及到.
为了理解,我们定义一个火球类.
首先我们要想想如何描述一个火球呢?
他应该有自身的大小,当前的速度,和爆炸的威力,以及目前的位置.然后他还应该有几种行为,
例如被施放出来,根据速度移动,以及碰到目标后爆炸等等.
有了这些想法,我们就要吧我们的火球类写出来了.
public class 火球
{
public int 大小;
public int 速度;
public double 威力;
public Point 位置;
public void 施放()
{
/******/
}
public void 爆炸()
{
/******/
}
public void 移动()
{
/******/
}
}
其中Point表示一个记录一个点位置的类,我们用一个Point的对象来记录当前的位置.
到这里我们已经完成了一个火球类的创建.但是我们是不能用它去攻击别人的,因为它只是一个抽象的概念,并不是实物.
所以我们需要下面的代码来创建一个真真正正的火球.
火球 火球1 = new 火球();
这和前面我们定义一个整数的时候有点不一样?因为int,double等类型有一个叫做字面量的东西,它使得我们可以直接用等于号给这些变量赋值,
而我们自己定义的类和很多系统提供给我们的类是通常是没有字面量的,这区别没必要知道,无所谓,只要知道引用类型创建变量需要new一下就好了.
new运算符的意义是创建一个类型的对象,我们定义了一个叫做火球1的引用去接受它所创造出来的这个对象,
所以火球1就是一个有实体的对象了,我们就可以用它去攻击敌人了!
也许你会发现new后面那个火球带了一对括号(),这不是函数的调用吗?
没错,创建一个对象的时候必须要调用一个叫构造函数的函数.
但是我们并没有在类的定义中定义那个构造函数,因为系统会默认帮我们定义一个什么事都不做的构造函数.
当然我们也可以自己定义一个,做一些为变量赋初值等操作.注意哦,构造函数必须和类名相同。
一个火球被制造出来的时候,一般会有一定的初速度,那么我们就把初速度赋值给对象的速度变量好了.
在类的定义中加入如下的函数.
public 火球()
{
速度 = 10;
}
这样当我们每一次new一个新火球的时候,他们的速度都会变成10.另外构造函数可以有参数,也可以重载.
创造出火球之后,我们就要发射它啦
如何调用火球这个对象中的发射这个函数呢?
很简单,
火球1.发射();
就行了.访问对象中的属性和函数都是通过 对象名.函数名(变量) 访问.
下面介绍面向对象程序设计的核心思想之一:继承.
继承是指一个类从另一个类中复制所有的属性和行为.
我们把继承出来的类称为派生类(子类),被继承的类叫做基类(父类).
应该不难理解吧?我们还是拿上面火球类的例子继续说.
火焰专精的法师,不想和别的专精的法师一样用简单的火球术,他们在火球术的基础上,发明了另一种更强大的法术—炎爆术.
炎爆术是以火球术作为基础的,他具有所有火球术所具有的属性和行为,例如大小,移动等等.
但是他却具有火球术不具有的属性和行为,
首先,他的有一个持续时间的属性,并且他在命中目标后能持续性的造成伤害.
比火球术厉害多了不少,不是吗?
然我们来看看怎么写炎爆术的类:
public class 炎爆术 : 火球
{
public int 持续时间;
public void 造成持续伤害()
{
/******/
}
}
这个冒号(:),就代表了炎爆术类是从火球术类继承而来.
虽然我们没有定义其他的那些属性,但是它却有火球术类所有的属性和函数.
并且它比火球术多了一个持续时间属性和造成持续伤害的函数.
然后我们就可以创造一个比火球厉害得多的炎爆去攻击敌人了!
补充一点,前面我们所说的修饰符,就是你们看到的public之类的,他描述了类或者是函数的访问权限,
例如public,private, protected和是不是静态变量(静态函数)(static).
所谓静态(static),指的是它属于这个类的变量(函数),而不是属于该类的对象的.
打个比方说,人类的总数,这个属性是描述人类这个类的,单个的人并没有总数这个概念.
这些修饰符是可有可无的,视情况需要加在类(函数)的定义前面,默认是private和非静态函数.
上面就是这次的全部知识,这次我介绍了C#的基本语法,
虽然你可能觉得无聊,也可能没有看懂,但是没关系!因为这些都是理论知识,
在后面的实例中我们会要经常用到他们,用的时候你就能很轻松地理解他们了!
其实我也觉得这次的内容很枯燥无聊,都不想写了…
但是他们毕竟是基础,在后面的学习过程中,如果有这方面的问题,就可以到这里面来找.当然我更推荐去上次说的那3个地方找.
另外说明一点,为了提高大家的兴趣,也是为了节省时间,
上面的介绍并不是C#的全部语法,很多重要的语法我都没有说明,例如重载,泛型,委托等等.
用到的时候我会讲,毕竟本帖的目的是带你们快速的开发出一个小程序以提高你们的兴趣,一开始讲那么多理论只会吓退一些读者.
C#入门的经典书籍<C#入门经典>就有将近1000页,你可以想象得出我省略了多少.
如果你非常有兴趣学习C#,我推荐你去读那本书,或者<C#高级编程>.相信你能收获很多知识.
我希望大家记住:类就是类型,对象就是变量(常量).
下次,我告诉大家我列出的galgame功能的其中2项,如何响应键盘和鼠标操作,与按钮的响应.
作业:复习下今天的所讲述的知识就行,毕竟没什么需要动手的地方.如果你愿意就自己定义几个类,和函数试试看.
写的不错 支持一下博主 起重机车轮(www.dgqzpj.com)
好长……但是C都没学好的表示只能支持下了!