零基礎教做貪喫蛇——(2)整體框架詳解

大家看了我上一篇文章之後,心裏大概有個底了吧?那麼,我們接下來就要開始着手開始敲代碼了。在這次的小項目中,我們要用到一個以後寫程序常用的一個東西——結構體
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裏的幾個函數慢慢補齊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章