C語言實現簡單貪吃蛇小遊戲
阿新 • • 發佈:2020-09-11
本文例項為大家分享了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,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 score_size) * 功能:按照引數中的座標和大小顯示 蛇的得分 *********************************************/ void drawScore(int x,int score_size) { char s[10]; setcolor(EGERGB(0x00,0x0,0x0)); //設定字型顏色 setfont(score_size,"幼圓"); //設定字型 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,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,img); //列印文字 char s[] = "press any key to start!"; setcolor(0x000000); setfont(20,"幼圓"); 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; }
素材截圖
(1)welcome.png
(2)game.png
(3)gameover.png
更多有趣的經典小遊戲實現專題,分享給大家:
C++經典小遊戲彙總
python經典小遊戲彙總
python俄羅斯方塊遊戲集合
JavaScript經典遊戲 玩不停
java經典小遊戲彙總
javascript經典小遊戲彙總
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。