對於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...