基於linux ncurses的C語言貪吃蛇

2021-10-19 06:56:03 字數 2499 閱讀 3483

對於ncurses庫起初完全不熟悉,不知道有那些函式可以呼叫,在文章的開頭先總結一下專案實現過程用到過的函式

首先定義了蛇的特徵,蛇的座標等結構體,在結構體中包括了蛇的頭,蛇的長度,完成時使用到了鍊錶,所以儲存了蛇的頭,也就可以遍歷整條蛇

/*snake coordinate including x,y*/

typedef

struct snake_coordinatesnake;

/*snake body coordinate struct, to load the snake*/

typedef

struct snake_loadsnake_load;

/*snake features including snake_head, and it's length*/

typedef

struct snake_featuressnake_creat;

下面是繪製地圖的**,地圖格式為x(豎):22;y(橫):25的大小,因為在linux的終端下橫豎的間隔大小不一樣,所以在橫向上採用兩個字元大小的顯示空間來顯示乙個點

/*to print the game map*/

void

map()}

for(

int i =

1; i <

21; i++)}

}

下面是蛇的列印,過程比較簡單,這裡就不主要敘述,直接上**

void

creat_snake

(int length)

print_snake()

;}

我們將重點放在最令人頭疼的地方,就是建立食物,食物的建立十分講究,因為它的座標不能落在蛇身上,也不能落在牆上,後者比較簡單,前者難的原因主要在,食物的座標是通過隨機數產生的,產生一次後若剛好在蛇身上,得繼續生成乙個不在蛇的身上的,起初用到的方法最簡單,但也是最難的,哭了,即是乙個迴圈,讓它不斷產生直到滿足條件,這裡出現的問題是蛇在移動過程會出現卡頓現象,所以後來修改了另一種方法,第二種方法是如果不滿足就繼續呼叫食物建立函式直到滿足條件,類似遞迴,這樣做的問題在於會產生段錯誤,就是在呼叫rand的時候產生,至今未弄明白是為什麼,最後採用了下面這種方法,即如果建立後在蛇身上,即進行加減運算處理,來滿足條件,我也不知道還有沒有其他的方法,希望有懂的小夥伴一起討論。

void

creat_food()

if(snake_food.y <=2)

}}snake_head = snake_wx.head;

for(

int i =

0; i < snake_wx.length; i++

) snake_head = snake_head->next;}if

(flag ==1)

else

if(snake_food.x <5)

}if(key ==

259|| key ==

258)

if(snake_food.y/

2<5)

} flag =1;

}}mvprintw

(snake_food.x, snake_food.y,

"o")

;}

最後還有乙個重點的地方就是主函式的getch()獲取使用者輸入,這個函式是會構成等待結果,所以要用nodelay這個函式讓它不等待,才可以實現蛇的一直移動

/*main*/

while

((key =

getch()

))if(key ==

259&& last_key ==

258)

if(key ==

260&& last_key ==

261)

if(key ==

261&& last_key ==

260)

last_key = key;

}else

/*don't keydown*/

switch

(key)

if(key ==3)

if(snake_wx.head->coordinate.x ==

0|| snake_wx.head->coordinate.y ==

0|| snake_wx.head->coordinate.x ==

21|| snake_wx.head->coordinate.y ==48)

if(snake_wx.head->coordinate.x == snake_food.x && snake_wx.head->coordinate.y == snake_food.y)

refresh()

;usleep

(120000);

}

本文到這裡結束,其他的實現**比較普通所以不再講述,完整**放在了另乙個帖子,有需要的小夥伴可以跳轉獲取,下面是鏈結

linux ncurses 實現貪吃蛇完整**

Linux ncurses安裝教程(2種方法)

ncurses 提供字元終端處理庫,包括面板和選單。它提供了一套控制游標 建立視窗 改變前景 背景顏色及處理滑鼠操作的函式,使使用者在字元終端編寫應用程式時繞過了那些惱人的底層機制。簡而言之,它是乙個可以使應用程式直接控制終端螢幕顯示的函式庫。這個軟體既可以採用 rpm 包方式安裝,也可以採用原始碼...

基於IP,基於port和基於網域名稱的三種

1 基於相同ip不同port的虛擬主機 2 將listen欄位改為 listen 80 listen 8888 以上設定表示使用80以及8888埠 3 更改虛擬主機部分為 documentroot var www html website1 documentroot var www html web...

基於函式的索引 建立基於函式的索引

基於函式的索引 1基於函式的索引是常規的b樹索引。2該索引存放的資料是由表中的資料應用函式後得到的,而不是直接存放表中的資料本身。3如果查詢條件包含與索引相同的函式,就可以使用基於函式的索引,提高查詢速度 舉例 測試表 create table student2 sno varchar2 10 pr...