一、前言
前面讲了这么多,终于来到了我们的正题:编程。
但光讨论编程细节、语法,是很没意思的,因为这种东西网上随便搜一搜都有一大堆。
所以本文会结合游戏推箱子,来探讨我们实现它具体需要哪些东西,而C语言又有哪些语法刚好可以使用。
注:如果你真的零基础,那么最好在我提到一个知识点后,就尽量将其理解透彻,比如去浏览器搜一搜相关的关键字,否则后面你可能难以跟下去。
二、基本的代码结构
但在正式分析游戏前,了解一下C语言的基本结构是很有必要的,不然分析起来就会有种空中楼阁的感觉。
正如前面所提到的,一个C语言输出hello world,就需要以下几行代码:
#include<stdio.h>
int main() {
printf("hello world");
return 0;
}
如果我们不需要输出字符串,那么上面的结构还可以进行简化:
int main() {
return 0;
}
也就是说,一个最简单的C语言程序,就是上面这个形式,这是每个C语言程序所必须的。
这被称为主函数,又称main
函数,因为它的名字是main
。
函数的内容我们后面再提,因为它还有点小复杂,目前你只需要记住这个格式即可。
其中的
return 0;
,这条语句为返回这个函数的结果,在VS中就算你不写也不会报错,因为编译器会自动帮我们添加上。
并且我们需要知道的是,当将上面这份代码编译执行后,计算机就会从这个main
函数的内部开始,遇到一句,执行一句。
注意:C语言的每条语句都是用英文分号
;
作为结束,这就和中文的文章中,用句号作为一句话结束是一个道理。
有了这个结构,那么编译器就已经能够将其编译运行了。
但如果我们想要让它做点事,那就需要写语句了,即代码。
三、分析游戏逻辑
将推箱子游戏抽象一下,其实就是一个二维表格,
用数字1,代表墙壁,数字5,代表箱子,数字2,代表金蛋,而数字9,代表我们的人物角色。
那么我们的规则就有了:
- 数字9代表人物,可以在表格中移动,但不能越过墙壁1,且可以推动箱子5。
- 游戏的目标就是将箱子5需要推到金蛋2的位置。
只要我们把这个简单的游戏逻辑写好,之后再将这些数字替换为图片不就行了吗?
所以首先我们的第一个问题就是,如何表示这些数字,并让其可以移动。
四、二维数组、数据类型、变量
想要在C代码中表达一个二维表格很简单,可以像下面这样写:
int map[10][10];
这就是一个10*10
的二维数组,你可以将其想象为上面看到的二维表格,并且我们还给它取了一个名字为map
,即地图的意思。
这个名字称为变量名,它有一定的规则,这个可以自己去网络上搜,比如:C语言变量名命名规则。
规则并不难,简单来说就是,可以用全字母组合(a-z,A-Z)的任意变量名,或者还可以添加下划线
_
,又或者添加数字(0-9),但数字不能作为变量名的开头。
而前面的int
,标准说法就是数据类型,意思就是这个二维数组里面将用来存放整数(int,即为整数单词integer的缩写,这是C语言的规定,不必想太多,记住即可)。
注:C语言中的数据类型有很多,但本系列只会用到几个基本的数据类型,为了节约篇幅,可能不会细讲,具体内容可参考本站点的其它文章。
注意最后是用的英文分号作为结束的。
注意:英文分号,英文!很多新手写代码,就会敲上去中文分号,一运行就报错!
结合前一章的内容,这句话的作用就是,在内存中分配一块可以存放10*10
大小的整数二维数组内存空间,用于后面我们使用。
五、循环
只是有这样一个二维数组可能还不够,因为这块内存是系统分配给我们的,那这块内存以前存放的什么数据,我们怎么知道呢?
前面说过,内存是电脑所有应用共享的,而你得到的这块内存,很有可能是刚被其它应用程序使用完后,就马上交给你用的,此时这块内存上的数据完全未知。
所以一般来说,我们第一步都会先将其清0,
用最笨的方式,就是一个一个的去赋值,就像这样:
map[0][0]=0;
map[0][1]=0;
10*10=100
,即你需要这样写100次,才能将其全部赋值为0。
数字0前面没有提,我们可以认为将其赋予为空,即作为草地背景的意思。
二维数组的使用方式就是像上面那样,第一个[]
中写你想要访问第行,第二个[]
中写你想要访问第几列。
主要注意的是,无论行还是列,都是需要从0开始计数的,也就是说,长度为10代表0-9可用。
那么这个时候,我们就需要用到循环了,它可以简化这种重复的步骤:
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
map[i][j]=0;
}
}
循环对于新人来说,可能也有点复杂,但不要紧,我们可以从里到外刨析。
上面的代码完成了一件事情:将map这个二维数组全部清零了。
并且我们并没有写一百次map,而是只写了一次map[i][j]=0
。
i代表二维数组的第几行,j代表二维数组的第几列,它们也叫变量:可变的量。
显然,这两个数字要分别能从0变化到9,这个赋值操作才能完成,而这就是循环的目的。
一个最简单的循环写法为:
for(;;){
}
即,用单词for
来写循环,后面紧跟小括号(),然后是大括号{}。
其中,小括号中还有两个分号;
,将其分为了三个区:
- 第一个区:用于初始化变量,比如上面的
int i=0
,int j=0
,这就是在初始化两个int类型的变量,名字为i和j的,初始值为0。 - 第二个区:用于判断是否继续循环,比如上面两个都是i<10,j<10,即,只有这两个变量小于10,这个循环才会持续下去,否则,这个循环就结束了。
- 第三个区:用于存放每次循环执行的代码,比如这里就是,每次循环,就会执行
i++
,j++
,它们等价于i=i+1,j=j+1,即自身加1,每次循环都会执行一次。
而后面的大括号,就是每次循环要执行的内容了。
因此,一个for循环:
for(int i=0;i<10;i++){
}
意思就是执行十次后面的大括号中的内容,而每次执行,i都会自增1,这个特性就可以用来作为二维数组的行。
然后在循环中再放置一个循环,也就是二重循环:
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
}
}
由于第二个循环在第一个循环的大括号中,所以其达成的效果就很明显了。
外层的i每次循环一次,内部的j就循环10次(0-9)。
由于外层i一共要循环10次(0-9),因此内部j就循环的100次,分十次循环(0-9),这不就正好和二维数组对应上了吗?
第一行有10列,第二行也有10列,以此类推,共100个。
这个如果想不明白的,最好再去网上搜一搜,理解明白再往下看,对于游戏来说,数组很重要。
只不过因为这个游戏是二维的,所以这里介绍的是二维数组,其实还有更常用的一维数组,也就是只有一个[]
符号的。
同样的,循环也是,一般一重循环用的最多,但由于这里是二维数组,所以就用的更难的双重循环。
完整的代码如下:
int main(){
int map[10][10];
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
map[i][j]=0;
}
}
}