C語言實現貪吃蛇小遊戲(詳解)

2021-09-12 11:13:19 字數 4401 閱讀 9736

目錄

一、程式實現的原理:

二、預備知識

1、控制台視窗

2、通過**將游標移動到控制台指定位置

三、 程式框架

四、具體操作

1、定義相關標頭檔案

2、定義函式結構以及相關屬性

五、完成各**塊

1、 實現將游標移到指定位置的操作

2、 列印遊戲邊框以及遊戲初始畫面

3、編寫按鍵操作的**

4、實現生成食物的**

5、判斷蛇運動是否符合規範

六、main函式

七、執行效果圖

1、構造蛇身:定義乙個座標陣列,存放的是蛇的每一節蛇身所在的座標位置。這樣就將移動蛇身的操作轉換為移動陣列的操作,將吃食物增加蛇身體長度的操作轉換為在陣列後面追加元素的操作。

2、移動效果:每次移動時,將每一節蛇身(蛇頭除外)依次往前移動一節,然後擦去蛇的最後一節,最後確定蛇頭的方向,再繪製乙個蛇頭。這樣就會顯示乙個移動效果。

3、身體增加效果:每次移動時候,判斷蛇頭是否碰到了食物,如果碰到了食物,則吃掉它,並且只進行前移蛇身和增加蛇頭的操作,不進行擦除蛇尾的操作(可以用乙個標記變數判斷是否吃掉了食物,然後在擦除蛇尾那裡判斷是否需要擦除蛇尾),這就會顯示蛇身體增加的效果。

控制台視窗每乙個位置都有它的座標,且座標系如下圖所示(隨箭頭方向座標逐漸增大)

#include #include //將游標移動到控制台的(x,y)座標點處

從執行結果可以看到,程式在指定位置輸出了待輸出的內容。

1、定義相關標頭檔案

2、定義函式結構以及相關屬性

3、完成各**塊

本程式所用到的標頭檔案如下所示

#include #include #include //windows程式設計標頭檔案

#include #include //控制台輸入輸出標頭檔案

首先需要確定遊戲的邊框大小

#define snakesize 100//蛇的身體最大節數

#define mapwidth 118 //寬度

#define mapheight 29//高度

其次要定義食物的座標,以及 蛇自身的相關屬性

//食物的座標

struct food;

//蛇的相關屬性

struct snake;

這裡蛇的身體由一節一節的小方塊■組成, 將蛇的身體每一節的小方塊所在的位置用乙個陣列來儲存起來,方便以後操作。確定遊戲所用到的幾個函式塊。

//繪製遊戲邊框

void drawmap();

//隨機生成食物

void createfood();

//按鍵操作

void keydown();

//蛇的狀態

bool snakestatus();

//從控制台移動游標

void gotoxy(int x, int y);

最後定義幾個全域性變數

int key = 72;//表示蛇移動的方向,72為按下「↑」所代表的數字

//用來判斷蛇是否吃掉了食物,這一步很重要,涉及到是否會有蛇身移動的效果以及蛇身增長的效果

int changeflag = 0;

int sorce = 0;//記錄玩家的得分

//將控制台游標移到(x,y)處

void gotoxy(int x, int y)

乙個小方塊字元■在x方向上占用兩個位置,在y方向上占用乙個位置。每一節蛇身由乙個小方塊構成。

void drawmap()

//列印左右邊框

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

//隨機生成初試食物

while (1)

//將游標移到食物的座標處列印食物

gotoxy(food.x, food.y);

printf("★");

//初始化蛇的屬性

snake.len = 3;

snake.speed = 200;

//在螢幕中間生成蛇頭

snake.x[0] = mapwidth / 2 + 1;//x座標為偶數

snake.y[0] = mapheight / 2;

//列印蛇頭

gotoxy(snake.x[0], snake.y[0]);

printf("■");

//生成初試的蛇身

for (int i = 1; i < snake.len; i++)

//列印完蛇身後將游標移到螢幕最上方,避免游標在蛇身處一直閃爍

gotoxy(mapwidth - 2, 0);

return;

}

void keydown()

/* *蛇移動時候先擦去蛇尾的一節

*changeflag為0表明此時沒有吃到食物,因此每走一步就要擦除掉蛇尾,以此營造乙個移動的效果

*為1表明吃到了食物,就不需要擦除蛇尾,以此營造乙個蛇身增長的效果

*/ if (changeflag == 0)

//將蛇的每一節依次向前移動一節(蛇頭除外)

for (int i = snake.len - 1; i > 0; i--)

//蛇當前移動的方向不能和前一次的方向相反,比如蛇往左走的時候不能直接按右鍵往右走

//如果當前移動方向和前一次方向相反的話,把當前移動的方向改為前一次的方向

if (pre_key == 72 && key == 80)

key = 72;

if (pre_key == 80 && key == 72)

key = 80;

if (pre_key == 75 && key == 77)

key = 75;

if (pre_key == 77 && key == 75)

key = 77;

/***控制台按鍵所代表的數字

*「↑」:72

*「↓」:80

*「←」:75

*「→」:77

*/ //判斷蛇頭應該往哪個方向移動

switch (key)

//列印出蛇頭

gotoxy(snake.x[0], snake.y[0]);

printf("■");

gotoxy(mapwidth - 2, 0);

//由於目前沒有吃到食物,changflag值為0

changeflag = 0;

return;

}

void createfood()

}//隨機生成的食物不能橫座標為奇數,也不能在蛇身,否則重新生成

if (flag && food.x % 2 == 0)

break;

} //繪製食物

gotoxy(food.x, food.y);

printf("★");

snake.len++;//吃到食物,蛇身長度加1

sorce += 10;//每個食物得10分

snake.speed -= 5;//隨著吃的食物越來越多,速度會越來越快

changeflag = 1;//很重要,因為吃到了食物,就不用再擦除蛇尾的那一節,以此來造成蛇身體增長的效果

} return;

}

bool snakestatus()

return true;

}

int main()

gotoxy(mapwidth / 2, mapheight / 2);

printf("game over!\n");

gotoxy(mapwidth / 2, mapheight / 2 + 1);

printf("本次遊戲得分為:%d\n", sorce);

C語言實現貪吃蛇小遊戲

一 程式實現的原理 1 構造蛇身 定義乙個座標陣列,存放的是蛇的每一節蛇身所在的座標位置。這樣就將移動蛇身的操作轉換為移動陣列的操作,將吃食物增加蛇身體長度的操作轉換為在陣列後面追加元素的操作。2 移動效果 每次移動時,將每一節蛇身 蛇頭除外 依次往前移動一節,然後擦去蛇的最後一節,最後確定蛇頭的方...

C語言貪吃蛇小遊戲

整個 都是c語言,其中呼叫少部分庫函式,不如實現螢幕座標列印的函式,貪吃蛇遊戲 的核心在於蛇身體座標的更新,實現細節請看 注釋,include stdafx.h 如果是vc環境的話加上該標頭檔案 include include include include include define turnu...

c語言小遊戲 貪吃蛇

1 資料設計 遊戲地圖的寬和高,以及蛇的最大長度 食物在地圖上x和y上的顯示 蛇的長度,蛇得每一節的座標儲存,蛇的移動速度 蛇是否變化,蛇的初始移動方向 2 模組化設計 void drawmap 繪製遊戲地圖 void keydown 按鍵處理 voidcreatefood 產生食物 void go...