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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

项目: 贪吃蛇(C语言)

發布時間:2025/3/20 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 项目: 贪吃蛇(C语言) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

項目:貪吃蛇

  • 一、項目描述和最終效果展示
  • 二、生成一個靜態的蛇
  • 三、玩家控制小蛇移動
  • 四、增加判斷失敗功能
  • 五、增加吃食物 分數統計 暫停游戲 等功能

一、項目描述和最終效果展示

項目描述: 玩家通過控制小蛇來吃掉食物

最終效果展示:

二、生成一個靜態的蛇

代碼如下:

#include<stdio.h> #include<stdlib.h> #include<conio.h> #include<Windows.h>#define High 20 #define Width 30 //游戲畫面尺寸//全局變量 int canvas[High][Width]={0}; //二維數組存儲游戲畫布中對應的元素 //0為空格 -1為邊框 1為蛇頭 大于1的為蛇身//定義隱藏光標函數 void HideCursor() {CONSOLE_CURSOR_INFO cursor; cursor.bVisible = FALSE; cursor.dwSize = sizeof(cursor); HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorInfo(handle, &cursor); }void gotoxy(int x,int y)//將光標移動到(x,y)位置 {HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);COORD pos;pos.X=x;pos.Y=y;SetConsoleCursorPosition(handle,pos); }void startup()//數據的初始化 {int i,j;//初始化邊框for(i=0;i<High;i++){canvas[i][0]=-1;canvas[i][Width-1]=-1;}for(j=0;j<Width;j++){canvas[0][j]=-1;canvas[High-1][j]=-1;}//初始化蛇頭位置canvas[High/2][Width/2]=1;//初始化蛇身,畫布中的元素值分別為2,3,4,5等for(i=1;i<=4;i++)canvas[High/2][Width/2-i]=i+1; }void show()//顯示畫面 {int i,j;gotoxy(0,0);//將光標移動到原點位置,以下重畫清屏for(i=0;i<High;i++){for(j=0;j<Width;j++){if(canvas[i][j]==0)printf(" ");//輸出空格else if(canvas[i][j]==-1)printf("#");//輸出邊框else if(canvas[i][j]==1)printf("@");//輸出蛇頭else if(canvas[i][j]>1)printf("*");//輸出蛇身}printf("\n");} }void updateWithoutInput()//與用戶輸入無關的更新 {}void updateWithInput()//與用戶輸入有關的更新 {}int main() {startup();//數據的初始化HideCursor();//隱藏光標while(1){show();//顯示畫面updateWithoutInput();//與用戶輸入無關的更新updateWithInput();//與用戶輸入有關的更新}return 0; }

效果圖如下:

三、玩家控制小蛇移動

小蛇移動原理圖如下:

其他的以此類推

代碼如下:

