项目: 贪吃蛇(C语言)
生活随笔
收集整理的這篇文章主要介紹了
项目: 贪吃蛇(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; }效果圖如下:
五、增加吃食物 分數統計 暫停游戲 等功能
吃食物原理圖:
代碼如下:
效果圖如下:
總結
以上是生活随笔為你收集整理的项目: 贪吃蛇(C语言)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 项目: 空战游戏
- 下一篇: C语言图形化编程 【二】