linux貪吃蛇c程序,Linux環境下C語言實現貪吃蛇游戲

Linux環境下C語言實現貪吃蛇游戲

[liul@test snake]$ more snake.c

#include

#include

#include

#include

#include

#define NUM 60

struct direct //用來表示方向的

{

int cx;

int cy;

};

typedef struct node //鏈表的結點

{

int cx;

int cy;

struct node *back;

struct node *next;

}node;

void initGame(); //初始化游戲

int setTicker(int); //設置計時器

void show(); //顯示整個畫面

void showInformation(); //顯示游戲信息(前兩行)

void showSnake(); //顯示蛇的身體

void getOrder(); //從鍵盤中獲取命令

void over(int i); //完成游戲結束后的提示信息

void creatLink(); //(帶頭尾結點)雙向鏈表以及它的操作

void insertNode(int x, int y);

void deleteNode();

void deleteLink();

int ch; //輸入的命令

int hour, minute, second; //時分秒

int length, tTime, level; //(蛇的)長度,計時器,(游戲)等級

struct direct dir, food; //蛇的前進方向,食物的位置

node *head, *tail; //鏈表的頭尾結點

int main()

{

initscr();

[liul@test snake]$ more snake.c

#include

#include

#include

#include

#include

#define NUM 60

struct direct //用來表示方向的

{

int cx;

int cy;

};

typedef struct node //鏈表的結點

{

int cx;

int cy;

struct node *back;

struct node *next;

}node;

void initGame(); //初始化游戲

int setTicker(int); //設置計時器

void show(); //顯示整個畫面

void showInformation(); //顯示游戲信息(前兩行)

void showSnake(); //顯示蛇的身體

void getOrder(); //從鍵盤中獲取命令

void over(int i); //完成游戲結束后的提示信息

void creatLink(); //(帶頭尾結點)雙向鏈表以及它的操作

void insertNode(int x, int y);

void deleteNode();

void deleteLink();

int ch; //輸入的命令

int hour, minute, second; //時分秒

int length, tTime, level; //(蛇的)長度,計時器,(游戲)等級

struct direct dir, food; //蛇的前進方向,食物的位置

node *head, *tail; //鏈表的頭尾結點

int main()

{

initscr();

initGame();

signal(SIGALRM, show);

getOrder();

endwin();

return 0;

}

void initGame()

{

cbreak(); //把終端的CBREAK模式打開

noecho(); //關閉回顯

curs_set(0); //把光標置為不可見

keypad(stdscr, true); //使用用戶終端的鍵盤上的小鍵盤

srand(time(0)); //設置隨機數種子

//初始化各項數據

hour = minute = second = tTime = 0;

length = 1;

dir.cx = 1;

dir.cy = 0;

ch = 'A';

food.cx = rand() % COLS;

food.cy = rand() % (LINES-2) + 2;

creatLink();

setTicker(20);

}

//設置計時器(這個函數是書本上的例子,有改動)

int setTicker(int n_msecs)

{

struct itimerval new_timeset;

long n_sec, n_usecs;

n_sec = n_msecs / 1000 ;

n_usecs = ( n_msecs % 1000 ) * 1000L ;

new_timeset.it_interval.tv_sec = n_sec;

new_timeset.it_interval.tv_usec = n_usecs;

n_msecs = 1;

n_sec = n_msecs / 1000 ;

n_usecs = ( n_msecs % 1000 ) * 1000L ;

new_timeset.it_value.tv_sec = n_sec ;

new_timeset.it_value.tv_usec = n_usecs ;

return setitimer(ITIMER_REAL, &new_timeset, NULL);

}

void showInformation()

{

tTime++;

if(tTime >= 1000000) //

tTime = 0;

if(1 != tTime % 50)

return;

move(0, 3);

//顯示時間

printw("time: %d:%d:%d %c", hour, minute, second);

second++;

if(second > NUM)

{

second = 0;

minute++;

}

if(minute > NUM)

{

minute = 0;

hour++;

}

//顯示長度,等級

move(1, 0);

int i;

for(i=0;i

addstr("-");

move(0, COLS/2-5);

printw("length: %d", length);

move(0, COLS-10);

level = length / 3 + 1;

printw("level: %d", level);

}

//蛇的表示是用一個帶頭尾結點的雙向鏈表來表示的,

//蛇的每一次前進,都是在鏈表的頭部增加一個節點,在尾部刪除一個節點

//如果蛇吃了一個食物,那就不用刪除節點了

void showSnake()

{

if(1 != tTime % (30-level))

return;

//判斷蛇的長度有沒有改變

bool lenChange = false;

//顯示食物

move(food.cy, food.cx);

printw("@");

//如果蛇碰到墻,則游戲結束

if((COLS-1==head->next->cx && 1==dir.cx)

|| (0==head->next->cx && -1==dir.cx)

|| (LINES-1==head->next->cy && 1==dir.cy)

|| (2==head->next->cy && -1==dir.cy))

{

over(1);

return;

}

//如果蛇頭砬到自己的身體,則游戲結束

if('*' == mvinch(head->next->cy+dir.cy, head->next->cx+dir.cx) )

{

over(2);

return;

}

insertNode(head->next->cx+dir.cx, head->next->cy+dir.cy);

//蛇吃了一個“食物”

if(head->next->cx==food.cx && head->next->cy==food.cy)

{

lenChange = true;

length++;

//恭喜你,通關了

if(length >= 50)

{

over(3);

return;

}

//重新設置食物的位置

food.cx = rand() % COLS;

food.cy = rand() % (LINES-2) + 2;

}

if(!lenChange)

{

move(tail->back->cy, tail->back->cx);

printw(" ");

deleteNode();

}

move(head->next->cy, head->next->cx);

printw("*");

}

void show()

{

signal(SIGALRM, show); //設置中斷信號

showInformation();

showSnake();

refresh(); //刷新真實屏幕

}

void getOrder()

{

//建立一個死循環,來讀取來自鍵盤的命令

while(1)

{

ch = getch();

if(KEY_LEFT == ch)

{

dir.cx = -1;

dir.cy = 0;

}

else if(KEY_UP == ch)

{

dir.cx = 0;

dir.cy = -1;

}

else if(KEY_RIGHT == ch)

{

dir.cx = 1;

dir.cy = 0;

}

else if(KEY_DOWN == ch)

{

dir.cx = 0;

dir.cy = 1;

}

setTicker(20);

}

}

void over(int i)

{

//顯示結束原因

move(0, 0);

int j;

for(j=0;j

addstr(" ");

move(0, 2);

if(1 == i)

addstr("Crash the wall. Game over");

else if(2 == i)

addstr("Crash itself. Game over");

else if(3 == i)

addstr("Mission Complete");

setTicker(0); //關閉計時器

deleteLink(); //釋放鏈表的空間

}

//創建一個雙向鏈表

void creatLink()

{

node *temp = (node *)malloc( sizeof(node) );

head = (node *)malloc( sizeof(node) );

tail = (node *)malloc( sizeof(node) );

temp->cx = 5;

temp->cy = 10;

head->back = tail->next = NULL;

head->next = temp;

temp->next = tail;

tail->back = temp;

temp->back = head;

}

//在鏈表的頭部(非頭結點)插入一個結點

void insertNode(int x, int y)

{

node *temp = (node *)malloc( sizeof(node) );

temp->cx = x;

temp->cy = y;

temp->next = head->next;

head->next = temp;

temp->back = head;

temp->next->back = temp;

}

//刪除鏈表的(非尾結點的)最后一個結點

void deleteNode()

{

node *temp = tail->back;

node *bTemp = temp->back;

bTemp->next = tail;

tail->back = bTemp;

temp->next = temp->back = NULL;

free(temp);

temp = NULL;

}

//刪除整個鏈表

void deleteLink()

{

while(head->next != tail)

deleteNode();

head->next = tail->back = NULL;

free(head);

free(tail);

}

運行

[liul@test snake]$

[liul@test snake]$ gcc snake.c -lcurses -o snake

[liul@test snake]$ ./snake

版權申明:本站文章部分自網絡,如有侵權,請聯系:west999com@outlook.com

特別注意:本站所有轉載文章言論不代表本站觀點!

本站所提供的圖片等素材,版權歸原作者所有,如需使用,請與原作者聯系。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/393042.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/393042.shtml
英文地址,請注明出處:http://en.pswp.cn/news/393042.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java正則表達式的使用和詳解(上)

1.匹配驗證-驗證Email是否正確 public static void main(String[] args) {// 要驗證的字符串String str "servicexsoftlab.net";// 郵箱驗證規則String regEx "[a-zA-Z_]{1,}[0-9]{0,}(([a-zA-z0-9]-*){1,}\\.){1,3}[a-zA-z\\-]{1,}";// 編譯正則表達式P…

在組策略中使用腳本為域用戶添加網絡打印機

使用腳本為用戶添加網絡打印機 如果你想讓培訓部門的用戶登錄后就能添加網絡打印機,就可以使用登錄腳本來實現。其中DCServer是域控制,MarketPC1是市場部門的計算機,韓立輝用戶是培訓部門的用戶。下面就驗證使用組策略為培訓部門的用戶添加網…

leetcode257. 二叉樹的所有路徑(回溯算法)

給定一個二叉樹,返回所有從根節點到葉子節點的路徑。 說明: 葉子節點是指沒有子節點的節點。 示例: 輸入: 1 / 2 3 5 輸出: [“1->2->5”, “1->3”] 解釋: 所有根節點到葉子節點的路徑為: 1->2->5, 1->3 代碼 /*** Definition for a b…

英特爾神經計算棒_如何設置英特爾Movidius神經計算棒

英特爾神經計算棒by Rishal Hurbans由Rishal Hurbans 如何設置英特爾Movidius神經計算棒 (How to set up the Intel Movidius Neural Compute Stick) In 2017 I was approached by Intel to join their Innovator Programme. After a couple interviews I was inducted as an …

linux 腳本中的push,linux shell之pushd、popd和dirs的使用講解

1 問題我們有時候需要保存多個路徑,上下鍵切換不方便,用cd-只能到上個目錄,我們可以用dirs和pushd和popd2 dirs、pushd、popddirs: 這個命令顯示棧里面所有的路徑,一定會包含當前路徑,常用參數如下dirs -v 顯示棧里面的所有路徑和…

為什么我從 Git Flow 開發模式切換到了 Trunk Based 開發模式?

我已經使用 Git Flow 構建我的 Git 分支有幾年了。但是,我遇到了 Git Flow 的一些問題,其中大部分來自長期存在的分支。解決這些問題的方案就是 Trunk Based Development。這是一個非常簡單的技術,也是有效的持續交付的基礎。在這篇文章中&am…

DedeCMS 提示信息! ----------dede_addonarticle

把數據保存到數據庫附加表 dede_addonarticle 時出錯,請把相關信息提交給DedeCms官方。Duplicate entry ’2532′ for key ‘PRIMARY’出現這種情況其實是你的主鍵是不可重復的,現在重復插入值為2532的主鍵了。可以去掉主鍵唯一,或是設成自增…

angular 模塊構建_通過構建全棧應用程序學習Angular 6

angular 模塊構建Angular 6 is out! The new features include better performance, new powerful CLI additions and a new way to inject services.Angular 6出來了! 新功能包括更好的性能,新的功能強大的CLI附加功能以及注入服務的新方法。 This tut…

leetcode74. 搜索二維矩陣(二分查找)

編寫一個高效的算法來判斷 m x n 矩陣中,是否存在一個目標值。該矩陣具有如下特性: 每行中的整數從左到右按升序排列。 每行的第一個整數大于前一行的最后一個整數。 示例 1: 輸入: matrix [ [1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 50] ] tar…

搭建基于.NetFrameWork的私有nuget服務端及打包項目發布上傳

一、私有Nuget服務端搭建 1.創建一個.NetFramework web項目 2.在nuget管理中 安裝 nuget.server包 3.安裝完成后修改web.config里面的 apikey 和 packagesPath apikey:推送包到nuget服務端 packpage: 上傳上來的包存放的服務器位置 4.發布web項目到IIS中&#xff0c…

linux 網絡配置 阮一峰,Vim 配置入門

Vim 是最重要的編輯器之一,主要有下面幾個優點。可以不使用鼠標,完全用鍵盤操作。系統資源占用小,打開大文件毫無壓力。鍵盤命令變成肌肉記憶以后,操作速度極快。服務器默認都安裝 Vi 或 Vim。Vim 的配置不太容易,它有…

spring 之 property-placeholder 分析

不難知道&#xff0c; property-placeholder 的解析是 PropertyPlaceholderBeanDefinitionParser 完成的&#xff0c; 但是 它僅僅是個parser &#xff0c; 它僅僅是讀取了 location 等配置屬性&#xff0c; 并沒有完成真正的解析&#xff0c;及 注冊。 <context:property-p…

leetcode面試題 10.02. 變位詞組

編寫一種方法&#xff0c;對字符串數組進行排序&#xff0c;將所有變位詞組合在一起。變位詞是指字母相同&#xff0c;但排列不同的字符串。 注意&#xff1a;本題相對原題稍作修改 示例: 輸入: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”], 輸出: [ [“ate”,…

hacktoberfest_我第一次參加Hacktoberfest中學到了什么

hacktoberfestImposter syndrome is something we all struggle with to one degree or another. Imposter syndrome is the fear of exposure as a fraud. If you’re anything like me you have felt like your work was not good enough to show. Or you weren’t far along…

--save 和--save-dev的區別

npm install 在安裝 npm 包時&#xff0c;有兩種命令參數可以把它們的信息寫入 package.json 文件&#xff0c;一個是npm install --save另一個是 npm install --save-dev&#xff0c;他們表面上的區別是--save 會把依賴包名稱添加到 package.json 文件 dependencies 鍵下&…

Linux 文件區塊連續嗎,關于Linux文件系統的的簡單理解和認識

關于Linux文件系統的的簡單理解和認識關于文件系統的運作&#xff0c;這與操作系統帶的檔案數據有關。例如Linux操作系統的檔案權限(rwx)與文件屬性(擁有者&#xff0c;群組&#xff0c;時間參數等)。文件系統通常會將這兩部分的數據分別存放在不同的區塊&#xff0c;權限與屬性…

服務器性能和活動監視

監視數據庫的目的是評估服務器的性能。 有效監視包括定期拍攝當前性能的快照來隔離導致問題的進程&#xff0c;以及連續收集數據來跟蹤性能趨勢。 Microsoft SQL Server 和 Microsoft 操作系統提供實用工具&#xff0c;使您可以查看數據庫的當前狀態并跟蹤性能的狀態變化。 下一…

Microsoft Desktop Virtualization

基本上有兩套啦&#xff0c;一是大家較為熟悉的MED-V。另外就是VDI(虛擬桌面基礎架構)&#xff0c;也就是以下的組合&#xff1a;1、Windows Server 2008 with Hyper-V 2、System Center Virtual Machine Manager (VMM) 2008 VMM 20083、Windows Vista Enterprise Centralized …

leetcode60. 第k個排列(回溯算法)

給出集合 [1,2,3,…,n]&#xff0c;其所有元素共有 n! 種排列。 按大小順序列出所有排列情況&#xff0c;并一一標記&#xff0c;當 n 3 時, 所有排列如下&#xff1a; “123” “132” “213” “231” “312” “321” 給定 n 和 k&#xff0c;返回第 k 個排列。 說明&…

webpack設置應用緩存_如何使用Webpack在Rails應用程序中設置TinyMCE

webpack設置應用緩存by Joanna Gaudyn喬安娜高登(Joanna Gaudyn) 如何使用Webpack在Rails應用程序中設置TinyMCE (How to setup TinyMCE in your Rails app using Webpack) The popularity of using Webpack to deal with your assets in Rails is steadily increasing. Getti…