#include<stdio.h> #include<stdlib.h> #include<conio.h> #include<Windows.h>#define High 20 #define Width 30 //游戲畫面尺寸//全局變量 int moveDirection; //小蛇移動的方向,上 下 左 右 分別用1,2,3,4表示 int canvas[High][Width]={0}; //二維數組存儲游戲畫布中對應的元素 //0為空格 -1為邊框 1為蛇頭 大于1的為蛇身//定義隱藏光標函數 void HideCursor() {CONSOLE_CURSOR_INFO cursor; cursor.bVisible = FALSE; cursor.dwSize = sizeof(cursor); HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorInfo(handle, &cursor); }void gotoxy(int x,int y)//將光標移動到(x,y)位置 {HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);COORD pos;pos.X=x;pos.Y=y;SetConsoleCursorPosition(handle,pos); }void startup()//數據的初始化 {int i,j;//初始化邊框for(i=0;i<High;i++){canvas[i][0]=-1;canvas[i][Width-1]=-1;}for(j=0;j<Width;j++){canvas[0][j]=-1;canvas[High-1][j]=-1;}//初始化蛇頭位置canvas[High/2][Width/2]=1;//初始化蛇身,畫布中的元素值分別為2,3,4,5等for(i=1;i<=4;i++)canvas[High/2][Width/2-i]=i+1;//初始小蛇向右移動moveDirection=4; }void show()//顯示畫面 {int i,j;gotoxy(0,0);//將光標移動到原點位置,以下重畫清屏for(i=0;i<High;i++){for(j=0;j<Width;j++){if(canvas[i][j]==0)printf(" ");//輸出空格else if(canvas[i][j]==-1)printf("#");//輸出邊框else if(canvas[i][j]==1)printf("@");//輸出蛇頭else if(canvas[i][j]>1)printf("*");//輸出蛇身}printf("\n");}Sleep(100); }//移動小蛇 //第一步掃描數組canvas的所有元素,找到正數元素都加1 //找到最大元素(即蛇尾巴)把其變為零 //找到等于2的元素(即蛇頭), //根據輸出的上下方向把對應的另一個像素值設為1(新蛇頭) void moveSnakeByDirection() {int i,j;int oldTail_i,oldTail_j,oldHead_i,oldHead_j;int max=0;for(i=1;i<High-1;i++){for(j=1;j<Width-1;j++){if(canvas[i][j]>0)canvas[i][j]++;}}for(i=1;i<High-1;i++){for(j=1;j<Width-1;j++){if(canvas[i][j]>0){if(max<canvas[i][j])//找到蛇尾{max=canvas[i][j];oldTail_i=i;oldTail_j=j;}if(canvas[i][j]==2)//找到蛇頭{oldHead_i=i;oldHead_j=j;}}}}canvas[oldTail_i][oldTail_j]=0;//將原來的蛇尾置0if(moveDirection==1)//向上移動canvas[oldHead_i-1][oldHead_j]=1;if(moveDirection==2)//向下移動canvas[oldHead_i+1][oldHead_j]=1;if(moveDirection==3)//向左移動canvas[oldHead_i][oldHead_j-1]=1;if(moveDirection==4)//向右移動canvas[oldHead_i][oldHead_j+1]=1; }void updateWithoutInput()//與用戶輸入無關的更新 {moveSnakeByDirection(); }void updateWithInput()//與用戶輸入有關的更新 {char input;if(kbhit())//判斷是否有輸入{input=getch();if(input=='a'||input=='A')//左移{moveDirection=3;moveSnakeByDirection();}else if(input=='d'||input=='D')//右移{moveDirection=4;moveSnakeByDirection();}else if(input=='w'||input=='W')//上移{moveDirection=1;moveSnakeByDirection();}else if(input=='s'||input=='S')//下移{moveDirection=2;moveSnakeByDirection();}} }int main() {startup();//數據的初始化HideCursor();//隱藏光標while(1){show();//顯示畫面updateWithoutInput();//與用戶輸入無關的更新updateWithInput();//與用戶輸入有關的更新}return 0; }

效果圖如下:

四、增加判斷失敗功能

代碼如下:

