C語言版貪吃蛇 第二部分

2021-07-29 09:28:30 字數 2870 閱讀 6531

本章將學習以下內容

根據座標列印出蛇

利用隨機數生成食物

列印食物

蛇的列印

食物本章完整**

運動的原理:

類似動畫的原理,蛇每移動一次,重新繪製一次影象,通過不斷的重繪,形成連續的動作。

如何運動:

方法二:

比較兩種方法,可以發現方法二更為簡便。

基於方法二的特點,陣列不能滿足我們的需求

所以這裡就需要介紹一種新的資料結構

也就是:鍊錶

這裡的鍊錶用陣列實現,沒有指標。

簡單的說,這裡的鍊錶就是乙個結構體陣列,陣列裡的每乙個元素都存有

當我們需要把蛇尾接到蛇頭的前面時,我們只需

要把蛇尾的pre設定為蛇頭

把蛇頭的next設定為蛇尾

head指向新的蛇頭

nail指向新的蛇尾(原蛇尾的前乙個)

通過這種方法,我們能夠保證蛇在陣列裡的儲存區段不變。

除此之外,再定義兩個變數,儲存蛇頭,蛇尾在陣列中的位置。

列印時,從蛇頭開始,利用next,不斷往蛇尾移即可。

定義相關變數

// 定義乙個結構體用來儲存蛇的每節身體的座標

struct snake

s[100];

// 定義三個變數存 蛇長,蛇頭,蛇尾

int lenth, head, nail;

定義個函式printsnake( )列印蛇

// 列印蛇

void printsnake()

}

在init初始化函式加入蛇的初始化資訊

void init()

編譯執行,測試是否正常列印

我們需要乙個能夠生成隨機數的函式用來產生食物的座標,

同時還要乙個函式判斷座標是否合法

不能與圍牆重合

不能與蛇重合

srand((unsigned

long)time(0));

a = rand() % 10;

int ok_food()

// 都沒有,則返回1

return

1;}

// 定義全域性變數儲存食物位置

int food_x,food_y;

// 列印食物 @

void printfood()

while(!ok_food());

// ok_food()為判斷食物是否合法的函式,合法返回1,不合法返回0

gotoxy(food_x,food_y);

printf("@");

}

在初始化函式init( ), 加入printfood( )

void init()

測試是否正常工作

這裡是貪吃蛇源**

chapter 1:

解釋下標頭檔案:

time.h 生成隨機數要用到

windows.h 要用到裡面的函式 gotoxy

---------

1.畫圍牆

*************************==

chapter 2:

目標:繪製蛇,食物

蛇的儲存結構:簡單的鍊錶(陣列實現功能)

食物:隨機數的生成

*/#include

#include

#include

#include

#include

// 定義乙個結構體用來儲存蛇的每節身體的座標

struct snake

snake[100];

// 定義三個變數存 蛇長,蛇頭,蛇尾

int lenth, head, nail;

// 食物位置

int food_x, food_y;

// 游標移動函式

void gotoxy(int x, int y)

; setconsolecursorposition(getstdhandle(std_output_handle), coord);

}// 列印蛇

void printsnake()

}// 判斷食物是否合法

int ok_food()

// 都沒有,則返回1

return1;}

// 列印食物

void printfood()

while(!ok_food());

// ok_food()為判斷食物是否合法的函式,合法返回1,不合法返回0

gotoxy(food_x,food_y);

printf("@");

}// 繪製圍牆

void printwall()

// 繪製豎直圍牆

for (int i = 1; i <= 20; i++)

}void init()

int main()

C語言版貪吃蛇 第四部分

馬上就要結束了!本章學習 判斷是否吃到食物並增長身體 判斷是否撞牆或吃到自己 定義乙個變數 life 表示是否活著 life 1表示活著,life 0表示掛掉 記得在 init 裡給 life 初始值1 主函式的while條件裡要加life 判斷撞牆 判斷蛇頭座標與牆是否重合 判斷吃到自己 依次判斷...

Web API 第二部分

web api 第二部分 元素偏移量 offset element.offsettop element.offsetleft element.offsetwidth 可以得到元素的大小 寬度和高度 是包含padding border width element.offsetheight elemen...

redux 第二部分

redux 的使用方法,為什麼使用 action.js 檔案,進行優化 將其分開,然後我們通過工廠函式的每次返回不同的物件,由於引數是固定的,每次返回的都是事件型別和事件資料,所以我們可以使用乙個函式,通過其返回值來返回乙個物件,讓後傳遞給 action 我們的 reducer 函式有兩個引數,引數...