日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言写个贪吃蛇游戏

發布時間:2023/12/19 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言写个贪吃蛇游戏 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

貪吃蛇是個非常經典的游戲,用C語言來實現也是一個好玩的事情。這個游戲我寫完后放在知乎,竟然點贊的人數超級多。我覺得大家喜歡,一個方面是因為寫得簡單,大家都能看得懂,一個可擴展性還是非常強的。

我試了說一下這個代碼 核心的三個函數

menu();setup();draw();

menu用來設置菜單,也就是我們一運行看到的那個。setup用來設置參數,我們需要設置高度和寬度,還有分數,食物的位置。draw也就是畫,也就是畫整個畫面。

還有一個枚舉類型 這個結構體用來設置蛇的幾個狀態,我覺得這個也是面向對象編程的一個思想,把蛇的狀態都封裝成一個枚舉類型。

typedef enum {STOP = 0,LEFT,RIGHT,UP,DOWN }Direction;

還有

/*判斷貪吃蛇的長度*/ void logic()

這個函數,這個函數應該是整個貪吃蛇的精髓了,要理解代碼怎么把蛇給連接起來。用了點巧妙的東西。

來看這里面的關鍵代碼

/*把上一個位置記下*/int lastX = tailX[0];int lastY = tailY[0];int last2X, last2Y;/*重新獲取當前的位置*/tailX[0]=x;tailY[0]=y;int i=0;/*遍歷整條蛇的長度 把 0 的位置空出來,其余蛇的位置往后面的空間移動*/for(i=1; i<ntail;i++){last2X = tailX[i];last2Y = tailY[i];tailX[i]=lastX;tailY[i]=lastY;lastX = last2X;lastY = last2Y;}

lastX lastY 用來存上一次的蛇頭的位置。后面的 for 循環,通過tail 蛇的長度,把蛇上個狀態給保存到數組tailX tailY里面。

完整代碼

