之前在很多平臺上都見過貪吃蛇的小遊戲但是唯獨在Linux 下見到這種遊戲程式設計很少,像Java 的C語言的有很多,這裡分享一下我自己參考別人的貪吃蛇程式碼移植到Linux 

平臺下並且這個小程式有多個.c和.h檔案組成,雖然很多人會說這樣子會造成全域性變數混亂,以及變數宣告的的重定義等,但是為了讓更好的理解這個貪吃蛇的邏輯,分成多個檔案,希望有助於大家學習和幫助,在原始碼中,我的程式碼的每一行都有詳細的註釋,因為本人才接觸Linux,能力有限,希望大家不要在意。

 在本程式中的貪吃蛇主要 分成了interface.c檔案 和snake.c,about .c,main.c檔案等4個檔案以及對應的interface.h ,snake.h,about.h,global.h的標頭檔案,因為以往的貪吃蛇都是一個檔案全部覆蓋,這裡我來分別說明下這4個.c檔案的作用,interface.c是用來建立 主要的遊戲視窗的主要程式碼以及interface 函式的主要功能實現區,snake.c檔案則是為小蛇的主要上下左右功能的實現區,about.c則為選單欄作者的主要實現區,而main.c則是呼叫了前臺動畫的主要的實現,以及綜合呼叫 主視窗函式的執行。這個程式的核心所在就是snake.c這個檔案了,其基本邏輯和其他各種語言寫的貪吃蛇的程式碼的邏輯基本相同,都是用一個timeou的計時器用來重新整理小蛇的座標的同時用小蛇的圖片來填充新的座標,同時用陣列來儲存小蛇的座標,實現小蛇的動態行走。

這裡定義了3個變數 因為是全域性的用的external而不用static靜態宣告的原因我在程式碼裡會解釋;

extern GdkPixbuf *pixbuf = NULL ;  //背景影象 

extern GdkPixbuf *pix1 = NULL ;   //蛇影象 
extern  GdkPixbuf *pix2 = NULL ;   //豆子影象 ;

這個void move ()這是小蛇運動的主要函式裡面的tailx ,taily,headx,heady分別用了陣列locate[0][0]和locate[0][1],locate[len][0],locate[len][1];來記錄小蛇的方向運動座標;這裡用switch分支語句來判讀朝向的方向,列如想左邊的情況:     

case LEFT: //左  
             headx--;
erase();
             if(headx == -1) 
{
game_end();
break;

            for(i=0; i<len; i++) 
            { 
                  locate[i][0] = locate[i+1][0]; 
                  locate[i][1] = locate[i+1][1];  
            } 


            locate[len][0] = headx; 
            locate[len][1] = heady; 
            draw(); 
            break; 


這裡因為這個遊戲區域的長度為60,因為向左邊所以headx的座標只能--,這裡因為要先出來,所以要先呼叫erase()函式來抹擦掉蛇尾部分,然後判讀headx座標如果為-1則判讀為頭部撞到牆的裡面條件成立則呼叫game_end()結束遊戲這個函式同時退出迴圈;然後在用for迴圈這裡定義了一個變數i和len,已經locate二維陣列,首先給i賦值為0,locate[0][0]即為headx座標,而locate[0][1]則為heady座標,這裡因為移動判讀用locate[i+1][0]即為下一個座標覆蓋為當前的座標,然後在用headx賦值為當前的locate[len][0]其他的方向同理;然後在呼叫draw函式畫上蛇頭

timer = gtk_timeout_add(50,(GtkFunction)game_run,NULL);這個變數位於 on_begin_clicked函式中主要是用timeout計時器每隔50秒來呼叫game_run函式的執行,同時一定程度上也可以實現小蛇的速度的加速 和減速,其他的遊戲區域同理都是呼叫函式來實現的,大致原理相同;


在檔案裡面我用了一個框圖來標註了這個遊戲區域的生成幫助大家更好的理解,以及流程圖來希望大家能多這個多檔案的更好理解,以及貪吃蛇的幫助文件,裡面內容都深刻的解析了貪吃蛇的每一個不服,因為能力有限,第一次寫部落格多有疏漏,希望大家多多包含

下面是文件的下載地址,希望能幫助大家更好的學習和使用貪吃蛇相關文件程式碼的下載

.