#include<stdio.h> #include<stdlib.h> #include<conio.h> #include<Windows.h>#define High 20 #define Width 30 //游戲畫面尺寸//全局變量 int moveDirection; //小蛇移動的方向,上 下 左 右 分別用1,2,3,4表示 int canvas[High][Width]={0}; //二維數組存儲游戲畫布中對應的元素 //0為空格 -1為邊框 1為蛇頭 大于1的為蛇身//定義隱藏光標函數 void HideCursor() {CONSOLE_CURSOR_INFO cursor; cursor.bVisible = FALSE; cursor.dwSize = sizeof(cursor); HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorInfo(handle, &cursor); }void gotoxy(int x,int y)//將光標移動到(x,y)位置 {HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);COORD pos;pos.X=x;pos.Y=y;SetConsoleCursorPosition(handle,pos); }void startup()//數據的初始化 {int i,j;//初始化邊框for(i=0;i<High;i++){canvas[i][0]=-1;canvas[i][Width-1]=-1;}for(j=0;j<Width;j++){canvas[0][j]=-1;canvas[High-1][j]=-1;}//初始化蛇頭位置canvas[High/2][Width/2]=1;//初始化蛇身,畫布中的元素值分別為2,3,4,5等for(i=1;i<=4;i++)canvas[High/2][Width/2-i]=i+1;//初始小蛇向右移動moveDirection=4; }void show()//顯示畫面 {int i,j;gotoxy(0,0);//將光標移動到原點位置,以下重畫清屏for(i=0;i<High;i++){for(j=0;j<Width;j++){if(canvas[i][j]==0)printf(" ");//輸出空格else if(canvas[i][j]==-1)printf("#");//輸出邊框else if(canvas[i][j]==1)printf("@");//輸出蛇頭else if(canvas[i][j]>1)printf("*");//輸出蛇身}printf("\n");}Sleep(100); }//移動小蛇 //第一步掃描數組canvas的所有元素,找到正數元素都加1 //找到最大元素(即蛇尾巴)把其變為零 //找到等于2的元素(即蛇頭), //根據輸出的上下方向把對應的另一個像素值設為1(新蛇頭) void moveSnakeByDirection() {int i,j;int oldTail_i,oldTail_j,oldHead_i,oldHead_j;//舊蛇頭蛇尾坐標int newHead_i,newHead_j;//新蛇頭坐標int max=0;for(i=1;i<High-1;i++){for(j=1;j<Width-1;j++){if(canvas[i][j]>0)canvas[i][j]++;}}for(i=1;i<High-1;i++){for(j=1;j<Width-1;j++){if(canvas[i][j]>0){if(max<canvas[i][j])//找到蛇尾{max=canvas[i][j];oldTail_i=i;oldTail_j=j;}if(canvas[i][j]==2)//找到蛇頭{oldHead_i=i;oldHead_j=j;}}}}canvas[oldTail_i][oldTail_j]=0;//將原來的蛇尾置0if(moveDirection==1)//向上移動{newHead_i=oldHead_i-1;newHead_j=oldHead_j;}if(moveDirection==2)//向下移動{newHead_i=oldHead_i+1;newHead_j=oldHead_j;}if(moveDirection==3)//向左移動{newHead_i=oldHead_i;newHead_j=oldHead_j-1;}if(moveDirection==4)//向右移動{newHead_i=oldHead_i;newHead_j=oldHead_j+1;}//小蛇是否和自身碰撞或者和邊框碰撞,游戲失敗if(canvas[newHead_i][newHead_j]>0||canvas[newHead_i][newHead_j]==-1){printf("游戲失敗!\n");exit(0);}else{canvas[newHead_i][newHead_j]=1;} }void updateWithoutInput()//與用戶輸入無關的更新 {moveSnakeByDirection(); }void updateWithInput()//與用戶輸入有關的更新 {char input;if(kbhit())//判斷是否有輸入{input=getch();if(input=='a'||input=='A')//左移{moveDirection=3;moveSnakeByDirection();}else if(input=='d'||input=='D')//右移{moveDirection=4;moveSnakeByDirection();}else if(input=='w'||input=='W')//上移{moveDirection=1;moveSnakeByDirection();}else if(input=='s'||input=='S')//下移{moveDirection=2;moveSnakeByDirection();}} }int main() {startup();//數據的初始化HideCursor();//隱藏光標while(1){show();//顯示畫面updateWithoutInput();//與用戶輸入無關的更新updateWithInput();//與用戶輸入有關的更新}return 0; }

效果圖如下:

五、增加吃食物 分數統計 暫停游戲 等功能

吃食物原理圖:

代碼如下:

#include<stdio.h> #include<stdlib.h> #include<conio.h> #include<Windows.h>#define High 20 #define Width 30 //游戲畫面尺寸//全局變量 int moveDirection; //小蛇移動的方向,上 下 左 右 分別用1,2,3,4表示 int food_x,food_y;//食物的位置 int canvas[High][Width]={0}; //二維數組存儲游戲畫布中對應的元素 //0為空格 -1為邊框 -2為食物 1為蛇頭 大于1的為蛇身 int score=0;//分數//定義隱藏光標函數 void HideCursor() {CONSOLE_CURSOR_INFO cursor; cursor.bVisible = FALSE; cursor.dwSize = sizeof(cursor); HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorInfo(handle, &cursor); }void gotoxy(int x,int y)//將光標移動到(x,y)位置 {HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);COORD pos;pos.X=x;pos.Y=y;SetConsoleCursorPosition(handle,pos); }void startup()//數據的初始化 {int i,j;//初始化邊框for(i=0;i<High;i++){canvas[i][0]=-1;canvas[i][Width-1]=-1;}for(j=0;j<Width;j++){canvas[0][j]=-1;canvas[High-1][j]=-1;}//初始化蛇頭位置canvas[High/2][Width/2]=1;//初始化蛇身,畫布中的元素值分別為2,3,4,5等for(i=1;i<=4;i++)canvas[High/2][Width/2-i]=i+1;//初始小蛇向右移動moveDirection=4;food_x=rand()%(High-5)+2;food_y=rand()%(Width-5)+2;canvas[food_x][food_y]=-2; }void show()//顯示畫面 {int i,j;gotoxy(0,0);//將光標移動到原點位置,以下重畫清屏for(i=0;i<High;i++){for(j=0;j<Width;j++){if(canvas[i][j]==0)printf(" ");//輸出空格else if(canvas[i][j]==-1)printf("#");//輸出邊框else if(canvas[i][j]==1)printf("@");//輸出蛇頭else if(canvas[i][j]>1)printf("*");//輸出蛇身else if(canvas[i][j]==-2)printf("F");//輸出食物}printf("\n");}printf("分數:%d\n",score);printf("按空格鍵游戲暫停\n");Sleep(100); }//移動小蛇 //第一步掃描數組canvas的所有元素,找到正數元素都加1 //找到最大元素(即蛇尾巴)把其變為零 //找到等于2的元素(即蛇頭), //根據輸出的上下方向把對應的另一個像素值設為1(新蛇頭) void moveSnakeByDirection() {int i,j;int oldTail_i,oldTail_j,oldHead_i,oldHead_j;//舊蛇頭蛇尾坐標int newHead_i,newHead_j;//新蛇頭坐標int max=0;for(i=1;i<High-1;i++){for(j=1;j<Width-1;j++){if(canvas[i][j]>0)canvas[i][j]++;}}for(i=1;i<High-1;i++){for(j=1;j<Width-1;j++){if(canvas[i][j]>0){if(max<canvas[i][j])//找到蛇尾{max=canvas[i][j];oldTail_i=i;oldTail_j=j;}if(canvas[i][j]==2)//找到蛇頭{oldHead_i=i;oldHead_j=j;}}}}if(moveDirection==1)//向上移動{newHead_i=oldHead_i-1;newHead_j=oldHead_j;}if(moveDirection==2)//向下移動{newHead_i=oldHead_i+1;newHead_j=oldHead_j;}if(moveDirection==3)//向左移動{newHead_i=oldHead_i;newHead_j=oldHead_j-1;}if(moveDirection==4)//向右移動{newHead_i=oldHead_i;newHead_j=oldHead_j+1;}//如果新蛇頭吃到食物if(canvas[newHead_i][newHead_j]==-2){canvas[food_x][food_y]=0;score++;//產生一個新的食物do{food_x=rand()%(High-5)+2;food_y=rand()%(Width-5)+2;}while(canvas[food_x][food_y]!=0);//產生的食物的位置不能和蛇身重合canvas[food_x][food_y]=-2;//原來的舊蛇尾留著,長度自動加1}else//否則,原來的舊蛇尾剪掉,保持長度不變canvas[oldTail_i][oldTail_j]=0;//小蛇是否和自身碰撞或者和邊框碰撞,游戲失敗if(canvas[newHead_i][newHead_j]>0||canvas[newHead_i][newHead_j]==-1){printf("游戲失敗!\n");exit(0);}else{canvas[newHead_i][newHead_j]=1;} }void updateWithoutInput()//與用戶輸入無關的更新 {moveSnakeByDirection(); }void updateWithInput()//與用戶輸入有關的更新 {char input;if(kbhit())//判斷是否有輸入{input=getch();if(input=='a'||input=='A')//左移{moveDirection=3;moveSnakeByDirection();}else if(input=='d'||input=='D')//右移{moveDirection=4;moveSnakeByDirection();}else if(input=='w'||input=='W')//上移{moveDirection=1;moveSnakeByDirection();}else if(input=='s'||input=='S')//下移{moveDirection=2;moveSnakeByDirection();}else if(input==' ')//暫停{while(1){input=getch();if(input==' ')break;}}} }int main() {startup();//數據的初始化HideCursor();//隱藏光標while(1){show();//顯示畫面updateWithoutInput();//與用戶輸入無關的更新updateWithInput();//與用戶輸入有關的更新}return 0; }

效果圖如下:

總結

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

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