#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <Windows.h> #include <time.h> #include <conio.h> /*鍵盤輸入獲取*/bool gameOver; bool stop = false; bool hit = false; /*游戲的邊框大小*/ const int width = 50; const int height = 20; /*蛇的坐標,食物的坐標還有分數*/ int x,y,fruitX,fruitY,score; /*蛇每個點的坐標*/ int tailX[200],tailY[200]; /*蛇的默認長度*/ int ntail=3;typedef enum {STOP = 0,LEFT,RIGHT,UP,DOWN }Direction;Direction Dir; /*開始菜單*/ void menu() {int a;printf("------------------------------------------------------------------\n");printf("| 貪吃蛇游戲 |\n");printf("| 1) 新游戲 |\n");printf("| 2) 開始邊界 |\n");printf("| 3) 退出游戲 |\n");printf("------------------------------------------------------------------\n");printf("---->請輸入你的選擇:");scanf("%d", &a); }/*初始化狀態*/ void setup() {gameOver = false;/*根據當前時間設置“隨機數種子”*/srand(time(NULL));Dir = STOP;/*貪吃蛇的位置,固定在中間*/x= width/2;y= height/2;/*食物的位置,位置是隨機的*/fruitX = rand()%width;fruitY = rand()%height;score = 0; } /*繪制界面*/ void draw() {if(stop == true){return;}system("cls");/*清除屏幕*/printf("分數:%d",score);printf("\n");/*第一行*/int i;for(i= 0 ;i<width+1;i++){printf("-");}printf("\n");/*畫中間的畫面*/int p;for(p= 0 ;p<height;p++)/*高度*/{int q;for(q= 0 ;q<width;q++)/*寬度*/{/*第一行最后已給字符*/if(q==0 || q==width-1){printf("|");}if(p == fruitY && q == fruitX)/*食物的隨機坐標*/{printf("O");}else{int k=0;bool print = false;/*貪吃蛇的長度 默認長度是 3*/for(k=0;k<ntail;k++){if(tailX[k]==q && tailY[k]==p){printf("*");print = true;}}/*如果這個位置打印了 * 就不要打印空格了*/if(!print){printf(" ");}}}printf("\n");}/*最后一行*/int j;for(j= 0 ;j<width+1;j++){printf("-");}} /*按鍵輸入控制*/ void input() {if(_kbhit()){/*獲取鍵盤的輸入字符*/switch(_getch()){case '4':case 75:/*左鍵*/Dir = LEFT;hit= true;break;case '8':case 72:/*上鍵*/Dir = UP;hit= true;break;case '6':case 77:/*右鍵*/Dir = RIGHT;hit= true;break;case '2':case 80:/*向下鍵盤鍵 */Dir = DOWN;hit= true;break;case 'x':case 27:/*ESE*/gameOver = true;break;case 32:/*空格 暫停鍵*/stop = !stop;break;}}else if(!hit && stop == false)/*如果沒有改變方向*/{x++;} } /*判斷貪吃蛇的長度*/ void logic() {if(stop == true){return;}/*把上一個位置記下*/int lastX = tailX[0];int lastY = tailY[0];int last2X, last2Y;/*重新獲取當前的位置*/tailX[0]=x;tailY[0]=y;int i=0;/*遍歷整條蛇的長度 把 0 的位置空出來,其余蛇的位置往后面的空間移動*/for(i=1; i<ntail;i++){last2X = tailX[i];last2Y = tailY[i];tailX[i]=lastX;tailY[i]=lastY;lastX = last2X;lastY = last2Y;}/*根據方向來改變x y 的值*/switch(Dir){case UP:y--;break;case DOWN:y++;break;case LEFT:x--;break;case RIGHT:x++;break;}if(x<0 || width<x || y<0 || height<y){gameOver = true;/*清除屏幕*/system("cls");printf("------------------------------------------------------------------\n");printf("| |\n");printf("| |\n");printf("| 游戲結束 |\n");printf("| |\n");printf("| |\n");printf("------------------------------------------------------------------\n");}if(x==fruitX && y==fruitY){/*吃了一個食物,蛇的長度增加1*/ntail++;score+=10;/*更新下一個食物的位置*/fruitX = rand()%width;fruitY = rand()%height;} } int main() { #if 0while(1){printf("%d\n",_getch());} #endifmenu();setup();draw();/*循環畫貪吃蛇的界面*/while(!gameOver){draw();input();logic();Sleep(70);}return 0; }

上面這段代碼直接在Dev C++上面應該是可以運行的,很多人在知乎上私信問我,為什么我的貪吃蛇執行不了呢,可能就是平臺不同,少了這個頭文件,少了那個頭文件,但是你為什么不能跟我一樣,用Dev C++呢,輕量級,簡單。

代碼的精髓是什么?

我認為精髓一定是思想,不是你寫了多少行代碼,用了什么高端的IDE。

我自認為我的注釋已經寫得不錯了,所以就沒有什么好說明的了吧,有不明白的把代碼過一下,至于屏幕刷新這個東西,如果只是用時間刷新就會閃屏,所以出現了一個雙緩存,把要顯示的東西送到一個buff里面去,另一個buff用來顯示,這樣就可以保證不會出現閃屏。

除了寫貪吃蛇,可以用這個方法寫其他小程序,挺有意思的。

----END----

往期好文合集

學C/C++語言,32個必備修養!<<戳這里

用覆銅板雕個女朋友。<<戳這里

C語言八大排序算法,附動圖和詳細代碼解釋!<<戳這里

?最 后??

?

若覺得文章不錯,轉發分享,也是我們繼續更新的動力。

5T資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,PCB、FPGA、DSP、labview、單片機、等等

在公眾號內回復「更多資源」,即可免費獲取,期待你的關注~

長按識別圖中二維碼關注

總結

以上是生活随笔為你收集整理的C语言写个贪吃蛇游戏的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。