大家看了我上一篇文章之后,心里大概有个底了吧?那么,我们接下来就要开始着手开始敲代码了。在这次的小项目中,我们要用到一个以后写程序常用的一个东西——结构体。
emmm,,,,当然,如果你会c++或者别的语言,就可能不会用这个了,而是用“类”。。当然,,我们这个东西不会用那些,我们循序渐进,先把结构体玩熟悉。。
结构体
我们这里只是大概讲下我们这次用到的相关知识点,大家想要深入的话,比如结构体指针之类的可以去百度查一查,或者找一找关于数据结构的书,这个对我们以后的学习很重的,,但是我们这个项目很简单,不会用到那些东西,哈哈哈。。
好了,跑题了,,我们继续讲。
我来讲讲我理解的结构体,它就像我们平时使用的int型,float型变量一样,只不过它是需要我们自己定义,自己写它里面的东西。
那么它的好处在哪里嘞?个人理解,它最大的好处就是可以把许多变量“绑定”在一起。怎么理解?拿我们这次的项目说,食物在地图中的地点,不可能只由一个值来确定,在二维坐标系中,至少需要两个值才能固定一个点——x和y。那么,我们就可以定义一个结构体,让这个结构体来储存这个坐标。这样在程序中处理起来又方便又快捷。
例如:
struct Food{//食物的坐标
int x;
int y;
};
当然,定义结构体同定义函数一样的,先输入sturct 表示这个是你定义的结构体,然后输入这个结构体的名字,这个名字同你自定义的函数的名字一样,你可以自己定义,然后在后面的括号内写你想在这个结构体内绑定的变量。例子中,我就绑定了两个int型的值——x和y。
定义好了之后我们在使用时,怎么申请变量,怎么使用嘞?
其实我们就可以像申请普通变量一样申请它:
Food a,b;
在使用时,比如我们想给上面申请的a变量里的x赋值为2,y为3.再输出变量a的x的值,我们可以这样:
a.x=2;
a.y=3;
printf("%d",a.x);
没错,就时用“.”来找结构体里的值。
当然,结构体肯定不止这些,但是我只讲这次项目用到的,以实战为主,大家要是感兴趣可以自己私下去研究下。
自定义头文件
相信大家再刚开始学c语言的时候,就知道了要在文件开头写上一个#include <stdio.h>,老是通常很少详细解释时干什么,只是给你们说时在引入头文件。emmm,,其实这,emm怎么说嘞,就是在引入别人写好的头文件。
随着我们学习的深入,我们接触到的项目越来越复杂,所以我们的代码会越来越复杂,而我们总不可能全部一股脑都塞进一个文件里面,不然你找代码都要找死你
所以我们要自己把一些自定义的东西,有规划的放在一个文件里,然后在主函数需要使用的时候引入一下就可以了。怎么样是不是超级方便?
而这次的贪吃蛇,我们就需要自己写一个snake的头文件。来,我接下来教你写一个自己的头文件。
emm,先说下,我这里是用的clode::blocks创建的项目,可能图啊啥的跟DEVC++等别的软件有点不同,但是步骤和原理是一样的。
通常,我们一个头文件会由两部分组成,一个是.h文件,一个是.c文件,,当然,如果是c++写的文件是以.cpp结尾的。没啥子区别。
.h的文件主要用来定义一些宏观参数啊,申明函数啊什么的。.c的文件主要用来写.h申明的函数的内容。
首先,我们新建一个项目
然后再新建一个文件
然后选择这个:
然后会弹出一个窗口,点next,然后:
这样,我们完成后,就可以看见,这里多了一个.h文件
这样.h文件就创建成功了,我们再吧snake.c文件也弄出来
同样,不过这里选这个
这样就欧克了
我们来在.h里面把我们要用到的一些要引入的文件,宏定义和要用的函数名字写上:
#pragma once
#ifndef _SNAKE_H_
#define _SNAKE_H_//这式防止重复定义的东西
#include <stdio.h>
#include <windows.h>
#include <time.h>
#include <conio.h>
#include <time.h>//我们把要用到的头文件全部引入
#pragma warning(disable: 4996)
#define FONT_WINDOW_STARTY 41 //define font window
#define FONT_WINDOW_STARTX 2
#define FRAME_HEIGHT 20 //定义了长和宽,在下面生成食物要使用的
#define FRAME_WIDTH 40
#define UP 'w' //定义下上下左右分别式啥按键
#define DOWN 's'
#define LEFT 'a'
#define RIGHT 'd'
#define SNAKE_LEN 50//定义蛇的的最大长度
#define ADD 3//这是后面定点输出时要用的一个常量
//定义一些全局变量
static int i, j, k;
static char ch = UP; //按键默认为向上
static char Direction = UP;//蛇正前方默认时向上
static int grow = 0; //flag: if snake grow
static int ret = 0;
static int finish = 1;
struct Food{//食物的坐标
int x;
int y;
};
struct Snake{//蛇的数据,x,y的坐标,长度,速度
int x[SNAKE_LEN];//蛇身子的每个点的坐标,使用数组存放
int y[SNAKE_LEN];
int len;//蛇的长度
int speed;//蛇的速度
}; //snake[0] 是蛇头
//Initialization map
void initMap(void);//初始化地图
//updataFood
void updataFood(void);//跟新食物
//moveSnake
void moveSnake(void);//移动蛇
//Judge whether the snake is alive or not
int isAlive(void);//判断是否活着
//get snake speed
void getSpeed(void);//获得速度
//move cursor
void gotoxy(int x, int y);//定点输出
//Right interface
void printFont(int x, int y, int speed);//显示信息
//menu
int menu();//菜单
#endif
随后我们可以在snake.c文件里面慢慢写我们.h中定义的函数了。
#include "snake.h"//引入这个文件的头文件
//定义两个结构体变量,一个名字是food和snake,方便后面使用
struct Food food;
struct Snake snake;
//下面我这期就写下用到的函数的名字,后面几期再慢慢往括号里填
//menu
int menu()
{
}
//initialize Map
void initMap(void)
{
}
//Right interface
void printFont(int x, int y, int speed)
{
}
//generate food
void updataFood()
{
}
//move snake
void moveSnake()
{
}
//Judge whether the snake is alive or not
int isAlive(void)
{
}
//speed updata
void getSpeed(void)//根据长度修改速度
{
}
//move cursor
void gotoxy(int x, int y)
{
}
到现在为止,我们的snake的头文件就写好了。我们要想再主文件里面调用他们咋办嘞?
同我们用别的头文件一样:
#include "snake.h"
#include <windows.h>
#include <math.h>
这样,在要用时就可以直接拿着用了。
今天就到这里,接下来我们一起慢慢把snake里的几个函数慢慢补齐。