您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關利用C語言實現一個簡單的貪吃蛇小游戲,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
依然是非常傳統的貪吃蛇小游戲,網上很多教程,配置好ege圖形庫就好,不然沒有grapics.h另外,還需要添加snakes.h,直接上代碼吧,注釋很詳細了。覺得難度有一部分來源于配置圖形庫。
snakes.h
void welcome(); void initSnake(); void createPoint(); void drawSnake(); void drawRandomPoint(); void view(); void sMove(); void changeHead(); void keyControl(int key); void drawScore(int x, int y, int score_size); int isGetPoint(); void againGame(); int isGameOver(); #define WINWIDTH 800 //窗口的寬度 #define WINHIGH 544 //窗口的高度 #define S_POOLX 30 //游戲池開始的橫坐標 #define S_POOLY 30 //游戲池開始的縱坐標 #define POINT_W 10 //構成蛇的小方塊的寬度 #define E_POOLX (S_POOLX+(POINT_W+2)*43-2) //游戲池結束的橫坐標 #define E_POOLY (S_POOLY+(POINT_W+2)*33-2) //游戲池結束的縱坐標 #define MAX_SNAKE 100 //蛇最大的長度 // 定義一個枚舉類型,表示蛇運動的方向 enum dire { LEFT=1, RIGHT, UP, DOWN, }; struct point { int x; //點的橫坐標 int y; //點的縱坐標 color_t coler; //點的顏色 }snake[MAX_SNAKE]; //定義一個點的結構體,包括橫縱坐標,以及點的顏色。并定義一個名為snake的點的數組作為蛇的數據存放
main.c
#include <graphics.h> #include "snake.h" #include <stdio.h> int s_length = 0; //存放蛇的長度 int score =0; //存放獲得的分數 enum dire s_direction = RIGHT; //初始化蛇的方向是向右運動 struct point r_point; //定義一個point結構體來存放隨機出現點的數據,即蛇的食物 /********************************************** * 游戲結束時顯示函數 * 名稱:void AgainGame() * 功能:繪制游戲開始界面 *********************************************/ void againGame() { //聲明一個img圖片對象 PIMAGE img; cleardevice(); //清屏 //用newimage在initgraph后創建這個對象。但記得要在不使用的時候delimage img = newimage(); getimage(img, "C://Users//Administrator//Desktop//圖片//snake.end!.jpg"); //加載游戲結束的圖片 putimage(0, 0, img); //顯示游戲結束的圖片 drawScore(360, 250, 60); //繪制顯示得分 while(getch() != 'r') //等待用戶按鍵,若等于'r'鍵,則跳出結束界面,即重新開始程序 { if(!is_run()) { break; //防止無法關閉窗口 } } delimage(img); //銷毀img變量 } /************************************************ *判斷游戲是否結束函數 *名稱:int isGameOver() *功能:通過檢查蛇是否出界或者碰到自身身體來判斷是否游戲結束 *返回值:為1則表示游戲結束,為0則游戲進行中。 ***********************************************/ int isGameOver() { int i; //判斷蛇頭是否超出邊界 if((snake[s_length-1].x < S_POOLX) || (snake[s_length-1].x > E_POOLX-POINT_W) ||(snake[s_length-1].y < S_POOLY) ||(snake[s_length-1].y > E_POOLY-POINT_W)) { return 1; } else { for(i=0; i< s_length-1; i++) //通過for循環來判斷蛇頭是否與蛇神碰撞 { if((snake[i].x==snake[s_length-1].x) && (snake[i].y==snake[s_length-1].y)) { return 1; } } return 0; } } /************************************************ *判斷蛇是否遲到食物函數 *名稱:int isGetPoint() *功能:通過檢查蛇頭是否和食物重合來判斷是否吃到食物 *返回值:為1則表示吃到食物,為0則表示還未吃到。 ***********************************************/ int isGetPoint() { if((snake[s_length-1].x==r_point.x) && (snake[s_length-1].y == r_point.y)) //判斷舌頭是否和食物坐標重合 { s_length++; //更新蛇的長度 snake[s_length-1].x=r_point.x; snake[s_length-1].y=r_point.y; //將食物的坐標添加到蛇snake的數組中,并將食物坐標填充進去 snake[s_length-1].coler = r_point.coler; score += 10; //得分加10 changeHead(); //改變蛇頭的坐標為運動方向的下一個點的坐標 return 1; //若吃到食物則返回1 } return 0; //若沒吃到食物則返回0 } /********************************************** * 得分的顯示函數 * 名稱:void drawScore(int x, int y, int score_size) * 功能:按照參數中的坐標和大小顯示 蛇的得分 *********************************************/ void drawScore(int x, int y, int score_size) { char s[10]; setcolor(EGERGB(0x00, 0x0, 0x0)); //設置字體顏色 setfont(score_size, 0, "幼圓"); //設置字體 setbkmode(TRANSPARENT); //設置字體背景為透明 sprintf(s,"%d",score); //將整型的score 轉換成字符串 outtextxy(x, y, s); //顯示字體 } /************************************************ *按鍵控制函數 *名稱:void keyControl(int key) *參數:int key ,表示按鍵的鍵值。 *功能:處理蛇的左轉、右轉、上轉和下轉,以及游戲的暫停/啟動 ***********************************************/ void keyControl(int key) { switch(key) { case VK_SPACE: //暫停設置 getch(); getch(); break; case 38: //按方向上鍵,改變蛇向上運動 if(s_direction != DOWN) { s_direction = UP; } break; case 40: //按方向下鍵, 改變蛇向下運動 if(s_direction != UP) { s_direction = DOWN; } break; case 37: //按下方向左鍵,改變蛇向左運動 if(s_direction != RIGHT) { s_direction = LEFT; } break; case 39: //按下方向右鍵,改變蛇向右運動 if(s_direction != LEFT) { s_direction = RIGHT; } break; } } /************************************************ *更新蛇的運動函數 *名稱:void sMove() *功能:根據運動方向,更新蛇的坐標 ***********************************************/ void sMove() { int n; //依次改變蛇身體的坐標,規則為,前一個點的坐標傳遞給下一個點。 for(n=1; n<s_length; n++) { snake[n-1].x = snake[n].x; snake[n-1].y = snake[n].y; } changeHead(); //根據蛇的運動方向,改變蛇頭的坐標 } /************************************************ *改變蛇頭的坐標函數 *名稱:void changeHead() *功能:根據運動方向,更新蛇頭的坐標 ***********************************************/ void changeHead() { switch(s_direction) //根據方向,改變相應的坐標更新 { case RIGHT: snake[s_length-1].x += (POINT_W+2); break; case LEFT: snake[s_length-1].x -= (POINT_W+2); break; case UP: snake[s_length-1].y -= (POINT_W+2); break; case DOWN: snake[s_length-1].y += (POINT_W+2); break; default : break; } } /************************** //初始化函數 //名稱:void initSanke() //功能:初始化蛇身體、運動方向、蛇的長度變量、得分變量 // ************************/ /************************** //初始化函數 //名稱:void initSanke() //功能:初始化蛇身體、運動方向、蛇的長度變量、得分變量 // ************************/ void initSnake() { snake[0].coler = 0x00ff00; snake[0].x = 10*(POINT_W+2) + S_POOLX; snake[0].y = 13*(POINT_W+2) + S_POOLY; snake[1].coler = 0x00ff00; snake[1].x = snake[0].x + POINT_W+2; snake[1].y = snake[0].y ; snake[2].coler = 0x00ff00; snake[2].x = snake[1].x + POINT_W+2; snake[2].y = snake[1].y; //設置蛇的初始長度為3個方格 s_length =3; //初始化蛇的長度為3 s_direction = RIGHT; //初始化蛇運動方向為向右 score =0; //初始化得分為0 } /************************************************ *蛇的食物生成函數 *名稱:void createPoint() *功能:通過隨機數產生食物所在點的坐標,并設置食物的顏色 ***********************************************/ void createPoint() { //隨機生成食物所在點的坐標。POINT_W 表示食物的寬度,+2的目的是讓方塊之間留有空隙 r_point.x = random(29)*(POINT_W+2) + S_POOLX; r_point.y = random(26)*(POINT_W+2) + S_POOLY; //設置食物的顏色 r_point.coler = 0x00ff00; } /********************************************** *貪吃蛇體的顯示函數 * 名稱:void drawSnake() * 功能:畫出蛇體的形狀和顏色 * 即將結構體數組snake中的已有數據,全部展現在屏幕上。 *********************************************/ void drawSnake() { int n; for(n=0; n<s_length; n++) { if(n==s_length-1) //若是蛇頭,則繪制形狀為空心圓,顏色為白色 { setfillcolor(0xffffff); fillellipse(snake[n].x +POINT_W/2, snake[n].y+POINT_W/2,POINT_W,POINT_W); } else //若是蛇身體,則繪制形狀為實心正方形,寬度為POINT_W, { setfillcolor(snake[n].coler); bar(snake[n].x, snake[n].y, snake[n].x + POINT_W, snake[n].y + POINT_W); } } } /********************************************** *隨機產生的蛇食物的顯示函數 * 名稱:void drawRandomPoint() * 功能:畫出蛇食物的形狀和顏色 * 即將結構體r_point中的已有數據,展現在屏幕上。 *********************************************/ void drawRandomPoint() { setfillcolor(r_point.coler); //設置填充顏色 bar(r_point.x, r_point.y, r_point.x+POINT_W, r_point.y+POINT_W); //繪制實心矩形 } /********************************************** * 游戲進行時的顯示函數 * 名稱:void view() * 功能:根據蛇的數據,不斷更新繪制,蛇、食物、得分、背景顯示 *********************************************/ void view() { // 清屏 cleardevice(); //加載背景圖片 PIMAGE img; img = newimage(); getimage(img, "C://Users//Administrator//Desktop//圖片//snake.mid!.jpg"); putimage(0,0,img); setcolor(0x00ff00); rectangle(S_POOLX,S_POOLY,E_POOLX,E_POOLY); drawSnake(); drawRandomPoint(); drawScore(600, 100, 80); delimage(img); } /********************************************** * 游戲開始前的界面顯示函數 * 名稱:void welcome() * 功能:繪制游戲開始界面 *********************************************/ void welcome() { //加載背景圖片 PIMAGE img; img = newimage(); getimage(img, "C://Users//Administrator//Desktop//圖片//snake.end!.jpg"); putimage(0,0,img); //打印文字 char s[] = "press any key to start!"; setcolor(0x000000); setfont(20, 0, "幼圓"); setbkmode(TRANSPARENT); outtextxy(250, 350, s); getch(); delimage(img); } /**************************************************** //主循環函數 //名稱:void mainloop() //功能:本函數是程序的核心框架和核心流程 // **************************************************/ void mainloop() { double timeNow = 0, timeBefor = 0; //定義兩個double變量來計算程序運行時間s key_msg k = {0}; welcome(); //程序歡迎界面 while(is_run()) //is_run() 判斷窗口是否關閉 { initSnake(); //初始化 createPoint(); //創建蛇的食物,即一個點 for ( ; is_run(); delay_fps(60) ) { if(isGameOver()) { break; //判斷是否超過邊界或碰到自身 } //處理按鍵操作 while(kbmsg()) { k = getkey(); if(k.msg == key_msg_down) { keyControl(k.key); //根據按鍵值,來變換蛇的運動方向 } } timeNow = fclock(); //獲取當前時間 if((timeNow - timeBefor) >= 0.2 ) //用當前的時間減去上一次記錄的時間如果超過0.2秒則,移動一格。 { sMove(); timeBefor = timeNow; } if(isGetPoint()) //判斷蛇是否遲到食物 { createPoint(); //創建一個新的食物 } view(); //顯示 } againGame(); //是否再來一局 } } int main(void) { //1、點擊右上角X的時候,程序不主動結束,只是將窗口關閉 //2、繪圖更新模式改為手動跟新,僅當調用delay_ms、delay_fps 等這種函數時候,才去更新畫面,避免閃爍 //3、ege 圖形庫的默認設置 setinitmode(INIT_ANIMATION); // 圖形初始化,窗口尺寸800x544 initgraph(WINWIDTH, WINHIGH); //設置窗口的標題 setcaption("貪吃蛇游戲"); // 隨機數初始化,如果需要使用隨機數的話 randomize(); // 程序主循環 mainloop(); // 關閉繪圖設備 closegraph(); return 0; }
以上就是利用C語言實現一個簡單的貪吃蛇小游戲,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。