8.踏入C语言

一、前言

前面讲了这么多,终于来到了我们的正题:编程。

但光讨论编程细节、语法,是很没意思的,因为这种东西网上随便搜一搜都有一大堆。

所以本文会结合游戏推箱子,来探讨我们实现它具体需要哪些东西,而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语言的每条语句都是用英文分号;作为结束,这就和中文的文章中,用句号作为一句话结束是一个道理。

有了这个结构,那么编译器就已经能够将其编译运行了。

但如果我们想要让它做点事,那就需要写语句了,即代码。

三、分析游戏逻辑

将推箱子游戏抽象一下,其实就是一个二维表格,

image-20230827133228976

用数字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=0int 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;
        }
    }
}
作者:余识
全部文章:0
会员文章:0
总阅读量:0
c/c++pythonrustJavaScriptwindowslinux